我有一个构建作业,可以在并行作业中构建多个变体:
build-firmware:
stage: build
script: |
echo "Building ${BOARD}_${BUILD_TYPE}"
artifacts:
paths:
- firmware_${BOARD}_${BUILD_TYPE}.bin
parallel:
matrix:
- BOARD: [board1, board2]
BUILD_TYPE: [debug, release]
这将创造 4 个就业机会,即
board1_debug
、board1_release
、board2_debug
、board2_release
。
我还有一个发布作业,它也具有相同的矩阵,并且应该从相应的构建作业中发布工件。由于构建需要很长时间,我并不总是等待所有构建完成,所以我只是取消不需要的构建。在这种情况下,我需要在发布作业中进行依赖项/需求设置,以依赖于相应的构建变体,而不是所有构建作业。否则它就会被跳过,因为有取消的作业。
我正在寻找这样的语法,但显然在 gitlab 中的
needs
指令中不可能有占位符:
release-firmware:
stage: release
needs:
- job: build-firmware:${BOARD}:${BOOT_TYPE}:${BUILD_TYPE}
script: |
echo "Releasing firmware for ${BOARD} ${BOOT_TYPE} ${BUILD_TYPE}"
parallel:
matrix:
- BOARD: [board1, board2]
BUILD_TYPE: [debug, release]
使用
parallel:matrix
是不可能的,但您可以使用 inputs。它的工作原理类似于函数。使用 spec:inputs
定义添加到管道时可以填充到可重用 CI/CD 配置文件中的参数。
首先在另一个文件(
build-firmware.yml
)中,我们定义可重用代码(注意规范和函数之间应该有---
:
# build-firmware.yml
spec:
inputs:
BOARD:
description: "The Board."
options: ['board1', 'board2']
BUILD_TYPE:
description: "The build type."
options: ['debug', 'release']
---
"build-firmware-$[[ inputs.BOARD ]]-$[[ inputs.BUILD_TYPE ]]":
stage: $[[ inputs.BUILD_TYPE ]]
script: |
echo "Building $[[ inputs.BOARD ]]_$[[ inputs.BUILD_TYPE ]]"
artifacts:
paths:
- firmware_$[[ inputs.BOARD ]]_$[[ inputs.BUILD_TYPE ]].bin
"release-firmware-$[[ inputs.BOARD ]]-$[[ inputs.BUILD_TYPE ]]":
stage: $[[ inputs.BUILD_TYPE ]]
script: |
echo "Releasing firmware for $[[ inputs.BOARD ]] $[[ inputs.BUILD_TYPE ]]"
needs:
- job: build-firmware-$[[ inputs.BOARD ]]-$[[ inputs.BUILD_TYPE ]]
然后在您的
.gitlab-ci.yml
中,我们将它们包含在值中:
# .gitlab-ci.yml
include:
- local: 'build-test.yml'
inputs:
BOARD: board1
BUILD_TYPE: debug
- local: 'build-test.yml'
inputs:
BOARD: board2
BUILD_TYPE: release