Короткий ответ
Джоба запустится только тогда, когда пайплайн выполняется для коммита в ветке `main` (например, после прямого push или merge); она НЕ запустится для merge request из feature-ветки, потому что переменная `CI_COMMIT_BRANCH` в контексте MR-пайплайна не равна `main`.
Как это работает подробнее
`rules` в GitLab CI вычисляются до запуска джобы и решают, добавлять её в пайплайн или нет. `CI_COMMIT_BRANCH` заполняется только для обычных (branch) пайплайнов; в pipeline, запущенном для merge request (`merge_request_event`), используется другая переменная — `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME`, а `CI_COMMIT_BRANCH` может быть пустой.
Пример кода
example.yaml
deploy_prod:
stage: deploy
script: ./deploy.sh prod
rules:
- if: '$CI_COMMIT_BRANCH == "main"'Что использовать на практике
- На практике. это правило типично для джоб деплоя, которые должны срабатывать только после того, как изменения попали в основную ветку, а не на этапе проверки pull request. Стоит явно тестировать поведение в интерфейсе CI/CD → Pipelines, проверяя, появляется ли джоба в разных типах пайплайнов.
- Пример. Ожидаемое поведение: при `git push origin main` джоба `deploy_prod` появляется в пайплайне и выполняется; при открытии merge request из `feature/x` в `main` эта джоба в списке джоб пайплайна отсутствует.
Подводные камни
- Частые ошибки. предполагают, что условие сработает и для merge request из ветки `main` в другую ветку, забывая, что направление имеет значение; не учитывают, что при переименовании веток или использовании тегов (`CI_COMMIT_TAG`) переменная `CI_COMMIT_BRANCH` будет пустой.