如何将 std 错误重定向到 GitLab 运行程序中的 std out

Jin*_*nsu 5 continuous-integration gitlab gitlab-ci gitlab-ci-runner

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

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

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

问题。

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

在此输入图像描述

在此输入图像描述

Ada*_*all 5

从它抛出的错误来看,问题根本不在于 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
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助。

  • 谢谢您的回答。就像你的回答一样,我通过使用 `{commands} || 处理了这个问题 真实`。感谢您,我了解了退出代码的概念。 (3认同)