feat: finalize projectwork CI jobs, docs and test integration

This commit is contained in:
2026-04-23 11:39:08 +03:00
parent 737bddd631
commit 20bdacf5c5
39 changed files with 1819 additions and 70 deletions
+56 -31
View File
@@ -1,18 +1,23 @@
# OTUS HW8: Jenkins + Ansible + JJB + Docker
# OTUS ProjectWork: Jenkins + Ansible + JJB + Docker
Полностью автоматизированная раскатка ДЗ8:
Полностью автоматизированная раскатка проектной работы:
- Jenkins controller в Docker;
- reverse proxy Nginx;
- локальный Docker Registry;
- Jenkins agents (docker slaves);
- Jenkins Job Builder (JJB), без ручного создания job;
- Ansible для полного подъема/сноса стенда;
- 6 job (runner + uploader + 3 тестовые + infra check);
- Allure отчеты для UI и mobile.
- Selenoid + Selenoid UI;
- расширенный набор job (web/api/mobile + runner + uploader + infra check);
- Allure отчеты для всех контуров.
Тестовые проекты всегда берутся из Git в runtime:
- `homework_4` (Selenium + API Citrus);
- `homework_7` (Appium, APK скачивается автоматически через `APP_URL`).
Тестовые проекты берутся из Git в runtime:
- `homework_1` (`main`, `homework_2`) - WEB BDD/Cucumber;
- `hw3` - API REST;
- `homework_4` - Selenium + API Citrus;
- `hw3` (`homework_5`) - HW5 как ветка в репозитории `hw3` (job `qa-maven-extra-tests`);
- `homework_6` - Playwright;
- `homework_7` - Appium, APK скачивается автоматически через `APP_URL`;
## Что поднимается
@@ -20,20 +25,27 @@
- 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 идут только на агентах.
## 6 job
## Набор job
1. `jobs-uploader` - накатывает/обновляет job через JJB.
2. `infra-health-check` - проверка Jenkins/Registry/образов/агентов.
3. `qa-selenium-tests` - Selenium/Selenide с выбором браузера.
4. `qa-api-citrus-tests` - API тесты.
5. `qa-mobile-appium-tests` - Appium тесты, APK через `APP_URL`.
6. `qa-runner` - параллельный запуск `selenium + api + mobile`.
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`
@@ -59,7 +71,7 @@
Подготовка:
```bash
cd /path/to/hw8
cd /path/to/projectwork
cp compose/.env.example compose/.env
```
@@ -77,10 +89,10 @@ ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml -e jo
`wsl`:
```powershell
wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/hw8 && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml -e jobs_profile=devops"
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/hw8/config/jobs`) и получаете QA job.
После этого запускаете `jobs-uploader` (дефолт `JJB_PATH=/workspace/projectwork/config/jobs`) и получаете QA job.
### Вариант 2: сразу все job
@@ -91,7 +103,7 @@ ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml
`wsl`:
```powershell
wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/hw8 && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml"
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).
@@ -100,56 +112,67 @@ wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/hw8 && ansible-p
Рекомендуемый вход: `QA-Runner` -> `qa-runner` -> `Build with Parameters`.
`qa-runner` запускает в параллели:
- `qa-selenium-tests`
- `qa-api-citrus-tests`
- `qa-mobile-appium-tests`
И всегда публикует `runner-summary.txt` с:
`qa-runner` запускает в параллели все контуры и всегда публикует `runner-summary.txt` с:
- номерами дочерних сборок;
- статусами;
- ссылками на каждую дочернюю job.
Для BDD по умолчанию запускаются обе ветки из `homework_1`: `main` и `homework_2` (`BDD_REFS=main,homework_2`).
## Отчетность
`qa-selenium-tests` и `qa-mobile-appium-tests` публикуют:
Все тестовые job публикуют:
- Allure report (`/allure`);
- JUnit результаты;
- `run-info.txt`;
- `target/**` артефакты (включая скриншоты/логи тестового проекта, если они туда пишутся).
- для mobile дополнительно сохраняются `project/target/mobile-debug/*` (`docker logs` и `docker inspect` эмуляторов/сети).
- для mobile параметр `SUREFIRE_RERUN_FAILING` (по умолчанию `1`) снижает flaky-падения Appium-сессий без правок кода HW7.
- `target/**` артефакты (или аналогичные артефакты проекта).
Дополнительно в Allure:
- `environment.properties`
- `executor.json`
- `categories.json`
- `categories.json` (там, где применимо)
Также в `currentBuild.description` пишется, кто запустил job и ключевые параметры.
Для `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/hw8 && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml"
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/hw8 && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/down.yml && ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml"
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`).
@@ -157,7 +180,9 @@ wsl bash -lc "cd /mnt/c/Users/spawn/IdeaProjects/otus-autotests/hw8 && ansible-p
## Где что лежит
- `ansible/` - playbook раскатки/удаления
- `compose/` - инфраструктура Jenkins/agents/registry/nginx
- `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)