Почему переменная pipeline не работает в разделе RULES в описании задания gitlab-ci.yaml?

Вопрос или проблема

У меня есть следующий файл 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.

Объяснение вашего кода

  1. В первом примере:
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 присвоил какое-то значение по умолчанию).
  1. Во втором примере:
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 процессе.

Оцените материал
Добавить комментарий

Капча загружается...