150 lines
5.4 KiB
Markdown
150 lines
5.4 KiB
Markdown
# 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.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: <ip>
|
||
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
|
||
```
|