【问题标题】:Trigger via commit message通过提交消息触发
【发布时间】:2021-01-25 15:05:16
【问题描述】:

我正在尝试构建一个触发特定工作的 Gitlab CI yml:

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

项目符号是合乎逻辑的陈述。我尝试了only 语句和rules 类似但无法弄清楚。 Web 和标签已经像这样工作了:

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

有什么建议吗?谢谢!!

【问题讨论】:

    标签: git gitlab yaml gitlab-ci


    【解决方案1】:

    为了完整起见,我将我的最终解决方案发布为替代答案。它仍然基于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
    
    

    【讨论】:

      【解决方案2】:

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

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

      仅此一项,如果任何 refs 匹配,作业将被添加到管道中。当与其他关键字(如variableskubernetes)组合时,关键字使用AND 组合。所以在这个例子中,其中一个 refs 必须匹配,并且变量必须匹配。没有办法让它成为 OR。

      only:
        refs:
          - /^v(\d+)\.(\d+)\.(\d+)$/ #tag
          - web
        variables:
          - $CI_COMMIT_MESSAGE =~ /^my message/
      

      不过,您应该能够使用较新的 rules 语法获得所需的结果。如果您有多个 if 语句,它们会被 OR'ed 在一起,而不是 AND'ed。此处的文档中提供了如何评估 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

      此外,您可以使用的所有预定义变量都列在此处:https://docs.gitlab.com/ee/ci/variables/predefined_variables.html

      【讨论】:

      • 感谢亚当!后续问题:您建议的解决方案和我的解决方案有什么区别,使用规则(不考虑语法错误,只考虑语义逻辑)?或者换个方式问:多个ifs和||有什么区别? ?
      • 多个if|| 之间没有区别,只是获得&& 的唯一方法是在一个if 中。
      • 其实做 OR 内联有一个好处,你可以使用括号来创建更复杂的条件。
      • 这对我有用,谢谢 - 唯一的问题是,当我添加评论以及将条件作业添加到管道时,它会添加一个全新的“分离”管道,仅包含该作业。这个失败了。知道如何阻止吗?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2015-10-12
      • 2017-02-27
      • 2015-07-14
      • 1970-01-01
      • 2018-01-05
      • 2022-01-19
      相关资源
      最近更新 更多