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- API REST;homework_4- Selenium + API Citrus;hw3(homework_5) - HW5 как ветка в репозиторииhw3(jobqa-maven-extra-tests);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_uploadercontainer
Контроллер не исполняет сборки (numExecutors: 0, mode EXCLUSIVE), все job идут только на агентах.
Набор job
jobs-uploader- накатывает/обновляет job через JJB.infra-health-check- проверка Jenkins/Registry/образов/агентов.qa-runner- оркестратор параллельного запуска всех тестовых контуров (cron:15 1 * * *).qa-selenium-testsqa-web-bdd-testsqa-api-citrus-testsqa-api-contract-testsqa-api-rest-testsqa-playwright-testsqa-maven-extra-testsqa-mobile-appium-tests
Вьюхи в Jenkins:
DevOpsQA-RunnerQA-Testsall
Варианты раскатки job
Реализованы 2 режима через jobs_profile:
devops- толькоjobs-uploaderиinfra-health-checkfull- весь набор job (режим по умолчанию)
Требования
- Docker + Docker Compose V2
- Ansible (в Linux/WSL)
- доступ в интернет для pull базовых образов и maven dependencies
- для mobile: Linux/WSL2 с
/dev/kvm(желательно для стабильной эмуляции)
Запуск с нуля
Подготовка:
cd /path/to/projectwork
cp compose/.env.example compose/.env
Минимум заполнить в compose/.env:
JENKINS_ADMIN_IDJENKINS_ADMIN_PASSWORDMOBILE_DB_PASSWORD
Вариант 1: только DevOps
bash:
ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml -e jobs_profile=devops
wsl:
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:
ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml
wsl:
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.propertiesexecutor.jsoncategories.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:
ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml
wsl:
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:
ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml
ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml
wsl:
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/selenoidcompose/images/- Dockerfile для агентов и test-runner образовconfig/jobs/- full JJB (DevOps + QA)config/jobs-devops/- JJB профиль только для DevOps jobconfig/wiremock/- маппинги для контрактных API тестовcontracts-tests/- API контрактные тесты (JsonSchemaValidation)