在 .gitlab.ci.yml 中并行运行作业

Posted

技术标签:

【中文标题】在 .gitlab.ci.yml 中并行运行作业【英文标题】:Run jobs in parallel in .gitlab.ci.yml 【发布时间】:2021-11-21 20:29:11 【问题描述】:

基本上,我目前在服务器上有 5 个测试许可证。当我手动触发它时,我有一个运行测试脚本的管道。它连接到许可证服务器并获得一个浮动许可证。这种方法现在很好,但很快我会想要扩展它,以便当应用程序需要测试时,我可以并行运行多个管道来运行多个测试。事情就是这样,我只想有时根据我需要测试的内容并行运行它们,并且我想手动触发每个管道。例如,有一天我可能只想在一项作业上运行测试脚本,因此这需要运行一个管道。另一天我可能想同时运行 3 个作业,或者另一天我可能想在一天中运行 5 个作业,但可能与正在运行的管道重叠,因此它需要运行自己的管道。

我的问题是,如何在 gitlab yml 文件中进行设置。

如果有人也可以提供一个有用的基本示例!

【问题讨论】:

【参考方案1】:

作为一般规则,同一阶段内的任何作业都是并行运行的。在这些作业中,您可以定义指定给定作业何时运行的规则。请注意,需要手动启动作业将导致您的整个管道在达到手动作业时被列为“阻塞”。同样,您需要将一些作业设置为allow_failure: true,否则它们将阻止下一阶段的执行。管道示例:


stages:
  - build
  - test

build_job:
  image: alpine:latest
  stage: build
  script: 
    - echo "hello world"

test_job_1: 
  image: alpine:latest
  stage: test
  rules:
    - when: manual
  script: 
    - echo "test 1"


test_job_2: 
  image: alpine:latest
  stage: test
  rules:
    - when: manual
  script: 
    - echo "test 2"

当您运行上述管道时,您必须在两个作业上手动单击“播放”才能启动它们。

不过,我会注意到,这感觉像是一种反模式。听起来您想保留 5 个测试许可证,以确保您不会,例如,有 6 个作业正在运行并且由于没有免费许可证而导致作业失败。如果是这样,这就是 resource_group 关键字旨在解决的确切用例之一。添加到同一资源组的作业不会同时运行(即使它们在不同的管道中),因此您可以拥有test_1 资源组、test_2 资源组等,并且这些作业将始终自动并行运行,但即使跨不同的管道,也永远不会一次运行该作业的多个实例。这可以确保您只使用 5 个许可证,但您的测试仍会自动运行,您无需手动触发它们,这也使您可以更轻松地定义在测试通过时运行的下游作业。

【讨论】:

以上是关于在 .gitlab.ci.yml 中并行运行作业的主要内容,如果未能解决你的问题,请参考以下文章

在此上下文中不允许 Gitlab CI YML 映射值

Gitlab CI 设置错误 - 找不到 JavaScript 运行时

C# - 计时器滴答时间比指定的间隔更短,导致重复作业并行运行

在 Azure Synapse 中并行作业运行期间避免重复

Docker 并行运行 cron 作业

如何防止相同类型的两个管道 jenkins 作业在同一节点上并行运行?