Ответ
Типичный CI/CD пайплайн состоит из последовательных стадий, которые автоматизируют путь кода от коммита до продакшена. Конкретные стадии могут варьироваться, но общая логическая последовательность выглядит так:
- Fetch / Source: Получение исходного кода из системы контроля версий (Git). Это отправная точка любого пайплайна.
- Build / Compile: Сборка приложения. Для компилируемых языков — это компиляция, для интерпретируемых — установка зависимостей. Результат — артефакт (Docker-образ, JAR-файл, бинарник).
- Test: Запуск автоматизированных тестов.
- Unit-тесты: Проверка отдельных модулей.
- Integration-тесты: Проверка взаимодействия компонентов.
- Code Quality / Lint: Проверка стиля кода и статический анализ.
- Package / Containerize: Упаковка артефакта в готовую к развертыванию единицу. В современном DevOps это чаще всего создание и публикация Docker-образа в registry (Docker Hub, GitLab Container Registry, ECR).
- Deploy to Staging / Pre-Prod: Развертывание собранного образа в тестовую среду, максимально приближенную к продакшену.
- Integration / E2E Testing: Запуск сквозных (end-to-end) тестов в staging-среде.
- Security Scan / Compliance Check: Статический и динамический анализ безопасности (SAST/DAST), проверка на уязвимости в зависимостях (например, с Trivy, Snyk).
- Deploy to Production: Развертывание в продакшен-среду. Часто используется стратегия blue-green или canary для минимизации рисков.
- Post-Deployment Verification / Smoke Tests: Быстрая проверка работоспособности приложения в продакшене после деплоя.
- Monitoring & Notify: Интеграция с системами мониторинга (Prometheus, Grafana) и отправка уведомлений (Slack, Email) об успешном или неуспешном завершении пайплайна.
Пример пайплайна в GitLab CI (.gitlab-ci.yml):
stages:
- build
- test
- security-scan
- deploy-staging
- e2e-test
- deploy-production
variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
build:
stage: build
script:
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
unit-test:
stage: test
script:
- ./run_unit_tests.sh
security:
stage: security-scan
script:
- trivy image --exit-code 1 $DOCKER_IMAGE
deploy-staging:
stage: deploy-staging
script:
- kubectl config use-context staging
- kubectl set image deployment/my-app app=$DOCKER_IMAGE -n staging
only:
- main
e2e-test:
stage: e2e-test
script:
- ./run_e2e_tests_on_staging.sh
deploy-production:
stage: deploy-production
script:
- kubectl config use-context production
- kubectl apply -f k8s/manifests/production/
when: manual # Требует ручного подтверждения
only:
- main