Как изменится логика работы CI/CD при переходе на GitFlow?

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

Ответ

При внедрении GitFlow в проекте, который я настраивал, пайплайн CI/CD был переработан под новую модель ветвления. Основные изменения коснулись триггеров, стадий и артефактов.

1. Стратегия запуска пайплайнов:

  • *Ветки `feature/`:** Запускается пайплайн, включающий сборку, модульное и интеграционное тестирование. Деплой обычно не выполняется, но создаётся артефакт (например, Docker-образ с тегом, содержащим имя ветки).
  • Ветка develop: Срабатывает при мерже feature. Здесь запускается полный цикл тестов (включая e2e) и деплой на staging-окружение. Часто используется стратегия git tag для семантического версионирования (например, v1.2.0-alpha.1).
  • *Ветки `release/:** Пайплайн фокусируется на финальном тестировании, security-сканировании и подготовке к production. Создаётся релизный артефакт (образ с тегомv1.2.0-rc.1`).
  • Ветка main (после мержа release): Запускается деплой в production. Образ тегируется стабильной версией (v1.2.0). Этот этап часто требует мануального подтверждения (approval) в настройках CI.
  • *Ветки `hotfix/:** Обходят длинный циклdevelop. Пайплайн аналогиченrelease, но после мержа вmainиdevelopавтоматически создаётся патч-версия (v1.2.1`).

2. Пример конфигурации GitLab CI для GitFlow:

stages:
  - build
  - test
  - deploy-staging
  - deploy-prod

variables:
  # Тег образа формируется динамически
  IMAGE_TAG: $CI_COMMIT_REF_SLUG

build:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$IMAGE_TAG .
    - docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG
  rules:
    # Собираем для всех веток, кроме main (для main сборка будет в release/hotfix)
    - if: $CI_COMMIT_BRANCH != "main"

deploy-staging:
  stage: deploy-staging
  script: ./scripts/deploy.sh staging $IMAGE_TAG
  rules:
    - if: $CI_COMMIT_BRANCH == "develop" || $CI_COMMIT_BRANCH =~ /^release//

deploy-prod:
  stage: deploy-prod
  script: ./scripts/deploy.sh production $IMAGE_TAG
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      when: manual # Требует ручного подтверждения

3. Ключевые следствия для DevOps:

  • Увеличивается количество параллельно собираемых артефактов, требуется оптимизация кэширования и ресурсов агентов (runner).
  • Необходимо чёткое управление конфигурациями окружений (staging, production) через инструменты вроде Helm, Terraform или Ansible.
  • Важна интеграция с инструментами проверки кода (SonarQube) и безопасности (Trivy, Snyk) на разных этапах.