Implement fully automated Jenkins HW8 setup with Ansible, JCasC and JJB
This commit is contained in:
@@ -1,59 +1,140 @@
|
||||
# OTUS Homework 8: Jenkins Jobs
|
||||
# OTUS HW8: Jenkins + Ansible + JJB + Docker Slaves
|
||||
|
||||
Проект поднимает Jenkins и отдельный Docker daemon (`docker:dind`) в Docker и автоматически создает 2 job:
|
||||
- `selenium-tests` для Selenium/Selenide тестов по Otus с выбором браузера;
|
||||
- `mobile-appium-tests` для Appium тестов мобильного приложения с Allure-отчетом.
|
||||
Полностью автоматизированный проект для ДЗ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.
|
||||
|
||||
## Что входит в проект
|
||||
- `Dockerfile`, `docker-compose.yml` — Jenkins с предустановленными инструментами и отдельным Docker daemon для job.
|
||||
- `init.groovy.d/` — автосоздание пользователя `admin/admin`, job и Allure CLI.
|
||||
- `jobs/selenium-tests.xml` — job для `https://git.kovbasa.ru/otus-autotests/homework_4.git`.
|
||||
- `jobs/mobile-appium-tests.xml` — job для `https://git.kovbasa.ru/otus-autotests/homework_7.git`.
|
||||
Проект использует локальные домашки из корня:
|
||||
- `C:/Users/spawn/IdeaProjects/otus-autotests/homework_4` (Selenium + Citrus);
|
||||
- `C:/Users/spawn/IdeaProjects/otus-autotests/hw7` (Appium).
|
||||
|
||||
## Требования
|
||||
- Docker и Docker Compose.
|
||||
- Доступ Jenkins-контейнера в интернет для клонирования репозиториев и загрузки Maven dependencies.
|
||||
- Для Appium job:
|
||||
- доступ к БД `jdbc:postgresql://sql.otus.kartushin.su:5432/wishlist`;
|
||||
- хост, на котором Docker может поднять `budtmo/docker-android`.
|
||||
## Что развертывается
|
||||
|
||||
## Запуск
|
||||
1. Поднять Jenkins:
|
||||
### Сервисы (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
|
||||
docker compose up -d --build
|
||||
cd C:/Users/spawn/IdeaProjects/otus-autotests/hw8
|
||||
```
|
||||
2. Открыть `http://localhost:8081`.
|
||||
3. Войти под `admin` / `admin`.
|
||||
4. Убедиться, что автоматически созданы job:
|
||||
- `selenium-tests`
|
||||
- `mobile-appium-tests`
|
||||
|
||||
Jenkins job запускают Docker не через сокет хоста, а через отдельный сервис `docker`. Это нужно, чтобы mobile job корректно работала с файлами из Jenkins workspace.
|
||||
### 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`.
|
||||
|
||||
## Запуск job
|
||||
### 3. Запустить полный деплой playbook
|
||||
```bash
|
||||
ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml
|
||||
```
|
||||
|
||||
### selenium-tests
|
||||
Запускать через **Build with Parameters**. Рабочие значения по умолчанию:
|
||||
- `REPO_URL=https://git.kovbasa.ru/otus-autotests/homework_4.git`
|
||||
- `BRANCH=master`
|
||||
- `BROWSER=chrome`
|
||||
- `EXECUTION_MODE=local`
|
||||
- `HEADLESS=true`
|
||||
Если запускаете из 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"
|
||||
```
|
||||
|
||||
### mobile-appium-tests
|
||||
Запускать через **Build with Parameters**. Рабочие значения по умолчанию:
|
||||
- `REPO_URL=https://git.kovbasa.ru/otus-autotests/homework_7.git`
|
||||
- `BRANCH=master`
|
||||
- `DB_URL=jdbc:postgresql://sql.otus.kartushin.su:5432/wishlist`
|
||||
- `DB_USER=student`
|
||||
- `APPIUM_URL=http://docker:4723`
|
||||
### 4. Открыть Jenkins
|
||||
- через nginx: `http://localhost:8088`
|
||||
- напрямую: `http://localhost:8081`
|
||||
|
||||
Обязательно заполнить:
|
||||
- `DB_PASSWORD`
|
||||
Логин/пароль: из `compose/.env` (`JENKINS_ADMIN_ID`, `JENKINS_ADMIN_PASSWORD`).
|
||||
|
||||
Опционально:
|
||||
- `APP_URL` — если задан, APK будет скачан автоматически; если пусто, используется APK из репозитория `homework_7`.
|
||||
## Как запускать тесты
|
||||
|
||||
## Результат
|
||||
- Allure-отчет публикуется в каждой job после завершения билда.
|
||||
- XML job лежат в каталоге `jobs/` и могут быть выданы как результат домашнего задания.
|
||||
### Рекомендуемый запуск
|
||||
Запустить `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
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user