CI/CD Pipeline: anime-backlog-web (in Russian)

Written by skeirss

CI/CD Pipeline: anime-backlog-web

О проекте

anime-backlog-web — самописное приложение для отслеживания аниме-тайтлов, состоящее из отдельных Docker-контейнеров:

  • Backend — Python
  • Frontend — Node.js / Next.js
  • База данных — PostgreSQL

1. Подготовка инфраструктуры

Terraform

С помощью Terraform создаётся виртуальная машина в Yandex Cloud. В главном конфигурационном файле запрашиваются:

  • 1 загрузочный диск
  • 1 виртуальная сеть
  • 1 подсеть
  • 1 виртуальная машина с минимальными характеристиками
  • подключение диска и сети к ВМ

cloud-terraform/main.tf

Cloud-init

Первоначальная настройка ВМ (bootstrap), выполняется один раз при первом запуске:

  • добавление пользователя
  • добавление SSH-ключа

cloud-terraform/cloud-init.yml

Ansible

Более детальная конфигурация облачной машины:

  • установка и настройка Docker
  • настройка firewall
  • установка fail2ban
  • усиление безопасности sshd

После связки Terraform → Cloud-init → Ansible виртуальная машина полностью готова к деплою приложения.

ansible/harden.yml


2. Запуск pipeline

git push в удалённый репозиторий на GitHub → GitHub отправляет webhook на:

https://jenkins.bernd32.xyz/github-webhook/

Безопасность доступа:

Ресурс Доступ
https://jenkins.bernd32.xyz (сам Jenkins) только для IP, разрешённых в конфигурации nginx
.../github-webhook/ (endpoint для вебхуков) открыт для всех IP, защищён HMAC-подписью payload

Jenkins клонирует репозиторий и считывает декларативный pipeline из jenkins/Jenkinsfile.


3. Quality Gates

Тесты фронтенда и бэкенда запускаются параллельно, каждый в своём Docker-контейнере.

Backend

  • Контейнер: python:3.14-slim-bookworm
  • Создание venv
  • Установка зависимостей
  • Запуск pytest с JUnit-отчётом
  • post.always → публикация результатов тестов

Frontend

  • Контейнер: node:22-bookworm-slim
  • npm ci
  • typecheck
  • npm test (Vitest, JUnit-отчёт)
  • npm run build
  • post.always → публикация результатов тестов

4. Сборка и публикация образов

Docker-образы собираются и выгружаются в registry (Docker Hub) с тегом git-sha.

Это даёт:

  • воспроизводимость (откат на конкретный тег)
  • полную историю образов

5. Проверка безопасности

Проверки выполняются в non-blocking режиме — не приводят к падению сборки, а формируют отчёты в панели Jenkins.

Инструмент Что сканирует
pip-audit Python-зависимости бэкенда
npm audit JS/TS-зависимости фронтенда
Trivy Собранный Docker-образ целиком (сразу после сборки)

6. Деплой

На удалённом хосте ВМ, с подключённым через withCredentials секретным .env-файлом (не коммитится в репозиторий), выполняется:

docker compose up -d --remove-orphans --wait

с только что собранными образами.

После успешного завершения pipeline:

docker image prune -f

Приложение доступно по адресу:

http://cloud-ip:20773

7. Мониторинг

В Grafana на локальном сервере настроен дашборд для мониторинга локального сервера с "production"-версией приложения.

Стек Prometheus + cAdvisor/node-exporter отслеживает:

  • общее состояние сервера (CPU / RAM / disk I/O)
  • состояние Docker-контейнеров (использование FS, CPU, сети, памяти по каждому контейнеру)

8. Rollback-стратегия

Для отката реализован отдельный pipeline: jenkins/rollback/Jenkinsfile.

Порядок действий:

  1. Найти последний успешный билд нужной версии
  2. В console output найти строку Building commit XXXXXXXX (хеш коммита = тег образа на Docker Hub)
  3. Перейти в job anime-backlog-rollback в Jenkins
  4. Выбрать Build with Parameters
  5. В поле ROLLBACK_SHA вставить нужный хеш коммита
  6. Запустить билд — версия на проде будет восстановлена

9. Flowchart

flowchart