仅当任何提交的文件不是三种特定类型之一时才运行 gitlab 管道作业

问题描述 投票:0回答:1

我有一个 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$))*$/

我没有主意了。而且因为作业应该运行的其他文件类型有很多种,所以如果文件类型与这个或那个匹配,我想避免使用作业运行的肯定版本。

有什么建议吗?

gitlab-ci
1个回答
0
投票

好吧,您遇到的第一个问题是

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:

© www.soinside.com 2019 - 2024. All rights reserved.