如何让 Gitlab CI Pipeline 始终运行某些作业,而仅在合并请求时运行其他作业?

2024-04-09

TL/DR:我的目标是拥有一个 Gitlab (CE-12.4.2) 管道,该管道仅在合并请求上执行某些作业,而始终执行其他作业(在合并请求上和所有正常推送上)。必须如何.gitlab-ci.yml想要这样做吗?

我的用例:我有一个运行大量作业的大型管道(测试、验证、dep、构建、文档......)。现在,我添加了一个临时环境(使用 kubernetes),并让管道构建一个新映像并将其部署在临时环境中。这使我能够立即打开更改后的(网络)应用程序并查看更改的行为和外观,而无需在本地检查它们。现在,构建一个映像并将其部署到暂存对于每次推送来说都太耗费资源,因此我只希望在有人创建合并请求供我审查时部署到暂存。

一个非常简单的例子:

install:
  script: ...

test:
  script: ...

build-image:
  script: ...
  only: [merge_requests]

deploy-staging:
  script: ...
  only: [merge_requests]

对于所有正常的推送,作业install and test应该被执行。

对于合并请求,作业install, test, build-image and deploy-staging应该被执行。

我尝试过的:Gitlab有这个功能来定义only: [merge_requests]在作业上,这会导致该作业仅在为合并请求执行管道时才执行。听起来正是我正在寻找的东西,但有一个很大的问题。一旦将该属性应用于管道中的一项作业,则该管道中不具有该属性的所有其他作业在合并请求内执行时将从管道中删除。起初这对我来说似乎是一个错误,但实际上是记录的行为 https://docs.gitlab.com/ee/ci/merge_request_pipelines/index.html#configuring-pipelines-for-merge-requests:

In the above example, the pipeline contains only a test job. Since the build and deploy jobs don’t have the only: [merge_requests] parameter, they will not run in the merge request.

为了将所有其他作业重新引入管道以进行合并请求,我必须申请only: [merge_requests]到所有其他工作。这种方法的问题是,现在这些常规作业不再针对正常的 git-push 执行。而且我没有办法将这些常规作业重新引入管道进行正常推送,因为 Gitlab 不支持only: [always]或类似的东西。

现在我也注意到了only语法是弃用的候选者,人们应该更喜欢rules相反,所以我看了一下。这种方法存在多个问题:

  • 检测的唯一方法是rules是否为合并请求执行管道是为了评估与合并请求相关的变量,例如$CI_MERGE_REQUEST_ID。不幸的是,这些变量仅在以下情况下存在:only: [merge_requests]使用,这会再次引入上述问题。
  • 规则只允许有条件地应用其他属性,所以我仍然必须使用only, except or when属性来实际从管道中删除或添加作业。不幸的是 Gitlab 不支持类似的东西only: [never] or when: never,所以我无法实际删除或添加作业。

我还尝试让工作依赖于另一个使用need or dependencies属性,这似乎对作业是否包含在管道中没有影响。

我拼命尝试的最后一件事是始终包含所有工作并将它们标记为when: manual通过按下按钮手动触发。这在某种程度上可行,但非常乏味,因为部署到暂存是一个多作业过程,每个作业都需要相当长的时间才能完成。因此,我会看到合并请求,按下第一个作业的按钮,等待 5 分钟,按下下一个按钮,再次等待 5 分钟,然后才能使用暂存。对于许多小的合并请求,这会占用我大量的时间,并且不是一个有效的解决方案。我也不能只将这些作业中的第一个标记为手动,因为 Gitlab 将跳过该作业并按顺序执行后面的作业(再次强调,needs and dependencies在处理手动触发的作业时似乎对此没有影响)。

我有点困惑的是,在网上搜索后,我发现没有人遇到同样的问题。要么我是唯一一个只想为合并请求执行某些作业而不排除所有其他作业(这似乎极不可能)的 Gitlab 用户,要么我错过了一些明显的东西(这似乎更有可能)。我是否遗漏了什么或者 Gitlab 真的不支持这个用例?


来自之前的回答 https://stackoverflow.com/a/59803481/6309:

但有一个问题。此示例在创建 MR 后为每次推送启动两个管道。一个为only: [branch], 一个用于only: [merge_requests]

检查是否是最后一个亚搏体育appGitLab 13.8 https://about.gitlab.com/releases/2021/01/22/gitlab-13-8-released/#use-both-branch-and-mr-pipelines-without-duplication(2021 年 1 月)可以帮助:

同时使用分支和 MR 管道,无需重复

以前不可能先为分支运行管道,然后再切换到合并请求管道 https://docs.gitlab.com/ee/ci/merge_request_pipelines/创建 MR 时。

因此,在某些配置中,如果合并请求已在分支上打开,则推送到分支可能会导致重复的管道:分支上有一个管道,另一个用于合并请求。

现在您可以使用新的$CI_OPEN_MERGE_REQUESTS在 CI 配置中预定义环境变量,以便在正确的时间从分支管道切换到 MR 管道,并防止冗余管道。

See 文档 https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-environment-variables-reference and Issue https://gitlab.com/gitlab-org/gitlab/-/issues/201845.

用户2993689 https://stackoverflow.com/users/2993689/user2993689指出在评论 https://stackoverflow.com/questions/59801462/how-to-have-a-gitlab-ci-pipeline-run-some-jobs-always-and-other-jobs-only-on-mer/65864572?noredirect=1#comment123755163_65864572到文档中的类似示例:

