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