====== rules ======
[[https://docs.gitlab.com/ee/ci/yaml/#rulesif|rules:if]]
Use rules:if clauses to specify when to add a job to a pipeline:
If an if statement is true, add the job to the pipeline.
If an if statement is true, but it’s combined with when: never, do not add the job to the pipeline.
If no if statements are true, do not add the job to the pipeline.
[[https://docs.gitlab.com/ee/ci/yaml/#ruleschanges|rules:changes]]
===== conditional variables =====
build:
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
variables:
CCACHE_DISABLE: 1
- if: $CI_COMMIT_TAG
variables:
CCACHE_DISABLE: 1
* [[https://docs.gitlab.com/ee/ci/caching/index.html#use-a-variable-to-control-a-jobs-cache-policy|Use a variable to control a job’s cache policy]]
* [[https://gitlab.com/gitlab-org/gitlab/-/issues/270415#note_1050526105|Support `cache` policies for job `rules`]]
workflow:
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
variables:
CCACHE_DISABLE: 1
CACHE_CCACHE_POLICY: pull
- if: $CI_COMMIT_TAG
variables:
CCACHE_DISABLE: 1
CACHE_CCACHE_POLICY: pull
- when: always
.ccache: &cache-ccache
key: cache-ccache
paths:
- .ccache
policy: ${CACHE_CCACHE_POLICY}
.build-target:
cache:
- <<: *cache-ccache
===== negate glob? =====
How to negate ''rules:changes'' pattern?
Not possible. ''rules:changes'' takes glob patterns and they are inclusive only.
You have to specify all paths/patterns to match one by one.
BUT:
Glob patterns are interpreted with Ruby’s [[https://docs.ruby-lang.org/en/master/File.html#method-c-fnmatch|File.fnmatch]] with the [[https://docs.ruby-lang.org/en/master/File/Constants.html#module-File::Constants-label-Filename+Globbing+Constants+-28File-3A-3AFNM_-2A-29|flags]] ''File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB''.
Ruby's fnmatch is used to handle patterns. It doesn't support ''!'' character.
To write rule to do not match changes in src/**/*
directory but matches ''s'', ''sr'', ''src2'':
rules:
- changes:
- "{[^s]*,s,s[^r]*,sr,sr[^c]*,src?*}/**/*"
- "*"
Note: second pattern ''*'' is for match any file (but not directory!)
More, to exclude ''src/'' and ''doc/'':
rules:
- changes:
- "{[^s^d]*,s,d,s[^r]*,d[^o],sr,do,sr[^c]*,do[^c]*,src?*,doc?*}/**/*"
- "*"
More about:
* [[https://stackoverflow.com/questions/69905938/is-there-a-way-to-write-a-glob-pattern-that-matches-all-files-except-those-in-a|Is there a way to write a glob pattern that matches all files except those in a folder?]]
* [[https://stackoverflow.com/questions/73228188/gitlab-ci-cd-ruleschanges-negate-glob/73229777#73229777|gitlab CI/CD rules:changes negate glob]]