我有一个 gitlab (v16.6.2-ee) 管道作业,我希望它仅在我位于功能分支上并且提交的文件之一不具有类型
*.abc
、*.def
或*.xyz
。
使用这个不起作用
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
changes:
- "**/*[^.abc]"
- "**/*[^.def]"
- "**/*[^.xyz]"
因为只要其中一个要点匹配,它就会评估为 true。
这也会给出无效的 yaml:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
changes:
- "**/*[^.abc]" && "**/*[^.def]" && "**/*[^.xyz]"
这里第二个更改似乎覆盖了第一个
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
changes:
- "**/*[^.abc]"
changes:
- "**/*[^.def]"
并且正则表达式(在正则表达式测试器中工作正常)也不会触发正确的管道(我读到不支持负向前看):
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
changes:
- /^(.(?!.*\.abc$|.*\.def$|.*\.xyz$))*$/
我没有主意了。而且因为作业应该运行的其他文件类型有很多种,所以如果文件类型与这个或那个匹配,我想避免使用作业运行的肯定版本。
有什么建议吗?
好吧,您遇到的第一个问题是
rules:changes:
是 glob 模式,而不是正则表达式模式。具体来说,正如文档中提到的,这些必须是 Ruby 的fnmatch
支持的表达式。因此,您必须为此编写一个全局模式。
因为rules:changes:
是一个包含集,为了排除模式,您需要编写一个包含每个可能的文件的全局模式,该文件不以您所描述的扩展名结尾。通常,
!
元字符通常可以用于此目的,但不幸的是,GitLab 不支持此元字符。
但是,您可以编写一个详尽的模式来大致*覆盖相同的情况。
rules:
changes:
- **/{*.[^adx]*,*.a[^b]*,*.ab[^c]*,*.abc?*,*.a,*.ab,*.d[^e]*,*.x[^y]*,*.de[^f]*,*.xy[^z]*,*.def?*,*.xyz?*,*.d,*.de,*.x,*.xy}
请参阅
此链接了解此全局模式的测试。
扩展名不以
a
d
或
x
(
*.[^adx]*
)开头
具有以
a
b
作为其第二个字符 (
*.a[^b]*
)
具有以
ab
c
作为其第三个字符 (
*.ab[^c]*
)
扩展名以
abc
*.abc?*
)
扩展名只是
a
ab
(
.a
,
.ab
)
(并对每组扩展字符重复前面的 4 个规则)
rules:changes: