.gitlab-ci.yml after_script部分:如何判断任务成功还是失败?

Dan*_*com 10 status gitlab gitlab-ci

我正在使用Gitlab CI,因此一直在处理相当复杂的.gitlab-ci.yml文件。该文件具有一个after_script部分,该部分在主要任务完成或主要任务因某种原因失败时运行。问题:我需要根据主要任务是成功还是失败进行不同的清理,但是我找不到任何表示主要任务结果的Gitlab CI变量

在该after_script部分中,我怎么知道主要任务是成功还是失败?

小智 10

可接受的答案可能适用于大多数情况,但是它不能回答原始问题,并且仅在每个阶段只有一份工作的情况下才有效。

:目前有一个功能请求打开(问题/ 3116)来处理on_failure,并on_successafter_script

这可能是可以使用变量作业状态传递给一个after_script脚本,但是这也有一个功能要求(问题/ 1926年)建成能之间的共享变量before_scriptscriptafter_script

一种解决方法是写入将在after_script块期间访问的临时文件。

test_job:
  stage: test
  before_script:
    - echo "FAIL" > .job_status
  script:
    - exit 1
    - echo "SUCCESS" > .job_status
  after_script:
    - echo "$(cat .job_status)"
Run Code Online (Sandbox Code Playgroud)

  • `exit 1` 将停止脚本,并且 `echo "SUCCESS" > .job_status` 将永远不会运行 (11认同)
  • @Arith是的,这正是我们想要的——然后你在“.job_status”中得到了“FAIL”。这只是为了可视化如何实现流程,通常您将实际代码放入“script”部分并在最后存储作业状态,以便您可以在“after_script”中检查它。 (7认同)
  • 这对我不起作用,因为 after_script 运行在与 before_script/script 不同的上下文上 (2认同)

Nep*_*oxx 8

从 gitlab-runner 13.5 开始,您可以使用该CI_JOB_STATUS变量。

test_job:
  # ...
  after_script:
    - >
      if [ $CI_JOB_STATUS == 'success' ]; then
        echo 'This will only run on success'
      else
        echo 'This will only run when job failed or is cancelled'
      fi
Run Code Online (Sandbox Code Playgroud)

请参阅 GitLab 关于预定义变量的文档:https : //docs.gitlab.com/ee/ci/variables/predefined_variables.html

  • 万一有人碰上这个,有时这个变量返回的状态是正在运行,而不是成功或失败。这里有一张开放票:https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27693 (10认同)
  • 我的工作始终在 Gitlab 14.4 中运行... (2认同)

Rek*_*vni 5

after_script建议您定义一个阶段,并使用when语法(可以在其中使用when: on_failure或)来定义另一个阶段,而不是确定任务在中是否成功或失败when: on_success


文档中的示例:

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
Run Code Online (Sandbox Code Playgroud)