首页 > 解决方案 > 在 .gitlab.ci.yml 中并行运行作业

问题描述

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

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

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

标签: gitlabyamlgitlab-cipipeline

解决方案


作为一般规则,同一阶段内的任何作业都是并行运行的。在这些作业中,您可以定义指定给定作业何时运行的规则。请注意,需要手动启动作业将导致您的整个管道在达到手动作业时被列为“阻塞”。同样,您需要将一些作业设置为,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 个许可证,但您的测试仍会自动运行并且您不需要手动触发它们,这也允许您更轻松地定义下游作业以在测试通过时运行。


推荐阅读