Как инициируется процесс деплоя в CI/CD-пайплайне?

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

Ответ

В современных CI/CD-пайплайнах инициирование деплоя зависит от выбранной стратегии (ручной, автоматический, GitOps). В моей практике использовались следующие подходы.

1. Автоматический деплой по событию в Git (чаще всего для dev/stage):

  • В GitLab CI/CD или GitHub Actions пайплайн запускается при push или merge request в определённую ветку (например, develop или main).
  • После успешного прохождения всех стадий (build, test, security scan) автоматически запускается job деплоя.

Пример отрывка из .gitlab-ci.yml:

stages:
  - build
  - test
  - deploy

deploy_to_stage:
  stage: deploy
  script:
    - echo "Deploying to Kubernetes stage cluster..."
    - kubectl config use-context stage-cluster
    - kubectl apply -f k8s/manifests/ --recursive
  rules:
    - if: $CI_COMMIT_BRANCH == "develop"
      when: manual # Или 'always' для полной автоматизации

2. Ручной запуск деплоя (для production):

  • Для продакшн-окружения часто используется ручной запуск (manual job) после code review и approval. В том же GitLab CI это кнопка "Deploy to Prod" в интерфейсе пайплайна.
  • Альтернативно — запуск через CLI утилиты CI-системы:
    gitlab-runner exec docker deploy_to_prod

3. GitOps-подход (например, с ArgoCD или Flux):

  • Деплой инициируется автоматически при изменении манифестов в Git-репозитории. ArgoCD постоянно сравнивает желаемое состояние (описанное в Git) с актуальным в кластере и выполняет синхронизацию.
  • Инициировать деплой можно просто сделав git push:
    # Обновляем версию образа в kustomization.yaml или Helm values
    git commit -am "Bump app to v1.2.0"
    git push origin main
    # ArgoCD автоматически обнаружит изменение и развернёт новую версию в кластере

4. Запуск через API CI/CD-системы (для интеграций):

  • Например, можно запустить деплой из системы мониторинга (при определённом алерте) или чат-бота.
    # Пример для GitLab API
    curl --request POST 
      --form "token=$CI_JOB_TOKEN" 
      --form "ref=main" 
      "https://gitlab.example.com/api/v4/projects/1/trigger/pipeline"

Ключевой принцип: Выбор триггера зависит от требований к безопасности и скорости delivery. Для production обычно используется комбинация автоматических checks и manual approval.