如何在 Gitlab 中禁用“分离”管道?

Posted

技术标签:

【中文标题】如何在 Gitlab 中禁用“分离”管道?【英文标题】:How to disable 'detached' pipelines in Gitlab? 【发布时间】:2021-10-27 11:47:50 【问题描述】:

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

一份工作有“规则”声明:

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

问题是rules 的存在导致 Gitlab 运行“分离管道”,这不是我的意图,而且很烦人。有什么方法可以禁用那些“分离”的管道,但保留rules 部分?

【问题讨论】:

【参考方案1】:
rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: never
    - changes:
      - foo/**/*
      - foo_scenarios/**/*
      - .gitlab-ci.yml
      when: always

我没有对此进行测试,但我相信这就是您正在寻找的。 This page 和 this one too 都易于导航,对于找到基本 gitlab-ci.yml 问题的答案非常有帮助。

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

【讨论】:

成功了,谢谢。需要为每个带有规则的作业添加它。【参考方案2】:

事情实际上更复杂,因为这取决于具体情况。所以这个解决方案可能对你有用,但其他人可能需要稍微调整一下。

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

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

我建议研究工作流程:它允许您定义默认行为。只有具有特殊规则的作业才需要规则。

这是一个例子:

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

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

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

【讨论】:

不一定需要重复配置(取决于您的意思),因为可以将规则添加到作业中,然后使用 extends 关键字或使用 yaml 扩展到其他作业锚点。

以上是关于如何在 Gitlab 中禁用“分离”管道?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gitlab 中以分离模式运行作业?

在 GitLab Pipelines 中,有没有办法在分离合并请求时运行管道?

为啥我在 Gitlab 合并请求中收到“由于未验证用户而导致管道失败”和“分离的合并请求管道”?

如何在 Gitlab 中成功的管道结束时创建合并请求?

如何在 Gitlab 中基于管道变量运行作业?

Gitlab-ci:如果 MR 存在则触发 merge_request 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行