Какова последовательность стадий (stages) в CI/CD пайплайне?

«Какова последовательность стадий (stages) в CI/CD пайплайне?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Типичный CI/CD пайплайн состоит из последовательных стадий, которые автоматизируют путь кода от коммита до продакшена. Конкретные стадии могут варьироваться, но общая логическая последовательность выглядит так:

  1. Fetch / Source: Получение исходного кода из системы контроля версий (Git). Это отправная точка любого пайплайна.
  2. Build / Compile: Сборка приложения. Для компилируемых языков — это компиляция, для интерпретируемых — установка зависимостей. Результат — артефакт (Docker-образ, JAR-файл, бинарник).
  3. Test: Запуск автоматизированных тестов.
    • Unit-тесты: Проверка отдельных модулей.
    • Integration-тесты: Проверка взаимодействия компонентов.
    • Code Quality / Lint: Проверка стиля кода и статический анализ.
  4. Package / Containerize: Упаковка артефакта в готовую к развертыванию единицу. В современном DevOps это чаще всего создание и публикация Docker-образа в registry (Docker Hub, GitLab Container Registry, ECR).
  5. Deploy to Staging / Pre-Prod: Развертывание собранного образа в тестовую среду, максимально приближенную к продакшену.
  6. Integration / E2E Testing: Запуск сквозных (end-to-end) тестов в staging-среде.
  7. Security Scan / Compliance Check: Статический и динамический анализ безопасности (SAST/DAST), проверка на уязвимости в зависимостях (например, с Trivy, Snyk).
  8. Deploy to Production: Развертывание в продакшен-среду. Часто используется стратегия blue-green или canary для минимизации рисков.
  9. Post-Deployment Verification / Smoke Tests: Быстрая проверка работоспособности приложения в продакшене после деплоя.
  10. 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