有没有办法在 GitLab CI 作业中使用 OR 条件满足需求

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

我正在尝试使用“.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
才会启用。 Pipeline Status

有没有办法可以像

needs: [Test_job1 or Test_job2]
那样使用?

gitlab gitlab-ci
2个回答
9
投票

needs:optional:
关键字的命名令人困惑。它用于当由于其他管道/作业逻辑而导致管道中作业
可能不存在
时设置needs:要求(作业可以可选地存在)。 但是,管道中存在的任何可选
needs:job:
名称 do 都将是必需的。

我看到了一些选项来close到您想要的管道:

自动化路径

您可以在 Test_job 作业中使用

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
,因此您的工作已经是可选的。 如果不能信任您的人员通过手动作业自行管理“部署前测试”依赖项,那么请将人员排除在循环之外并查看上面的“自动化路径”。


0
投票

除了现有的答案。如果您想使用工件以及依赖作业,您可以像下面这样使用它。因此,在这种情况下您不需要使用

dependencies

needs:
    - job: job1
      optional: true
      artifacts: true
    - job: job2
      optional: true
      artifacts: true
© www.soinside.com 2019 - 2024. All rights reserved.