通过提交消息触发

时间:2021-01-25 15:05:16

标签: git gitlab yaml gitlab-ci

我正在尝试构建一个 Gitlab CI yml,它会触发某个工作:

  • 当提交以 x.y.z 形式标记时
  • 我通过 Gitlab 网络应用手动触发
  • 提交消息以某个正则表达式(“-build_doc”)结束

项目符号是合乎逻辑的语句。我尝试了 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

有什么建议吗?谢谢!!

2 个答案:

答案 0 :(得分:1)

由于评估方式的原因,您将无法使用 only 语法获得所需的结果。您上面的示例是使用 refs 关键字的简单/速记方式,因此与

相同
only:
  refs:
    - /^v(\d+)\.(\d+)\.(\d+)$/ #tag
    - web

仅就这一点而言,如果有任何引用匹配,作业将被添加到管道中。当与其他关键字(如 variableskubernetes)组合时,这些关键字使用 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