我已经设置了一个 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;]
我有以下问题:
- 为什么退出代码 0 会被解释为错误?
- 我们推理说,是否有其他东西在后台被发送到标准错误?
- 除了 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 发出的日志消息(而不是错误)而失败的事实。
所以
- 不是。它失败是因为你指定了如果有东西写入 stderr,它应该会失败,这似乎是事实
- 一些程序将日志消息写入 stderr(例如,
az --version
如果消息过期,则向 stderr 发出警告) - 我认为最简单的解决方案如下:
- 如果您的脚本没有使用退出代码为 0 的损坏应用程序,请不要使用该
failOnStderr
标志 - 如果您需要/仍然想要使用
failOnStderr
,请将那些将其日志消息写入 stderr 的命令的 stderr 重定向到 stderr (2 > /dev/null
)
- 如果您的脚本没有使用退出代码为 0 的损坏应用程序,请不要使用该