当前一阶段至少有一个作业成功时,如何自动运行 GitLab CI 作业?

Tob*_*ann 7 gitlab gitlab-ci gitlab-ci-runner

给定两个阶段,第一阶段有两个工作,第二阶段有一个工作:

stages:
  - a
  - b

foo:
    stage: a
    when: manual

faa:
    stage: a
    when: manual

bar:
    stage: b
    when: i_dont_know
Run Code Online (Sandbox Code Playgroud)

当前一阶段中的至少一项工作成功时,我想运行第二阶段。

但是,文档仅显示以下选项when

  • on_success- 仅当早期阶段的所有作业都成功时才执行作业,或者因为它们具有 而被视为成功allow_failure: true
  • on_failure- 仅当早期阶段至少有一项作业失败时才执行作业。
  • always- 无论早期阶段的作业状态如何,都执行作业。

有什么技巧可以实现我的目标吗?

SPM*_*MSE 0

我认为您想要的是 GitLab CI 管道的 DAG 实现。这样就可以在作业之间添加依赖关系以创建非循环图。

最小的例子:

stages:
  - a
  - b

foo:
  stage: a
  when: manual
  allow_failure: true
  script:
    - echo "hello world"

faa:
  stage: a
  when: manual
  allow_failure: true
  script:
    - echo "hello world"

bar:
  stage: b
  needs:
    - job: foo
      optional: true
    - job: FAA
      optional: true
  script:
    - echo "hello world"
Run Code Online (Sandbox Code Playgroud)

这样,如果前面的任何一个阶段的作业通过,第二阶段就会开始执行,但我认为这可能仍然不是您真正想要的。

因此,考虑到您的管道执行将包含阶段 A 中的两个作业,如果 A 中的两个依赖作业都成功,​​我提供的示例只会运行第二阶段的作业。如果任何作业被省略并且没有放入管道中,这仍然可以工作,因为依赖项是可选的,但是 - 这是要点 - 如果指定了任何依赖项并且相应的作业是一个管道执行的一部分,那么needs将进行逻辑 AND,以便在开始作业之前需要满足所有依赖关系。

如果您可以保证阶段 A 中的一项作业始终是您的管道的一部分,您仍然可以将其添加为依赖项。

如果你的阶段 B 甚至不依赖于前一个阶段,也可以提供一个空的需求数组,这相当于“立即开始这项工作 - 不考虑哪个阶段先出现”

# this job would start at the same time as jobs in stage a
job-def:
  stage: b
  script:
    - echo "hello world"
  needs: []
Run Code Online (Sandbox Code Playgroud)