OTUS Homework 4: Selenoid + GGR + Nginx
В этом проекте я собрал инфраструктуру для запуска UI-тестов через Selenoid и добавил Ansible-деплой для локального стенда и удаленных VM.
Что реализовано
- UI-тесты из HW1 запускаются через удаленный
RemoteWebDriver(Selenoid). - Поддержаны браузеры:
chrome,firefox,mobile_chrome. - Подняты сервисы:
selenoid,selenoid-ui,ggr,nginx. - Один inventory для всех стендов:
localhost(WSL),vm1,vm2.
Точки доступа:
- UI:
http://<host_ip>/ - WebDriver:
http://<host_ip>/wd/hub
Версии в проекте
Настройки лежат в ansible/inventory/group_vars/all.yml.
Браузеры:
- Chrome:
128.0,127.0 - Firefox:
125.0,124.0
Образы инфраструктуры:
aerokube/selenoid:1.11.3aerokube/selenoid-ui:1.10.11aerokube/ggr:1.7.2aerokube/ggr-ui:latest-releasenginx:1.28.2
Что нужно подготовить перед запуском
На каждой VM должен быть пользователь ansible:
- вход по SSH-ключу;
sudoбез пароля (NOPASSWD).
Ниже один простой вариант первичной подготовки VM.
- На локальной машине генерирую ключи (если их еще нет):
ssh-keygen -f ~/.ssh/id_ed25519
- Захожу на VM под
root:
ssh root@10.10.2.127
- Под
rootсоздаю пользователяansible, добавляю вsudoи вsudoers:
useradd -m -s /bin/bash ansible
usermod -aG sudo ansible
echo "ansible ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible
chmod 440 /etc/sudoers.d/ansible
- Под
rootкладу публичный ключ в профильansible:
install -d -m 700 -o ansible -g ansible /home/ansible/.ssh
cat >> /home/ansible/.ssh/authorized_keys
После запуска этой команды вставляю содержимое ~/.ssh/id_ed25519.pub, затем Ctrl+D.
- Под
rootвыставляю права:
chown ansible:ansible /home/ansible/.ssh/authorized_keys
chmod 600 /home/ansible/.ssh/authorized_keys
- Проверяю вход под
ansible:
ssh -i ~/.ssh/id_ed25519 ansible@10.10.2.127 "whoami && sudo -n true && echo sudo_ok"
Как добавить новые VM
- Добавляю хост в
ansible/inventory/hosts.ini. - Создаю
ansible/inventory/host_vars/vmN.yml:
ansible_host: <ip>
ansible_user: ansible
ggr_selenoid_host_override: selenoid
Запуск Ansible
В PowerShell синтаксис VAR=value command не работает, поэтому запускаю через wsl bash -lc.
Важно: --limit должен быть внутри кавычек команды.
localhost (WSL)
wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/homework_1/ansible && ANSIBLE_ROLES_PATH=./roles ansible-playbook -i inventory/hosts.ini playbooks/site.yml --limit localhost"
VM1
wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/homework_1/ansible && ANSIBLE_ROLES_PATH=./roles ansible-playbook -i inventory/hosts.ini playbooks/site.yml --limit vm1"
VM2
wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/homework_1/ansible && ANSIBLE_ROLES_PATH=./roles ansible-playbook -i inventory/hosts.ini playbooks/site.yml --limit vm2"
Если ключ используется из /mnt/c/..., в WSL может быть ошибка UNPROTECTED PRIVATE KEY FILE.
Я использую копию ключа в WSL-профиле:
mkdir -p ~/.ssh
cp /mnt/c/Users/spawn/.ssh/id_ed25519 ~/.ssh/id_ed25519
cp /mnt/c/Users/spawn/.ssh/id_ed25519.pub ~/.ssh/id_ed25519.pub
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
Команды для запуска тестов
Все UI-тесты (Chrome)
mvn "-Dexecution.mode=selenoid" "-Dbrowser=chrome" "-Dbrowser.version=128.0" "-Dselenoid.url=http://10.10.2.112/wd/hub" test
Конкретный UI-тест
mvn "-Dexecution.mode=selenoid" "-Dbrowser=chrome" "-Dbrowser.version=128.0" "-Dselenoid.url=http://10.10.2.112/wd/hub" "-Dtest=ru.kovbasa.tests.CourseSearchTest" test
Mobile Chrome
mvn "-Dexecution.mode=selenoid" "-Dbrowser=mobile_chrome" "-Dbrowser.version=128.0" "-Dselenoid.url=http://10.10.2.112/wd/hub" test
Firefox
mvn "-Dexecution.mode=selenoid" "-Dbrowser=firefox" "-Dbrowser.version=125.0" "-Dselenoid.url=http://10.10.2.112/wd/hub" test
Citrus (HW3 API)
Citrus: вынесен в отдельный модуль citrus-tests, реализовано на базе HW3;
mvn -f citrus-tests/pom.xml test
Запуск тестов через Ansible
wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/homework_1/ansible && ANSIBLE_ROLES_PATH=./roles ansible-playbook -i inventory/hosts.ini playbooks/site.yml --limit vm1 -e run_tests_via_ansible=true"
Запуск с Linux/macOS
На Linux/macOS:
cd ansible
ANSIBLE_ROLES_PATH=./roles ansible-playbook -i inventory/hosts.ini playbooks/site.yml --limit vm1