在 .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 设置错误 - 找不到 JavaScript 运行时