Kenneth Gunnerud
Kenneth Gunnerud

Reputation: 248

GitLab CI, rules not triggering job

We just started using GitLab and have some problems with the behaviour. Standing on branch: feature/test, I would expect ALL of the jobs below to be triggered, but only All Branches except master/dev is triggered.

Anyone know what I'm doing wrong?

Reading the documentation here: https://docs.gitlab.com/13.8/ee/ci/yaml/#rules

stages:
  - pre-build
  - build
  - post-build
  - test
  - publish
  - deploy

All Branches except master/dev:
  stage: build
  image: openjdk:16-slim
  script:
    - 'cd .tools'
  rules:
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
      when: never
    - if: '$GIT_COMMIT_BRANCH =~ /^dev.*/'
      when: never
    - when: always

Only Branch Regex:
  stage: build
  image: openjdk:16-slim
  script:
    - 'cd .tools'
  rules:
    - if: '$GIT_COMMIT_BRANCH =~ /^feature.*/'

Only Branch Specific:
  stage: build
  image: openjdk:16-slim
  script:
    - 'cd .tools'
  rules:
    - if: '$GIT_COMMIT_BRANCH == "feature/test"'

Upvotes: 4

Views: 7265

Answers (1)

Adam Marshall
Adam Marshall

Reputation: 7705

The variable you're using doesn't exist: $GIT_COMMIT_BRANCH, or at least it isn't defined by Gitlab CI, so you'd have to be defining it yourself somewhere, which I don't see in the yaml file. I think you want to use CI_COMMIT_BRANCH, which is predefined by Gitlab, and contains the name of the branch that is being built.

The reason your jobs aren't running correctly is since the variable doesn't exist, the conditionals are evaluating as 'false', so the last two jobs will never run, and the "All branches except master/dev" will run for all except your default branch due to the second conditional. The first conditional, checking if the branch is the default branch, works fine. The second one evaluates as false since the variable doesn't exist, so it falls to the third rules line: when: always.

You should be able to fix it by changing the variable name. However, note that CI_COMMIT_BRANCH doesn't always exist. If a pipeline was started from a merge request, this variable will be empty. Also, if you use tags in your development workflow, this will be empty. The CI_COMMIT_REF_NAME variable on the other hand will hold the branch or tag name of the item being built, and will exist if a Merge Request started the pipeline. In that case, it holds the value of CI_MERGE_REQUEST_SOURCE_BRANCH_NAME (they're equivalent).

But, if you don't use tags and either don't use Merge Requests or handle those pipelines separately, CI_COMMIT_BRANCH will work fine.

Upvotes: 3

Related Questions