Расскажи про GitLab Workflow

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

Ответ

В моей практике GitLab Workflow — это не просто «ветка + MR», а полноценный, автоматизированный цикл доставки, построенный вокруг возможностей GitLab CI/CD. Я настраивал его следующим образом:

Ядро процесса — Merge Request (MR):

  1. Разработчик создает ветку от main для задачи (например, feature/new-payment).
  2. Каждый пуш в эту ветку автоматически запускает CI/CD пайплайн, который выполняет:
    • Lint & Test: Проверку кода, юнит-тесты.
    • Build & Security Scan: Сборку Docker-образа и его сканирование на уязвимости (Trivy).
    • Deploy to Review: Автоматический деплой изменений в изолированное, ephemeral review-окружение. Это позволяет тестировать фичу в условиях, близких к production, без влияния на других.
  3. Создается MR. В описании автоматически подтягиваются результаты пайплайна и security-сканов.
  4. После аппрува ревьюерами и успешного прохождения всех этапов пайплайна MR мержится в main.

Что происходит после мержа в main: Автоматически запускается продвинутый пайплайн, который:

  1. Деплоит образ в staging-окружение.
  2. Запускает интеграционные и нагрузочные тесты.
  3. После успеха и, опционально, ручного подтверждения — разворачивает изменения в production (часто с использованием стратегий blue-green через ArgoCD, который синхронизирован с GitLab).

Пример .gitlab-ci.yml, реализующего этот workflow:

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

# Этап для каждой фич-ветки
build:image:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
  only:
    - merge_requests
    - main

deploy:review:
  stage: deploy-review
  script:
    - helm upgrade --install my-app-$CI_COMMIT_REF_SLUG ./chart --set image.tag=$CI_COMMIT_REF_SLUG
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    url: https://$CI_COMMIT_REF_SLUG.my-app.com
    on_stop: stop_review  # Автоматически удаляет окружение при закрытии MR
  only:
    - merge_requests

# Этап, срабатывающий только после мержа в main
deploy:staging:
  stage: deploy-staging
  script: [...]
  only:
    - main

Такой workflow обеспечивает высокую скорость, безопасность и предсказуемость доставки изменений.