我正在尝试构建一个 Gitlab CI yml,它会触发某个工作:
项目符号是合乎逻辑的或语句。我尝试了 only
语句和 rules
之类的语句,但无法弄清楚。
网络和标签已经像这样工作了:
script:
...
only:
- /^v(\d+)\.(\d+)\.(\d+)$/ #tag
- web
我还发现了 this issue,它允许通过 only:variables
提交消息条件,但现在我在其他两个方面苦苦挣扎...
我的规则试验:
script:
...
rules:
- if: '$CI_PIPELINE_SOURCE == "web"'
- if: '$CI_COMMIT_MESSAGE =~ /^.*-build_doc$/'
- if: $CI_COMMIT_TAG
有什么建议吗?谢谢!!
答案 0 :(得分:1)
由于评估方式的原因,您将无法使用 only
语法获得所需的结果。您上面的示例是使用 refs
关键字的简单/速记方式,因此与
only:
refs:
- /^v(\d+)\.(\d+)\.(\d+)$/ #tag
- web
仅就这一点而言,如果有任何引用匹配,作业将被添加到管道中。当与其他关键字(如 variables
或 kubernetes
)组合时,这些关键字使用 AND 组合。因此,在此示例中,引用之一必须匹配,并且变量必须匹配。没有办法让它成为 OR。
only:
refs:
- /^v(\d+)\.(\d+)\.(\d+)$/ #tag
- web
variables:
- $CI_COMMIT_MESSAGE =~ /^my message/
不过,您应该能够使用较新的 rules
语法获得所需的结果。如果您有多个 if
语句,则将它们组合在一起进行 OR 运算,而不是 AND 运算。此处的文档中提供了如何评估 if 的示例:https://docs.gitlab.com/ee/ci/yaml/#rules-clauses。在单个 if 语句中,您可以组合使用 ||
表示 OR 和 &&
表示 AND 的条件。您可以在此处查看示例:https://docs.gitlab.com/ee/ci/yaml/#rulesif
所以对于这个用例,我会尝试
rules:
- if: '$CI_PIPELINE_SOURCE == "web" || $CI_COMMIT_MESSAGE =~ /^my message/i || $CI_COMMIT_REF_NAME =~ /^v(\d+)\.(\d+)\.(\d+)$/'
when: always
您不需要在 if 语句中添加 when 子句,如果不添加,它将使用您在工作中放置的 when
,或使用默认的 on-success
。< /p>
此外,此处列出了您可以使用的所有预定义变量:https://docs.gitlab.com/ee/ci/variables/predefined_variables.html。
答案 1 :(得分:0)
为了完整起见,我将我的最终解决方案作为替代答案发布。它仍然基于 Adams solution,但改为使用多个 if
语句。
script:
...
rules:
- if: '$CI_PIPELINE_SOURCE == "web"'
- if: '$CI_COMMIT_MESSAGE =~ /^.*\[build_doc\].*$/s'
- if: '$CI_COMMIT_REF_NAME =~ /^(\d+)\.(\d+)\.(\d+)$/'
- when: always