在 gitlab 管道中,我可以指定一个作业,例如:
build:
parallel:
matrix:
- architecture: [x86_64, arm]
operating_system: [linux, macos]
这将创建 4 个可以并行运行的独立作业:
build [x86_64, linux]
build [x86_64, macos]
build [arm, linux]
build [arm, macos]
我还可以指定另一项工作,例如:
test:
needs:
- job: build
parallel:
matrix:
- architecture: [x86_64, arm]
operating_system: [linux, macos]
这将创建另一个名为
test
的作业,该作业将等待所有 4 个 build
作业运行后再开始。
但是,如果我想要 4 个独立的
test
工作,每个 architecture
和 operating_system
的组合各有一个,就像 build
工作一样,该怎么办?我想要这样的东西:
test:
parallel:
matrix:
- architecture: [x86_64, arm]
operating_system: [linux, macos]
needs:
- job: build
parallel:
matrix:
- architecture: [x86_64, arm]
operating_system: [linux, macos]
但是,我假设这会创建 4 个单独的
test
作业,每个作业都依赖于所有 4 个单独的 build
作业。我想要的是每个 test
作业仅依赖于具有相同变量的单个 build
作业。过去,我尝试过在needs
数组中使用变量,但这是在引入needs:parallel:matrix
之前,无论如何它都不起作用。你可以使用 needs:parallel:matrix
中的变量来实现这一点吗?比如:
test:
parallel:
matrix:
- architecture: [x86_64, arm]
operating_system: [linux, macos]
needs:
- job: build
parallel:
matrix:
- architecture: [$architecture]
operating_system: [$operating_system]
编辑:这与建议的重复相差甚远。这是关于让单个作业仅依赖于其他单个作业,而不是整个阶段依赖于整个先前的阶段。这个问题可以通过简单地使用 gitlab 12.2 中引入的
needs
关键字来解决,如该问题的回复中所述。我的问题是关于 parallel:matrix
(在 gitlab 15.9 中引入)和 needs:parallel:matrix
(在 gitlab 16.3 中引入)。这些是更高级的指令。
这在
parallel:matrix
看来还不可能实现。但是,您可以使用带有 spec:inputs
的模板获得类似的行为
有用的指南:
请注意,这是一个特殊关键字,必须放在 CI/CD 模板的标头中,位于分隔 yaml 指令与实际 yaml 文档的
---
之上。
因此,对于问题中的示例,您将创建一个包含 2 个输入的模板文件:
architecture
和 operating_system
,以及两个作业:
# build-test.yml
spec:
inputs:
name:
type: architecture
description: "The architecture to build for."
options:
- x86_64
- arm
type: operating_system
description: "The operating_system to build for."
options:
- linux
- macos
---
build-$[[ inputs.architecture ]]-$[[ inputs.operating_system ]]:
script:
- echo "Building for $[[ inputs.architecture ]]$[[ inputs.operating_system ]]"
test-$[[ inputs.architecture ]]-$[[ inputs.operating_system ]]:
needs:
- build-$[[ inputs.architecture ]]-$[[ inputs.operating_system ]]
script:
- echo "Testing for $[[ inputs.architecture ]]$[[ inputs.operating_system ]]"
然后,您可以将主 CI/CD 配置中的模板包含在 arch 和 os 的所有组合中:
# .gitlab-ci.yml
include:
- local: 'build-test.yml'
inputs:
architecture: x86_64
operating_system: linux
- local: 'build-test.yml'
inputs:
architecture: arm
operating_system: linux
- local: 'build-test.yml'
inputs:
architecture: x86_64
operating_system: macos
- local: 'build-test.yml'
inputs:
architecture: arm
operating_system: macos
最终会创建