Ответ
В 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). Это обеспечивает контроль, воспроизводимость и четкую связь между кодом в репозитории и развернутой версией.