Gitlab-CI:如果作业 A 失败,指定作业 C 应在作业 B 之后运行

Seb*_*020 5 gitlab gitlab-ci

假设您有以下管道:

Job A (deploy) -> Job B (test) -> Job C (remove test deployment)
Run Code Online (Sandbox Code Playgroud)

管道应部署测试映像并在成功部署后对其进行测试。测试后,我想运行一个清理脚本,不管测试输出如何,但前提是测试映像(作业 A)已部署。

总结一下:我希望 Gitlab 只有在 Job A 成功时才执行 Job C ,但在 Job B 之后

行不通的事情:

  • when: on-failure (作业 A 或作业 B 可能失败,但只有作业 A 重要)
  • when: always (也许作业 A 失败导致作业 C 失败)
  • when: on-success (要求所有工作都成功)

我知道 GitLab 有一个名为 DAG Pipelines 的功能,它允许您使用needs关键字指定对其他作业的多个依赖项,但遗憾的when是,该关键字始终适用于所有先前的作业。所以你不能说这样的话:

Job A (deploy) -> Job B (test) -> Job C (remove test deployment)
Run Code Online (Sandbox Code Playgroud)

我错过了什么还是没有办法实现这种行为?

con*_*ion 9

所述needsDAG字段可用于有条件地执行清除(作业C),如果作业B失败或成功,而不是在它被跳过,因为作业A失败。

创建 2 个符合以下布尔条件的清理作业:

  • (Job A succeeds and Job B succeeds):如果之前的所有任务都成功(作业 A 和作业 B),我们可以使用when: on_success. 但是,如果作业 A 成功而作业 B 失败,则不会触发。
  • (Job A succeeds and Job B fails):为了通过未触发的清理(作业 C)规避前面的情况,我们利用了这样一个事实:如果作业 B 失败,这意味着作业 A 在管道中成功。通过创建重复的清理任务并needs在作业 B 和 上指定标记when: on_failure,清理任务将仅在作业 A 成功而作业 B 失败时运行。

重申:如果(Job A succeeds and Job B succeeds)(Job A succeeds and Job B fails),则清理作业将运行,通过布尔表达式缩减相当于(Job A succeeds).

这里一个明显的警告是现在有 2 个清理作业显示在管道中;然而,它们是相互排斥的,只能执行一个。

这是一个示例配置:

stages:
  - deploy
  - test
  - cleanup

deploy_job:
  stage: deploy
  script:
    - echo Deployed
    - "true"
  when: always

test_job:
  stage: test
  script:
    - echo Executing tests
    - "true"
  when: on_success

# a YAML anchor reduces repetition
.cleanup_job: &cleanup_job
  stage: cleanup
  script:
    - echo Cleaned up deployment

cleanup_deployment_success:
  when: on_success
  <<: *cleanup_job

cleanup_deployment_failure:
  needs: ["test_job"]
  when: on_failure
  <<: *cleanup_job
Run Code Online (Sandbox Code Playgroud)

在各种有意失败的情况下,会产生以下管道状态:

  • 失败的管道作业 A 成功,作业 B 失败
  • 失败的管道作业 A 失败,作业 B 被跳过
  • 通过管道作业 A 成功,作业 B 成功

从逻辑上讲,这表明无论Job B 成功还是失败,只要Job A 成功,Job C 就会运行。此外,故障状态保留在整个管道中。


Von*_*onC 7

\n

需求 DAG 字段可用于在C作业失败或成功时有条件地执行清理(作业)B,但当作业因作业失败而被跳过时则不执行A

\n
\n

GitLab 13.11(2021 年 4 月)可能会改变这种情况

\n
\n

CI/CD 管道中的可选 DAG(\'需要:\')作业

\n

GitLab CI/CD 中的有向无环图 (DAG) 允许您使用needs语法将作业配置为早于其阶段启动(一旦相关作业完成)。>\n我们还有rulesonlyexcept关键字,它们确定是否将作业添加到管道中。

\n

不幸的是,如果您needs与这些其他关键字结合使用,当依赖作业未添加到管道时,您的管道可能会失败。

\n

在此版本中,我们将optional关键字添加到needsDAG 作业的语法中。

\n
    \n
  • 如果依赖作业被标记为optional存在于管道中,则该needs作业将忽略它。
  • \n
  • 如果作业正在optional管道中并且存在,则needs作业会在开始之前等待其完成。
  • \n
\n

随着 DAG 的日益普及,这使得安全地结合rulesonly和变得更加容易。except

\n

https://about.gitlab.com/images/13_11/optional.png -- CI/CD 管道中的可选 DAG(\'需要:\')作业

\n

请参阅文档问题

\n
\n