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

Ответ

В современных 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.

Ответ 18+ 🔞

Слушай, ну вот смотри, вся эта движуха с деплоем — это как выбор, на чём ехать в магазин. Можно пешком, можно на велике, а можно на тачке, но тогда бензина жрёт дохуя. Так и тут: способ запустить эту карусель зависит от того, куда и с какой скоростью тебе надо.

1. Автоматический деплой по пушу в Git (для дев/стейджа — самое то):

  • В GitLab CI/CD или GitHub Actions вся эта махина стартует, как только ты заливаешь код в определённую ветку (типа develop). Всё само прогонит сборку, тесты, проверки, и если всё ок — ёб твою мать, — само же и задеплоит. Красота, а не жизнь.

Пример отрывка из .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. Ручной запуск (для продакшена — без этого никуда):

  • Для прода — тут уже волнение ебать. Чаще всего ставят ручной запуск, эту самую кнопку "Deploy to Prod". Прогнал ревью, всё одобрили — тогда уже жмёшь, герой. Или через консольку, если ты такой весь из себя хардкорный:
    gitlab-runner exec docker deploy_to_prod

3. GitOps (ArgoCD, Flux — магия, блядь):

  • Это вообще ёперный театр. Ты просто пушишь изменения манифестов в Git, а система, как собака сука преданная, сама всё подхватывает и в кластере синхронизирует. Сделал коммит — и всё, можно пить кофе, деплой уже летит.
    # Меняешь версию приложения
    git commit -am "Bump app to v1.2.0"
    git push origin main
    # ArgoCD это увидит и сам всё обновит — ни хуя себе удобство!

4. Запуск через API (для интеграций с другим говном):

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

А главная мысль-то какая? Выбор триггера — это всегда баланс между "ой, как быстро" и "ой, как страшно". Для продакшена доверия ебать ноль, поэтому там ручной контроль или очень строгие автоматические правила. А для всего остального — да похуй, можно и на полном автомате, чтобы голова не болела.