Assigning predefined variable to global variable

Viewed 74

I have following pipeline that is a template for others, that is why I want to assign CI_DEFAULT_BRANCH as default value to TARGET_BRANCH that can be then overriden by other branch name (develop, release etc.) if needed.

Preconditions:

Project default branch is master

Pipeline runs on master branch

variables:
  TARGET_BRANCH: $CI_DEFAULT_BRANCH # The name of the project’s default branch. = master

stages:
  - build

build:
  stage: build
  rules:
    - if: '$CI_COMMIT_BRANCH == $TARGET_BRANCH' # CI_COMMIT_BRANCH is master
  script:
    - echo hello
    - 'dir env:'

Using this approach the job is not included in the pipeline, but changing the variable like this:

  TARGET_BRANCH: "master"

adds the job to the pipeline.

The script section has the command to list all variables and their values in powershell. Both CI_COMMIT_BRANCH and TARGET_BRANCH have value master in both cases, but still on the first scenario rules:if does not seem to be true. Can someone explain why?

1 Answers

Assigning predefined variable to global variable

Yes you can. As you saw in the script clause of a job your TARGET_BRANCH variable had successfully taken the value of CI_DEFAULT_BRANCH. By assigning it in the variables section

BUT

The issue is where this is available.

variables:
  TARGET_BRANCH: $CI_DEFAULT_BRANCH

The TARGET_BRANCH will have the value of CI_DEFAULT_BRANCH only in the scope of a Gitlab job. And the rules are not in this scope.

AND

This does not happen only to predefined variables. Try this

TARGET_BRANCH: "master"
MY_VAR: $TARGET_BRANCH

Even though TARGET_BRANCH is populated, MY_VAR will show the exact same behavior, meaning it wont be available in rules section.

Basically, in the variables section when you assign to a varialbe another variable. The proper expansion will happen only to the scope of a job. ie script section

In the variables section if you want it to work as you intend, you need to pass literal strings not variables

Related