为什么 Gitlab CICD workflow:rules:if:variables 设置变量失败?

Why is Gitlab CICD workflow:rules:if:variables failing to set variables?

stages:
  - test

# Default vars
variables:
  DEPLOY_VARIABLE: "dev-deploy"

workflow:
  rules:
    - if: '$CI_COMMIT_REF_NAME == "master"'
      variables:
        DEPLOY_VARIABLE: "master-deploy"  # Override globally-defined DEPLOY_VARIABLE

my_project_test:
  stage: test
  script:
    - env | grep CI
    - echo $DEPLOY_VARIABLE // this always outputs dev-deploy.

运行 gitlab-运行ner 14.10.1.

无论我是在本地还是在 Gitlab 上尝试,都不会设置 var。

在本地我 运行 它与 gitlab-runner exec shell my_project_test

env | grep CI 是:

CI_SERVER_VERSION=
CI_RUNNER_EXECUTABLE_ARCH=darwin/amd64
CI_COMMIT_REF_NAME=master
CI_JOB_TOKEN=
CI_PROJECT_ID=0
CI_RUNNER_REVISION=f761588f
... etc

根据他们的文档: 如果规则匹配,when: always 是默认值,when: never 是默认值,如果没有匹配项。

我什至试过if: '1 == 1'等等。

如果您将条件放入任务中,作业应该有效。

my_project_test:
  stage: test
  rules:
     - if: '$CI_COMMIT_REF_NAME == "master"'
       variables:
        DEPLOY_VARIABLE: "master-deploy"  # Override globally-defined DEPLOY_VARIABLE
  script:
    - env | grep CI
    - echo $DEPLOY_VARIABLE // this always outputs dev-deploy.

但是变量只在你的工作范围内,在你的if条件下,它不会覆盖另一个工作中的全局值。

在作业之间传递变量的真正需要:

gitlab-runner exec 具有 several limitations 而没有 implement/consider 许多 YAML 定义的特征,在这种情况下包括 workflow:rules:[]variables

但是,when run through gitlab.com 或 GitLab 的 self-hosted 实例,workflow:rules: 将正确评估。

请记住,在某些情况下,在其他地方设置的变量会 take precedence 覆盖 YAML 中定义的变量,例如在项目、组或实例设置中设置变量。