На каком этапе CI/CD пайплайна происходил деплой в ваших проектах?

«На каком этапе CI/CD пайплайна происходил деплой в ваших проектах?» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моих проектах деплой — это отдельный, завершающий этап CI/CD пайплайна, следующий после успешной сборки и тестирования. Я строил процесс по принципу многоступенчатых окружений.

Типичный пайплайн выглядел так:

  1. Build: Сборка артефакта (например, Docker-образа) и его публикация в реестр (Artifactory, ECR, GCR).
  2. Test: Запуск юнит-тестов, статического анализа кода (SAST) и проверки уязвимостей зависимостей (SCA).
  3. Deploy to Staging: Автоматический деплой собранного образа в staging-окружение (например, отдельный namespace в Kubernetes). Там запускались интеграционные и нагрузочные тесты.
  4. Deploy to Production: После успешных тестов в staging и ручного аппрува (или по условию, например, тегу) — деплой в production. Часто использовалась стратегия blue-green или canary-деплоя через ArgoCD или Flux для минимизации downtime.

Пример сегмента пайплайна GitLab CI для деплоя в staging:

deploy:staging:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    # Применяем манифесты, предварительно подставив актуальный тег образа
    - envsubst < k8s/deployment.yaml | kubectl apply -f - --namespace=staging
    # Ждем, пока поды перейдут в состояние Ready
    - kubectl rollout status deployment/my-app --namespace=staging --timeout=120s
  only:
    - main  # Автодеплой в staging при пуше в main
  environment:
    name: staging
    url: https://staging.my-app.com

Ключевая идея — деплой не единичное событие, а стандартизированная, повторяемая и откатываемая процедура, интегрированная в общий поток доставки.