在gitlab中定义多个并行矩阵作业之间的一对一依赖关系

问题描述 投票:0回答:1

在 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 中引入)。这些是更高级的指令。

gitlab gitlab-ci
1个回答
0
投票

这在

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

最终会创建

© www.soinside.com 2019 - 2024. All rights reserved.