# OTUS ProjectWork: Jenkins + Ansible + JJB + Docker Полностью автоматизированная раскатка проектной работы: - Jenkins controller в Docker; - reverse proxy Nginx; - локальный Docker Registry; - Jenkins agents (docker slaves); - Jenkins Job Builder (JJB), без ручного создания job; - Ansible для полного подъема/сноса стенда; - Selenoid + Selenoid UI; - расширенный набор job (web/api/mobile + runner + uploader + infra check); - Allure отчеты для всех контуров. Тестовые проекты берутся из Git в runtime: - `homework_1` (`main`, `homework_2`) - WEB BDD/Cucumber; - `hw3` (`main`, `homework_5`) - API REST + HW5; - `homework_4` - Selenium + API Citrus; - `homework_6` - Playwright; - `homework_7` - Appium, APK скачивается автоматически через `APP_URL`; ## Что поднимается Сервисы: - Jenkins: `http://localhost:8081` - Jenkins через Nginx: `http://localhost:8088` - Registry: `http://localhost:5005/v2/` - Selenoid: `http://localhost:4444/wd/hub` - Selenoid UI: `http://localhost:8089` - Agent `maven` (docker label: `maven docker`) - Agent `jjb` (docker label: `jjb docker`) - one-shot `jobs_uploader` container Контроллер не исполняет сборки (`numExecutors: 0`, mode `EXCLUSIVE`), все job идут только на агентах. ## Набор job 1. `jobs-uploader` - накатывает/обновляет job через JJB. 2. `infra-health-check` - проверка Jenkins/Registry/образов/агентов. 3. `qa-runner` - оркестратор параллельного запуска всех тестовых контуров (cron: `15 1 * * *`). 4. `qa-selenium-tests` 5. `qa-web-bdd-tests` 6. `qa-api-citrus-tests` 7. `qa-api-contract-tests` 8. `qa-api-rest-tests` 9. `qa-playwright-tests` 10. `qa-maven-extra-tests` 11. `qa-mobile-appium-tests` Вьюхи в Jenkins: - `DevOps` - `QA-Runner` - `QA-Tests` - `all` ## Варианты раскатки job Реализованы 2 режима через `jobs_profile`: - `devops` - только `jobs-uploader` и `infra-health-check` - `full` - весь набор job (режим по умолчанию) ## Требования - Docker + Docker Compose V2 - Ansible (в Linux/WSL) - доступ в интернет для pull базовых образов и maven dependencies - для mobile: Linux/WSL2 с `/dev/kvm` (желательно для стабильной эмуляции) ## Запуск с нуля Подготовка: ```bash cd /path/to/projectwork cp compose/.env.example compose/.env ``` Минимум заполнить в `compose/.env`: - `JENKINS_ADMIN_ID` - `JENKINS_ADMIN_PASSWORD` - `MOBILE_DB_PASSWORD` ### Вариант 1: только DevOps `bash`: ```bash ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml -e jobs_profile=devops ``` `wsl`: ```powershell wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/projectwork && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml -e jobs_profile=devops" ``` После этого запускаете `jobs-uploader` (дефолт `JJB_PATH=/workspace/projectwork/config/jobs`) и получаете QA job. ### Вариант 2: сразу все job `bash`: ```bash ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml ``` `wsl`: ```powershell wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/projectwork && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml" ``` Примечание: можно запускать и без `-e jobs_profile=full` — по умолчанию в `site.yml` используется профиль `full` (раскатываются все job). ## Запуск тестов Рекомендуемый вход: `QA-Runner` -> `qa-runner` -> `Build with Parameters`. `qa-runner` запускает в параллели все контуры и всегда публикует `runner-summary.txt` с: - номерами дочерних сборок; - статусами; - ссылками на каждую дочернюю job. Для BDD по умолчанию запускаются обе ветки из `homework_1`: `main` и `homework_2` (`BDD_REFS=main,homework_2`). ## Отчетность Все тестовые job публикуют: - Allure report (`/allure`); - JUnit результаты; - `run-info.txt`; - `target/**` артефакты (или аналогичные артефакты проекта). Дополнительно в Allure: - `environment.properties` - `executor.json` - `categories.json` (там, где применимо) Для `qa-selenium-tests` и `qa-web-bdd-tests`: - включен сбор всех новых mp4 из Selenoid за прогон; - видео прикладываются в Allure через external attachments. Для `qa-playwright-tests`: - по умолчанию используется `mcr.microsoft.com/playwright/java:v1.58.0-jammy` (`PLAYWRIGHT_DOCKER_IMAGE`). Для `qa-mobile-appium-tests`: - перед запуском синхронизируются `wiremock/mappings` и `wiremock/__files/wishlist.apk` в контейнер; - проверяется доступность `APP_URL` изнутри эмулятора; - сохраняются `project/target/mobile-debug/*`. `qa-runner` завершает сборку как `UNSTABLE`, если падают только UI-контуры (`qa-selenium-tests`, `qa-web-bdd-tests`, `qa-playwright-tests`). Для остальных контуров падение блокирующее (`FAILURE`). ## Команды для повторного запуска с нуля Снести все: `bash`: ```bash ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml ``` `wsl`: ```powershell wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/projectwork && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml" ``` Полный reset + deploy: По умолчанию эта команда раскатывает профиль `full` (все job: DevOps + QA), так как в `ansible/playbooks/site.yml` задано `jobs_profile | default('full')`. `bash`: ```bash ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml ``` `wsl`: ```powershell wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/projectwork && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml" ``` Если нужен только профиль `devops`, добавьте `-e jobs_profile=devops` во вторую команду (`site.yml`). ## Где что лежит - `ansible/` - playbook раскатки/удаления - `compose/` - инфраструктура Jenkins/agents/registry/nginx/selenoid - `compose/images/` - Dockerfile для агентов и test-runner образов - `config/jobs/` - full JJB (DevOps + QA) - `config/jobs-devops/` - JJB профиль только для DevOps job - `config/wiremock/` - маппинги для контрактных API тестов - `contracts-tests/` - API контрактные тесты (JsonSchemaValidation)