gitlab-ci

Branch name comparison in rules is not working properly


I have a Gitlab CI job that uses one value of a variable if branch is not main, and it uses a different value if it is main. This is what a basic version of my job looks like (I added a bunch of echo statements for testing:

test-job:
  variables:
    POST: False
    COMPARE_BRANCH: main
  script:
    - echo "CI_COMMIT_BRANCH:$CI_COMMIT_BRANCH"
    - echo "COMPARE_BRANCH:$COMPARE_BRANCH"
    - if [[ $CI_COMMIT_BRANCH == $COMPARE_BRANCH ]]; then
    - echo "CI_COMMIT_BRANCH == COMPARE_BRANCH"
    - echo "$CI_COMMIT_BRANCH == $COMPARE_BRANCH"
    - else
    - echo "CI_COMMIT_BRANCH != COMPARE_BRANCH"
    - echo "$CI_COMMIT_BRANCH != $COMPARE_BRANCH"
    - fi
    - echo "POST:$POST"
  rules:
    - if: $CI_COMMIT_BRANCH == $COMPARE_BRANCH
      variables:
        POST: True
    - when: on_success

Based on the rules, when $CI_COMMIT_BRANCH is not main, the $POST variable should be false. This works as intended:

$ echo "CI_COMMIT_BRANCH:$CI_COMMIT_BRANCH"

CI_COMMIT_BRANCH:my-test-branch

$ echo "COMPARE_BRANCH:$COMPARE_BRANCH"

COMPARE_BRANCH:main

$ if [[ $CI_COMMIT_BRANCH == $COMPARE_BRANCH ]]; then

$ echo "CI_COMMIT_BRANCH != COMPARE_BRANCH"

CI_COMMIT_BRANCH != COMPARE_BRANCH

$ echo "$CI_COMMIT_BRANCH != $COMPARE_BRANCH"

my-test-branch != main

$ fi

$ echo "POST:$POST"

POST:false

But when I change $COMPARE_BRANCH to be the same as $CI_COMMIT_BRANCH:

test-job:
  variables:
    POST: False
    COMPARE_BRANCH: $CI_COMMIT_BRANCH

It still doesn't change the variables:

$ echo "CI_COMMIT_BRANCH:$CI_COMMIT_BRANCH"

CI_COMMIT_BRANCH:my-test-branch

$ echo "COMPARE_BRANCH:$COMPARE_BRANCH"

COMPARE_BRANCH:my-test-branch

$ if [[ $CI_COMMIT_BRANCH == $COMPARE_BRANCH ]]; then

$ echo "CI_COMMIT_BRANCH == COMPARE_BRANCH"

CI_COMMIT_BRANCH == COMPARE_BRANCH

$ echo "$CI_COMMIT_BRANCH == $COMPARE_BRANCH"

my-test-branch == my-test-branch

$ else

$ echo "POST:$POST"

POST:false

As you can see, the if statement within script sees that the $CI_COMMIT_BRANCH matches $COMPARE_BRANCH, but the $POST variable is still false, meaning that the if statement in rules does not see that those values match.

What am I doing wrong here?


Solution

  • According to the documentation:

    You cannot use nested variables with if.

    So because $COMPARE_BRANCH is supposed to resolve to $CI_COMMIT_BRANCH that's where my problem is. There's an open issue to address this.