====== 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]]
===== 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]]