gitlab中每个作业有多个on_failure事件?

时间:2019-10-17 08:53:00

标签: continuous-integration gitlab gitlab-ci gitlab-ci-runner gitlab-api

Gitlab ci提供“ when:on_failure”错误处理程序。如果我想为每个工作使用不同的处理程序怎么办?因为如果任何先前的作业失败,就会触发失败。因此,基本上就是如果我为每个作业都设置了该处理程序,而一个作业将失败,那么所有处理程序都会启动。如何避免呢?

2 个答案:

答案 0 :(得分:1)

我不认为目前有任何方法可以执行此操作,但是gitlab存储库上有一个未解决的问题,要求一些类似的功能:https://gitlab.com/gitlab-org/gitlab/issues/19400。如果实施,它将允许您指定应该为哪个失败的步骤运行哪个步骤。

但是,直到那时,您可以控制错误处理的唯一方法是在步骤脚本中执行以下操作:

./script_that_fails.sh || FAILED=true
if [ $FAILED ]; then
  ./error_handling_script.sh
fi

答案 1 :(得分:0)

对于一个特定的工作失败,我只能成功处理一个失败工作。

这有点棘手,我在失败时创建了一个工件,在on_failure作业中,我尝试调用该工件并执行脚本来处理故障。如果工件不存在,那么我会回显一条简单的消息。我在最近10分钟内发现了此变通办法,因此可以对其进行优化,但确实可以完成工作。

因此,您可以拥有特定的on_failure作业来处理不同作业的失败。

stages:
  - stage1
  - stage1:failure
  - stage2
  - stage2:failure

job1:
  stage: stage1
  script:
    - echo "FAIL" > JOB1
    - ...fail something
  artifacts:
    when: on_failure
    paths:
      - JOB1

job1:failure:
  stage: stage2:failure
  script:
    - cat JOB1 && some_script_to_handle_failure || echo "Not a JOB1 Failure"
  when: on_failure

job2:
  stage: stage2
  script:
    - echo "FAIL" > JOB2
    # Won't be execute since job1 fail
  artifacts:
    when: on_failure
    paths:
      - JOB2

job2:failure:
  stage: stage2:failure
  script:
    - cat JOB2 && some_script_to_handle_failure || echo "Not a JOB2 Failure"
    # Will echo "Not a JOB2 Failure" since JOB2 artifact doesn't exist.
  when: on_failure

希望这会有所帮助。