避免重复管道 https://docs.gitlab.com/ee/ci/jobs/job_control.html#avoid-duplicate-pipelines

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Gitlab CI Pipeline 始终运行某些作业,而仅在合并请求时运行其他作业? 的相关文章

随机推荐

  • 如何在CKEditor中动态切换文本方向

    在我当前的项目中 用户可以用英语和希伯来语输入文本 根据当前文本自动定义方向会很棒 例如 如果文本包含希伯来语符号 则方向应为 RTL 但如果文本不包含希伯来语 则方向为 LTR 文本可以随时更改 我认为最好的解决方案是动态切换方向 就像在
  • 有没有办法强制 NHTMLUNIT 忽略页面 JavaScript 错误并继续脚本执行?

    我是 ASP NET 和 C 项目的一部分 我们正在努力使我们的 asp net 门户对 Google 搜索引擎友好 https developers google com webmasters ajax crawling https de
  • 将事件日志组织到文件夹中

    我想要创建多个服务 并且希望它们将每个服务记录在我指定的同一目录 文件夹下的日志条目中 这样当我打开 Windows 事件查看器时 我可以看到它们全部放置在一个文件夹中 例如 service1 将登录到 service1 log servi
  • jQuery 禁用/启用提交按钮

    我有这个 HTML
  • 在cmake中设置boost的最低版本

    我想定义系统上可用的最低增强版本 我尝试了以下方法 不幸的是 这不起作用 因为它尝试在系统上仅提供 boost 1 40 0 的情况下进行编译 SET Boost USE STATIC LIBS OFF SET Boost USE MULT
  • WPF/控制台混合应用程序

    我编写了一个可以在命令行上运行或使用 WPF UI 运行的应用程序 STAThread static void Main string args Does magic parse args and sets IsCommandLine to
  • C++ 多重定义错误

    我的 Headers h 文件包含基本的 C 标头 include
  • 在 Sequelize 迁移中创建关联

    节点js 续集4 41 尝试通过另一个表制作两个多对多关系的模型 跑步与续集 cli 例如 sequelize model generate name Camera attributes name string sn string 这里是模
  • 复杂圆图

    我花了很多时间尝试在 SVG D3 js 中复制所附的图表 我最接近的是使用附加的代码 我已经探索过使用树函数 但只能创建一组圆圈 所附代码的问题是 通过手动输入每个圆圈必须位于的像素坐标 很难使其看起来平滑且智能 作为信息 数据集只会为这
  • 在哪里记录 C 或 C++ 中的函数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个包含多个文件的 C 程序 所以我有 例如 stuff c它实现了一些功能 并且stuff h与函数原型 我应该如何在注释中记录功能 我应
  • * 或 & 的位置重要吗? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中 为什么星号在变量名之前 而不是在类型之后 https stackoverflow com questions 398395 in c why is the asterisk before th
  • 如何创建不重复的随机数?

    我正在尝试为老年之家创建一款宾果游戏 我能够使用用于扫描数组的随机数生成器来制作一个 但问题是需要很长时间 2 分钟 来搜索数组并确保没有重复的双精度数 我做了一些研究 发现 c 中称为伪随机的东西在创建时不会重复数字 但代码看起来非常复杂
  • 枚举 Node.js net.Server 连接

    是否可以循环遍历与某个连接建立的连接相对应的所有套接字对象 网络服务器 http nodejs org api net html net class net serverNode js 中的实例 最终 我需要关闭所有连接 似乎执行此操作的唯
  • 如何使大循环的联合范围更快

    我有一个子程序 在循环中进行大约 5000 次迭代后 它变得非常慢 否则很快 Windows 8 1 专业版 64 位 Excel 2013 15 0 4701 1001 MSO 15 0 4701 1000 64 位 Sub UnionS
  • 如何为DBGrid特殊单元格着色?

    我有一列只有 是 和 否 值 我想要如果列值为 是 则只有单元格背景颜色为红色 否则 否 则背景颜色为黄色 但这段代码为整行着色 if ADOTable1 FieldByName Clubs AsString yes then begin
  • C函数分析(地址似乎有偏移)

    我正在尝试使用 finstrument functions 选项来分析函数调用 基本上 我所做的是将以下内容写入任何已编译的源代码中 static int stepper 0 void cyg profile func enter void
  • 根据列中的值对完整行进行着色

    我需要根据列中单元格的值对整个 Excel 行进行着色 我有三列 Item Price and Status 并且想要为该行着色 如果Status值为 已交付 至绿色 拒绝 对红色 WIP 至橙色 您可以为此使用 非 VBA 条件格式 如果
  • Boost::MPL Vector 和 For_Each:如何将 avector 打印为元组?

    想象一下 我们有一个 mpl vector 我们想将其打印 例如 cout 为这样的字符串 int string char 如何使用 boost mpl 来做这样的事情 创建一个函子并调用 boost for each struct pri
  • 如何使用一个可观察量的状态来跳过另一个可观察量的值?

    通过一个简短的例子可以最好地解释这一点 假设这是我想要过滤的可观察源 Observable interval 1 TimeUnit SECONDS 我使用复选框来处理过滤器状态 当未选中该框时 我想跳过所有值 我使用 RxAndroid 来
  • 如何让 Gitlab CI Pipeline 始终运行某些作业,而仅在合并请求时运行其他作业?

    TL DR 我的目标是拥有一个 Gitlab CE 12 4 2 管道 该管道仅在合并请求上执行某些作业 而始终执行其他作业 在合并请求上和所有正常推送上 必须如何 gitlab ci yml想要这样做吗 我的用例 我有一个运行大量作业的大