# 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:///` - WebDriver: `http:///wd/hub` ## Версии в проекте Настройки лежат в `ansible/inventory/group_vars/all.yml`. Браузеры: - Chrome: `128.0`, `127.0` - Firefox: `125.0`, `124.0` Образы инфраструктуры: - `aerokube/selenoid:1.11.3` - `aerokube/selenoid-ui:1.10.11` - `aerokube/ggr:1.7.2` - `aerokube/ggr-ui:latest-release` - `nginx:1.28.2` ## Что нужно подготовить перед запуском На каждой VM должен быть пользователь `ansible`: - вход по SSH-ключу; - `sudo` без пароля (`NOPASSWD`). Ниже один простой вариант первичной подготовки VM. 1. На локальной машине генерирую ключи (если их еще нет): ```bash ssh-keygen -f ~/.ssh/id_ed25519 ``` 2. Захожу на VM под `root`: ```bash ssh root@10.10.2.127 ``` 3. Под `root` создаю пользователя `ansible`, добавляю в `sudo` и в `sudoers`: ```bash 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 ``` 4. Под `root` кладу публичный ключ в профиль `ansible`: ```bash install -d -m 700 -o ansible -g ansible /home/ansible/.ssh cat >> /home/ansible/.ssh/authorized_keys ``` После запуска этой команды вставляю содержимое `~/.ssh/id_ed25519.pub`, затем `Ctrl+D`. 5. Под `root` выставляю права: ```bash chown ansible:ansible /home/ansible/.ssh/authorized_keys chmod 600 /home/ansible/.ssh/authorized_keys ``` 6. Проверяю вход под `ansible`: ```bash ssh -i ~/.ssh/id_ed25519 ansible@10.10.2.127 "whoami && sudo -n true && echo sudo_ok" ``` ## Как добавить новые VM 1. Добавляю хост в `ansible/inventory/hosts.ini`. 2. Создаю `ansible/inventory/host_vars/vmN.yml`: ```yaml ansible_host: ansible_user: ansible ggr_selenoid_host_override: selenoid ``` ## Запуск Ansible В PowerShell синтаксис `VAR=value command` не работает, поэтому запускаю через `wsl bash -lc`. Важно: `--limit` должен быть внутри кавычек команды. ### localhost (WSL) ```powershell 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 ```powershell 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 ```powershell 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-профиле: ```bash 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) ```bash mvn "-Dexecution.mode=selenoid" "-Dbrowser=chrome" "-Dbrowser.version=128.0" "-Dselenoid.url=http://10.10.2.112/wd/hub" test ``` ### Конкретный UI-тест ```bash 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 ```bash mvn "-Dexecution.mode=selenoid" "-Dbrowser=mobile_chrome" "-Dbrowser.version=128.0" "-Dselenoid.url=http://10.10.2.112/wd/hub" test ``` ### Firefox ```bash 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; ```bash mvn -f citrus-tests/pom.xml test ``` ### Запуск тестов через Ansible ```powershell 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: ```bash cd ansible ANSIBLE_ROLES_PATH=./roles ansible-playbook -i inventory/hosts.ini playbooks/site.yml --limit vm1 ```