Вопрос или проблема
У меня есть следующий файл gitlab-ci.yaml. Переменная BUILD_NUMBER должна передаваться из upstream задания в downstream (someproject). С текущей конфигурацией это задание триггера будет создано и выполнено каждый раз, независимо от того, есть ли BUILD_NUMBER в контексте или нет:
trigger-job:
stage: build
rules:
- if: '$BUILD_NUMBER != null && $BUILD_NUMBER != ""'
variables:
BUILD_NUMBER: ${BUILD_NUMBER}
trigger:
project: someproject
branch: main
Если я удалю инструкцию VARIABLES и просто передам переменные пайплайна с помощью соответствующей команды – все работает. Почему? Означает ли это, что секция VARIABLES выполняется раньше секции RULES и инициализирует ее чем-то другим, отличным от NULL или “”?
trigger-job:
stage: build
rules:
- if: '$BUILD_NUMBER != null && $BUILD_NUMBER != ""'
trigger:
project: someproject
branch: main
forward:
pipeline_variables: true
Ответ или решение
В данном случае проблема заключается в том, как GitLab CI обрабатывает секции rules
и variables
в файле .gitlab-ci.yml
.
Почему не работают переменные в секции RULES
Когда вы устанавливаете переменные в секции variables
, они инициализируются в начале выполнения сценария, что происходит до обработки правил (rules
). Это означает, что все переменные, которые вы задали в variables
, будут доступны, но их значения могут не соответствовать контексту, установленному на момент проверки правил. В вашем случае, переменная BUILD_NUMBER
может быть установлена в ненужное значение (например, пустая строка или какое-либо другое значение по умолчанию), что отрицательно сказывается на условии if
в rules
.
Объяснение вашего кода
- В первом примере:
trigger-job:
stage: build
rules:
- if: '$BUILD_NUMBER != null && $BUILD_NUMBER != ""'
variables:
BUILD_NUMBER: ${BUILD_NUMBER}
trigger:
project: someproject
branch: main
- Здесь переменная
BUILD_NUMBER
устанавливается в секцииvariables
. ЕслиBUILD_NUMBER
не определена в контексте, планировщик GitLab проверяетrules
после инициализации переменных, и условиеif
всегда оказывается истинным (если GitLab присвоил какое-то значение по умолчанию).
- Во втором примере:
trigger-job:
stage: build
rules:
- if: '$BUILD_NUMBER != null && $BUILD_NUMBER != ""'
trigger:
project: someproject
branch: main
forward:
pipeline_variables: true
- Здесь вы не устанавливаете переменную
BUILD_NUMBER
явно, а напрямую используете ее в условииrules
. Это позволяет GitLab правильно проверить значениеBUILD_NUMBER
в контексте текущей сборки или переданной переменной, и правило будет работать корректно.
Рекомендации
Если вам необходимо передать переменную, которая определена в upstream задаче, и вы хотите выполнять rules
на основе этой переменной, то лучше использовать прямую проверку без секции variables
. Используя команду trigger
для вызова downstream задания, убедитесь, что нужные переменные передаются корректно через параметр forward
, как в вашем втором примере.
Таким образом, можно подытожить:
- Не используйте секцию
variables
, если значение переменной требуется для условия в секцииrules
. - Убедитесь, что все переменные, которые должны быть проверены, передаются либо через контекст pipeline, либо явно указаны в downstream.
Следуя этим рекомендациям, вы сможете корректно настраивать зависимости между задачами в вашем CI/CD процессе.