即使退出代码为 0,Azure 管道步骤也会失败

即使退出代码为 0,Azure 管道步骤也会失败

我已经设置了一个 azure-pipeline yaml 配置,其中包含一个运行 5 个脚本的管道作业。每个脚本的配置都将标志failOnStderr设置为true。脚本成功运行,但阶段失败,输出如下:

##[error]Bash wrote one or more lines to the standard error stream.

我启用了system.debug详细功能并获得了进一步的详细信息:

##[debug]Exit code 0 received from tool '/bin/bash'
##[debug]STDIO streams have closed for tool '/bin/bash'
##[error]Bash wrote one or more lines to the standard error stream.
##[debug]Processed: ##vso[task.issue type=error;]Bash wrote one or more lines to the standard error stream.
##[debug]task result: Failed
##[debug]Processed: ##vso[task.complete result=Failed;done=true;]

我有以下问题:

  1. 为什么退出代码 0 会被解释为错误?
  2. 我们推理说,是否有其他东西在后台被发送到标准错误?
  3. 除了 azure-pipelines 提供的配置之外,社区还推荐了什么解决方案/解决方法?我可以使用 shell trap,但我希望找到可以减少脚本中样板代码的方法。

答案1

我也遇到了问题failOnStderr并得出以下结论:

我认为failOnStderr应该仅有的用于处理返回 0 但仍然失败的损坏应用程序并将失败的原因写入标准输出。

在您的情况下,错误消息##[error]Bash wrote one or more lines to the standard error stream.至少给出了该步骤失败的原因。

就我而言,错误消息##[error]Script failed with error: Error: /bin/bash failed with return code: 0甚至没有提及它实际上是由于向 stderr 发出的日志消息(而不是错误)而失败的事实。

所以

  1. 不是。它失败是因为你指定了如果有东西写入 stderr,它应该会失败,这似乎是事实
  2. 一些程序将日志消息写入 stderr(例如,az --version如果消息过期,则向 stderr 发出警告)
  3. 我认为最简单的解决方案如下:
    • 如果您的脚本没有使用退出代码为 0 的损坏应用程序,请不要使用该failOnStderr标志
    • 如果您需要/仍然想要使用failOnStderr,请将那些将其日志消息写入 stderr 的命令的 stderr 重定向到 stderr ( 2 > /dev/null)

相关内容