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

Sag*_*hav 17 gitlab gitlab-ci

我正在尝试使用“.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
Run Code Online (Sandbox Code Playgroud)

我的目标是要么通过Test_job1要么Test_job2通过Deploy_job应该启用。但是使用上面的代码,我无法这样做,因为Deploy_job只有当前两个测试作业都通过时才启用。 管道状态

有没有办法可以像这样使用某些东西needs: [Test_job1 or Test_job2]?

ash*_*ium 6

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

我看到了一些接近您想要的管道的选项:

自动化路径

您可以在 Test_job 作业中使用rules:关键字有条件地将它们添加到管道中。

决定运行哪个 Test_job 的人(基于您正在使用的事实的假设when: manual)可能遵循某种决策逻辑 - 或者团队可以决定预设的决策逻辑。然后,您可以将该逻辑构建到您的条件中,以确定您的作业needs:if:是否存在于管道中——然后.Test_job#Deploy_job:

例如,如果一个测试应在默认分支上运行,另一个测试应在功能分支上运行,则可以使用以下命令自动运行相关的 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
Run Code Online (Sandbox Code Playgroud)

手动路径

如果您仍然需要人员参与触发测试作业或部署作业,您可以换回when:manual原来的位置。when:on_success

真正的手动路径

或者,如果您真的只是希望您的人员手动做出Test_job:临时决策,那么只需needs:从您的关键字中删除关键字Deploy_job:并使用现有的 Stage 依赖结构即可。键when: manual隐式设置allow_failure: true,因此您的工作已经是可选的。如果不能信任您的人员通过手动作业自行管理“部署前测试”依赖项,那么请将人员排除在循环之外并查看上面的“自动化路径”。