首页 > 解决方案 > 如何在 GitLab 运行器中将标准错误重定向到标准输出

问题描述

我正在努力GitLab CI/CD,我知道在正常情况下如何将标准错误重定向到标准输出。它是使用2>&1or >/dev/null 2>&1

有时,我需要一些会引发错误但错误并不严重的命令。例如,当我部署我的 docker 应用程序时,我想停止我的旧容器(如果它存在)并忽略如果容器不存在将发生的错误。在这种情况下,我只想忽略 std 错误并保留要部署的流程。当我使用AWS CodeDeploy时,错误重定向2>&1确实有效,但在中GitLab CI/CD,它不起作用。

下图是取消 CI/CD 进程的错误。如果没有命令停止不存在的容器,则不会出现错误并且部署确实有效。

问题。

如何将 std 错误重定向到 std out 或忽略错误并保持部署GitLab CI/CD

在此处输入图像描述

在此处输入图像描述

标签: continuous-integrationgitlab

解决方案


从它抛出的错误来看,问题根本不在于 stdout 或 stderr,并且您的重定向工作正常。问题在于docker stop存在非 0 退出代码。在 *nix 系统中,每个命令都以数字代码(如exit 0orexit 1exit 986405)退出。退出代码的值在这里并不重要,只是它不是 0:一个错误。Gitlab CI 在每个命令之后检查退出代码(before_script、script 和 after_script 部分中的每一行),如果其中任何一个非 0,则管道中的作业将失败。如果作业未标记,allow_failure: true则整个管道将失败。

尝试将该命令更改为此:

...
script:
  - pwd
  - docker stop ng >/dev/null 2>&1 || NO_CONTAINER=1 
  - #continues as normal

有了这个,如果命令docker stop ng...失败,我们设置一个变量 $NO_CONTAINER 的值1应该总是以退出代码 0 结束,让作业像往常一样继续。这根本不重要,我们也不会使用它,我们只需要 OR 来捕获失败并继续。如果容器确实存在并且正确停止,则初始退出代码将为 0,因此 || 永远不会发挥作用。

希望这可以帮助。


推荐阅读