如果管道作业/阶段失败,则触发操作/作业

时间:2021-02-08 14:54:44

标签: continuous-integration gitlab gitlab-ci

我有一个 GitLab 管道,其中一个作业将一些内容写入一个文件,一个简单的 .txt 文件,并推送一个 Git 标签。完成此作业后,执行其他作业。

如果管道的任何作业失败,我想触发自动操作/作业或撤销 .txt 文件写入并删除 Git 标记的操作。

有没有可能做这样的事情?是否有某种 GitLab 管道作业仅在另一个失败时触发?

1 个答案:

答案 0 :(得分:1)

您正在寻找 when: on_failure 选项。它的文档在这里:https://docs.gitlab.com/ee/ci/yaml/README.html#when

如果你把它放在一个作业上,那么只有在你的管道中早期阶段的另一个作业失败时,该作业才会运行。如果您只需要在管道末端使用一个,这将正常工作,但它也允许您在每个需要它的阶段后使用多个。以下是文档中的示例:

stages:
  - build
  - cleanup_build
  - test
  - deploy
  - cleanup

build_job:
  stage: build
  script:
    - make build

cleanup_build_job:
  stage: cleanup_build
  script:
    - cleanup build when failed
  when: on_failure

test_job:
  stage: test
  script:
    - make test

deploy_job:
  stage: deploy
  script:
    - make deploy
  when: manual

cleanup_job:
  stage: cleanup
  script:
    - cleanup after jobs
  when: always

build 阶段中的作业运行构建项目所需的任何内容,但如果任何失败,cleanup_build 阶段中的作业将运行并删除任何构建工件,或任何其他需要的内容。

如果构建作业通过,测试阶段作业将运行测试。如果这些通过,我们不需要做任何清理工作,所以管道会立即失败。否则,我们将继续部署阶段。

我们的部署阶段作业标有 when: manual,这是您管道的另一个有用选项。这意味着在 Gitlab 用户或 API 按下按钮启动作业之前,此作业不会运行。

我们在 cleanup 阶段的最后一个作业是 when: always。这意味着无论在任何前一阶段发生什么,它都将始终运行。这对于最终清理非常有用,如果部署失败,我们可以执行回滚或其他任何我们可能需要的操作。

when 关键字及其所有选项的文档在这里:https://docs.gitlab.com/ee/ci/yaml/README.html#when