首页 > 解决方案 > GitLab CD/CD:如果前一个阶段 A 失败,是否有办法允许手动执行管道阶段 B,否则自动执行阶段 B?

问题描述

考虑由两个后续阶段组成的 GitLab CI/CD 管道:A 和 B。

如果阶段 A 成功,我希望阶段 B 自动执行。但是如果 A 阶段失败,我不希望 B 阶段自动执行,但仍然有可能手动强制执行 B 阶段。

我怎样才能做到这一点?

标签: continuous-integrationgitlabgitlab-cigitlab-ce

解决方案


我可以看到至少有两种方法可以实现这一点(当您的管道失败时,您将需要再次手动触发整个管道,而不仅仅是一个阶段):

  1. 在阶段 B 中标记作业时:始终执行作业,而不管先前阶段的作业状态如何。
firstFailingJob:
  stage: test
  script:
    - echo I will always fail
    - exit 1

secondExecuteWhenManualTrigger:
  stage: deploy
  script:
    - echo I should run even when first failed when triggered manually
  rules:
    - if: '$CI_PIPELINE_SOURCE == "web"'
      when: always
    - when: on_success

请注意,整个管道的结果将失败,如下所示。 2. 使用allow_failure: true始终为手动触发执行第二个作业 标记可能失败的作业以失败而不影响 CI 套件的其余部分。

firstFailingJob:
  stage: test
  script:
    - echo I will always fail
    - exit 1
  rules:
    - if: '$CI_PIPELINE_SOURCE == "web"'
      allow_failure: true
    - allow_failure: false
...

整个管道的结果将通过警告,如下所示。 允许失败

$CI_PIPELINE_SOURCE == "web"表示管道已从 GitLab gui 触发Project page -> CI/CD -> Run Pipeline。您始终可以使用任何变量自定义或预定义设置不同的条件。


推荐阅读