我正在尝试使用“.gitlab.ci.yml”文件中的“needs”为前一阶段作业创建具有“OR”条件的作业依赖项,但无法找到解决方案。
.gitlab-ci.yml 文件 ->
stages:
- build
- test
- deploy
Build_job:
stage: build
script:
- echo "hello from build job"
Test_job1:
stage: test
script:
- echo "Start test 1"
when: manual
Test_job2:
stage: test
script:
- echo "Start test 2"
when: manual
Deploy_job:
stage: deploy
script:
- echo "Start deploying the job"
when: manual
needs:
- job: Test_job1
optional: true
- job: Test_job2
optional: true
我的目标是
Test_job1
或 Test_job2
已通过 Deploy_job
应启用。
但使用上面的代码,我无法这样做,因为只有当前两个测试作业都通过时,Deploy_job
才会启用。
有没有办法可以像
needs: [Test_job1 or Test_job2]
那样使用?
needs:optional:
关键字的命名令人困惑。它用于当由于其他管道/作业逻辑而导致管道中作业可能不存在时设置
needs:
要求(作业可以可选地存在)。
但是,管道中存在的任何可选 needs:job:
名称 do 都将是必需的。
我看到了一些选项来close到您想要的管道:
rules:
关键字有条件地将它们添加到管道中。
决定运行哪个 Test_job 的人(基于您正在使用
when: manual
的事实的假设)可能遵循某种决策逻辑 - 或者团队可以决定预设的决策逻辑。 然后,您可以将该逻辑构建到您的 needs:if:
条件中,以确定管道中是否存在您的 Test_job#
作业 exist——然后 Deploy_job:
只需要添加到管道中的 Test_jobs。
例如,如果一个测试应在默认分支上运行,另一个测试应在功能分支上运行,则可以使用以下命令自动运行相关的 Test_job 并使 Deploy_job 依赖于它:
Test_job1:
stage: test
script:
- echo "Start test 1"
# this job is only added for pipelines on the default branch
rules:
- if $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
when: on_success
- when: never
Test_job2:
stage: test
script:
- echo "Start test 2"
# this job is only added for pipelines NOT on the default branch
rules:
- if $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH
when: on_success
- when: never
Deploy_job:
stage: deploy
script:
- echo "Start deploying the job"
# this is the default value, it's added here to show the automation difference from the question's pipeline
rules:
- when: on_success
# depend on Test_job1 AND Test_job2 if they individually exist in the pipeline
needs:
- job: Test_job1
optional: true
- job: Test_job2
optional: true
如果您仍然需要人员参与触发测试作业或部署作业的循环,您可以将
when:manual
换回原位 when:on_success
。
或者,如果您确实只想让人类手动临时做出
Test_job:
决策,那么只需从 needs:
中删除 Deploy_job:
关键字并使用现有的 Stage 依赖结构即可。 when: manual
键隐式设置 allow_failure: true
,因此您的工作已经是可选的。 如果不能信任您的人员通过手动作业自行管理“部署前测试”依赖项,那么请将人员排除在循环之外并查看上面的“自动化路径”。
除了现有的答案。如果您想使用工件以及依赖作业,您可以像下面这样使用它。因此,在这种情况下您不需要使用
dependencies
。
needs:
- job: job1
optional: true
artifacts: true
- job: job2
optional: true
artifacts: true