'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.

Running with gitlab-runner 14.10.1.

No matter if i try that locally or on Gitlab that var is never set.

On local I run it with gitlab-runner exec shell my_project_test.

env | grep CI is:

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

As per their documentation: If a rule matches, when: always is the default, and when: never is the default if nothing matches.

I even tried if: '1 == 1' and so on.



Solution 1:[1]

the assignment should works if you put the condition in your task.

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.

However the variable is only in the scope of your job, which is under your if condition, it won't overwrite the global value in the another job.

What you really need to pass variable between jobs :

set up global variables dynamically in gitlab-ci

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Raymond