# OTUS HW8: Jenkins + Ansible + JJB + Docker Slaves Полностью автоматизированный проект для ДЗ8: - Jenkins в Docker; - reverse proxy (Nginx); - локальный Docker Registry; - docker-slaves (агенты Jenkins); - Jenkins Job Builder (JJB) для автоматического создания/обновления job; - Ansible playbook для раскатки всего с нуля; - 6 готовых job, включая runner с параллельным запуском тестов; - Allure-отчеты для Selenium и Appium job. Проект использует локальные домашки из корня: - `C:/Users/spawn/IdeaProjects/otus-autotests/homework_4` (Selenium + Citrus); - `C:/Users/spawn/IdeaProjects/otus-autotests/hw7` (Appium). ## Что развертывается ### Сервисы (Docker Compose) - `registry` (`localhost:5005`) — хранение образов тестов и слейвов. - `jenkins` (`localhost:8081`) — Jenkins controller (JCasC). - `nginx` (`localhost:8088`) — внешний вход в Jenkins. - `agent-maven` — swarm-agent с label `maven docker`. - `agent-jjb` — swarm-agent с label `jjb docker`. - `jobs_uploader` — one-shot контейнер, который накатывает job через `jenkins-jobs update`. ### Автоматизация (Ansible) Playbook: 1. Поднимает `registry + jenkins + nginx`. 2. Ждет готовности Jenkins. 3. Собирает и пушит в registry все нужные образы: - `localhost:5005/otus/slave-maven:1.0.0` - `localhost:5005/otus/slave-jjb:1.0.0` - `localhost:5005/otus/test-selenium:1.0.0` - `localhost:5005/otus/test-api:1.0.0` - `localhost:5005/otus/test-mobile:1.0.0` 4. Поднимает слейвы. 5. Накатывает все job через JJB. По умолчанию UI через nginx опубликован на `8088`, чтобы не конфликтовать с Selenoid UI из `homework_4` (часто занимает `8080`). ## 6 Jenkins job 1. `jobs-uploader` — обновление всех job из `hw8/config/jobs`. 2. `infra-health-check` — проверка инфраструктуры и образов. 3. `qa-selenium-tests` — Selenium/Selenide (browser parameter + Allure). 4. `qa-mobile-appium-tests` — Appium (APP_URL для автоскачивания APK + Allure). 5. `qa-api-citrus-tests` — API (citrus-tests). 6. `qa-runner` — запускает `qa-selenium-tests`, `qa-mobile-appium-tests`, `qa-api-citrus-tests` параллельно. Есть вьюхи: - `DevOps`; - `QA`. ## Важные требования окружения - Docker + Docker Compose V2. - Ansible. - Linux/WSL2 host для mobile-части (желательно с `/dev/kvm` для эмуляторов `budtmo/docker-android`). - Доступ к БД для `hw7` (`DB_URL/DB_USER/DB_PASSWORD`). ## Быстрый старт с нуля ### 1. Перейти в `hw8` ```bash cd C:/Users/spawn/IdeaProjects/otus-autotests/hw8 ``` ### 2. Подготовить `.env` для compose ```bash cp compose/.env.example compose/.env ``` Обязательно заполните в `compose/.env`: - `JENKINS_ADMIN_ID`, `JENKINS_ADMIN_PASSWORD`; - `MOBILE_DB_PASSWORD` (если не хотите передавать `DB_PASSWORD` руками в параметрах job); - при необходимости `NGINX_PORT` и `JENKINS_URL_PUBLIC`. ### 3. Запустить полный деплой playbook ```bash ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml ``` Если запускаете из Windows PowerShell без установленного Ansible: ```powershell wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/hw8 && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml" ``` ### 4. Открыть Jenkins - через nginx: `http://localhost:8088` - напрямую: `http://localhost:8081` Логин/пароль: из `compose/.env` (`JENKINS_ADMIN_ID`, `JENKINS_ADMIN_PASSWORD`). ## Как запускать тесты ### Рекомендуемый запуск Запустить `qa-runner` через **Build with Parameters**. ### Selenium отдельно Запустить `qa-selenium-tests`: - `BROWSER`: `chrome|firefox`; - `HEADLESS`: `true|false`. ### Appium отдельно Запустить `qa-mobile-appium-tests`: - `DB_PASSWORD` (по умолчанию `student`, если пусто — берется из env `MOBILE_DB_PASSWORD` Jenkins controller); - `APP_URL` по умолчанию: `http://wiremock:8080/wishlist.apk`. - дефолтные пароли тест-аккаунтов из `hw7`: `user1us/user2us/user3us` (соответствуют логинам). `APP_URL` передается в capability `app`, поэтому APK скачивается автоматически Appium-сервером эмулятора. ## Отчеты - `qa-selenium-tests` публикует Allure + JUnit. - `qa-mobile-appium-tests` публикует Allure + JUnit. - артефакты `target/**` архивируются в Jenkins. ## Структура проекта - `ansible/` — playbook раскатки/удаления. - `compose/` — инфраструктура Jenkins (compose, Dockerfile, JCasC, nginx, jobs_uploader). - `compose/images/` — Dockerfile для слейвов и test-runner образов. - `config/jobs/` — JJB YAML + Groovy pipeline scripts + views. ## Повторное обновление job 1. Через Jenkins job `jobs-uploader`, либо 2. Ручным one-shot: ```bash docker compose -f compose/docker-compose.yml --env-file compose/.env run --rm jobs_uploader ``` ## Полное удаление стенда ```bash ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml ``` ## Чистый повторный запуск (reset + deploy) ```bash ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml ```