Как настроить запуск сборки в GitLab CI/CD только при создании определенного Git-тега?

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

Ответ

В GitLab CI/CD для этого используются правила (rules) или устаревшие, но еще работающие директивы only/except. Я предпочитаю современный синтаксис rules.

1. Использование rules: (рекомендуемый способ)

build_production_image:
  stage: build
  script:
    - echo "Сборка образа для продакшена..."
    - docker build -t myapp:$CI_COMMIT_TAG .
  rules:
    # Запускать джоб ТОЛЬКО для тегов, начинающихся с 'v' (v1.0.0, v2.1.5)
    - if: $CI_COMMIT_TAG =~ /^vd+.d+.d+$/

2. Использование only:tags с шаблоном (устаревший, но простой синтаксис):

deploy_to_prod:
  stage: deploy
  script:
    - echo "Деплой версии $CI_COMMIT_TAG"
  only:
    - tags
  except:
    - branches
  # Дополнительная фильтрация по шаблону имени тега
  variables:
    $CI_COMMIT_TAG =~ /^prod-.*/

Ключевые переменные GitLab CI:

  • $CI_COMMIT_TAG — содержит имя тега, если пайплайн запущен для тега.
  • $CI_COMMIT_BRANCH — содержит имя ветки (для тегов — пустая).

Пример сложного правила для семантического версионирования:

release_job:
  stage: release
  script:
    - ./scripts/create-release.sh
  rules:
    # Запускать, если это тег, И он соответствует паттерну семвер-релиза
    - if: $CI_COMMIT_TAG && $CI_COMMIT_TAG =~ /^vd+.d+.d+$/
      when: always
    # Не запускать для всех остальных случаев (ветки, merge requests, другие теги)
    - when: never

Зачем это нужно в DevOps: Это основа модели "GitOps" или "release-by-tag". Мы настраиваем пайплайн так, что сборка и деплой в прод происходят автоматически и исключительно при проталкивании тега с определенным именем (например, v1.2.3). Это обеспечивает контроль, воспроизводимость и четкую связь между кодом в репозитории и развернутой версией.