如何在 Gitlab 中禁用 'detached' 管道?

How to disable 'detached' pipelines in Gitlab?

我们有一个普通的存储库,其中包含一些代码和测试。

一个作业有 'rules' 个语句:

  rules:
    - changes:
      - foo/**/*
      - foo_scenarios/**/*
      - .gitlab-ci.yml

问题是 rules 的存在导致 Gitlab 运行 'detached pipeline',这不是我的本意,这很烦人。有没有办法禁用那些 'detached' 管道,但保留 rules 部分?

rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: never
    - changes:
      - foo/**/*
      - foo_scenarios/**/*
      - .gitlab-ci.yml
      when: always

我还没有测试过这个,但我相信这就是你要找的。 This page and this one too 都易于导航,对于找到基本 gitlab-ci.yml 问题的答案非常有帮助。

Edit- Gitlab 会按顺序评估规则,一旦满足其中一个条件,它就会停止评估后续规则。在这种情况下,它将首先评估 if: '$CI_PIPELINE_SOURCE == "merge_request_event"',如果评估为真,则不会检查更多规则。如果第一条规则的计算结果为假,它将继续执行下一条规则。

实际情况更复杂,具体情况视具体情况而定。所以这个解决方案可能适合你,但其他人可能需要稍微调整一下。

这是我的理解。一旦您添加规则:到您的管道,您将覆盖一些默认值,这些默认值会阻止开始创建合并请求管道。

@Benjamin 建议的解决方案有效,但正如您所注意到的,需要将其添加到每项工作中。所以对于大多数作业来说,需要大量重复配置。

我建议查看工作流:它允许您定义默认行为。您只需要为有特殊规则的工作制定规则。

这是一个例子:

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

如果你想更深入地了解这种行为,我已经写了一篇关于这个的文章(朋友 link 对于任何没有 Medium 订阅的人):

Fix GitLab CI Duplicate Pipelines in Merge Requests when Using rules: