GitLab CI:即使脚本失败,如何继续工作

Gru*_*nks 24 gitlab gitlab-ci

我的管道中有一份工作,其中有一个包含两个非常重要步骤的脚本:

  • mvn test 对我的代码运行 JUnit 测试
  • junit2html 将测试的 XML 结果转换为 HTML 格式(查看结果的唯一可能方法,因为我的管道不是通过 MR 完成的)作为工件上传到 GitLab
  • docker rm 销毁之前在管道中创建的容器

我的问题是,当我的测试失败时,脚本会立即停止在mvn test,因此junit2html永远不会到达该步骤,这意味着在失败的情况下永远不会上传测试结果,也永远docker rm不会执行,因此容器仍然存在并弄乱了后续管道其结果。

我想要的是即使脚本在某些时候失败,也能够将工作持续到最后。基本上,该作业在 GitLab CI / CD 中仍应算作失败,但应执行其整个脚本。我该如何配置?

Ada*_*all 32

在即使步骤失败也需要继续的每个步骤中,您可以.gitlab-ci.yml在该步骤中向您的文件添加一个标志。例如:

...
Unit Tests:
  stage: tests
  only:
    - branches
  allow_failure: true
  script:
    - ...
Run Code Online (Sandbox Code Playgroud)

allow_failure: true即使该特定步骤失败,该标志也会继续管道。关于 allow_failure 的 Gitlab CI 文档在这里:https ://docs.gitlab.com/ee/ci/yaml/#allow_failure

评论更新:如果您需要在失败后继续前进的步骤,并注意某些事情失败了,这对我来说效果很好:

./script_that_fails.sh > /dev/null 2>&1 || FAILED=true

if [ $FAILED ]
    then ./do_something.sh
fi
Run Code Online (Sandbox Code Playgroud)

  • 喔好吧。我当时就误会了。对于那些您需要知道某些事情失败但需要它继续进行的情况,我做了类似`./script_that_fails.sh > /dev/null 2>&1 || 的事情。FAILED=true`,那么如果失败了你需要做任何事情,你可以`if [ $FAILED ]; 然后./do_something.sh; fi`类型的东西。这就是我过去所做的。 (7认同)
  • 抱歉双重评论,但来编辑我之前的帖子已经太晚了。[这是来自 GitLab 的建议](https://docs.gitlab.com/ee/ci/yaml/script.html#ignore-non-zero-exit-codes): `./script_that_fails.sh || 退出代码=$?` (7认同)
  • “allow_failure”可以让管道继续运行,但它不能阻止作业提前结束。不过,我确实通过使用“before_script”和“after_script”变量解决了我的问题,因为无论作业失败还是成功,它们都会执行。所以你确实让我走上了正确的道路。 (3认同)