【问题标题】:.gitlab-ci.yml after_script section: how can I tell whether the task succeeded or failed?.gitlab-ci.yml after_script 部分:如何判断任务是成功还是失败?
【发布时间】:2018-09-26 19:45:11
【问题描述】:

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

如何在after_script 部分中判断主要任务是成功还是失败?

【问题讨论】:

  • 那么您是指条件after_script 还是指主要任务的结果。您可以考虑将结果存储到变量中。 docs.gitlab.com/ee/ci/variables/README.html
  • @ArihantGodha 我很确定在一个阶段设置的变量不会保留在另一个阶段。不过值得一试;即使我接受了下面的答案,这将是我的首选解决方案。 (我将变量succeeded 设置为0,然后在主脚本的最后将其设置为1;然后我将在after_script 中对其进行测试以查看该过程是否完成。 )

标签: gitlab gitlab-ci status


【解决方案1】:

我建议不要在after_script 中确定任务是成功还是失败,而是定义另一个阶段,并使用when 语法,您可以在其中使用when: on_failurewhen: 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

【讨论】:

  • 不幸的是,如果 deploy_job 被重试,cleanup_job 不会,然后再次失败。
  • 如果您想执行需要相同 CI_JOB_IDafter_script 怎么办?
  • 或者你想检查运行失败的 docker 容器... =(
  • 这不是他问的问题,如果我只需要在作业成功与否的情况下在脚本之后执行某些内容,这也无济于事
【解决方案2】:

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

注意:当前打开了一个功能请求 (issues/3116) 来处理 after_script 中的 on_failureon_success

可以使用变量将作业状态传递给 after_script 脚本,但这也有一个功能请求 (issues/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)"

【讨论】:

  • exit 1 将停止脚本,echo "SUCCESS" > .job_status 将永远不会运行
  • 这是目前最好的解决方案
  • 不会导出环境变量同样好用吗?导出作业状态=失败;回声 $JOB_STATUS
  • 这对我不起作用,因为 after_script 在与 before_script/script 不同的上下文中运行
【解决方案3】:

从 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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2022-01-06
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多