##vso[task.complete result=Failed;] 不会导致脚本步骤失败

7

我曾认为调用 ##vso[task.complete result=Failed;] 会立即使脚本步骤失败,但我现在在我的管道中看到了一个例外。

是我的假设有误还是Azure流水线脚本任务存在漏洞?

我的构建代理在Ubuntu容器中运行该任务,代理本身是Linux代理。

3个回答

5
您可以尝试在“##vso[task.complete result=Failed;]”命令之后添加命令行“exit 1”。
echo "##vso[task.complete result=Failed;]"
exit 1

同样地,您也可以尝试在管道任务中使用日志命令 'LogIssue' 来记录任务上的错误。
echo "##vso[task.logissue type=error]Something went very wrong."
exit 1

我已经知道这个问题,但在 Azure Pipelines 网页界面上你会看到两条错误信息,一条是关于退出代码为 1 的 exit 1 调用的简单提示,另一条是 logissue 命令的详细错误信息。对于同一个错误而言出现两条错误信息只会导致糟糕的用户体验,如果可能的话我想避免这种情况。 - Marko
嗨 @Marko,日志记录命令不能立即使脚本步骤失败。如果您想要使用日志记录命令记录错误并立即使脚本步骤失败,则必须在日志记录命令之后添加 **exit 1**。我们无法仅使用日志记录命令即可立即使脚本步骤失败。 - Bright Ran-MSFT
我认为日志命令不需要导致程序中断,但 "task.complete result=failed" 应该会潜在地导致中断。正如我所说,现在我有了一个使用 exit 0 的解决方案,但它有点丑陋。 - Marko

1

我刚刚进行了一个小测试,使用以下代码可以实现中止步骤并在 Azure 管道 Web UI 中仅显示一个错误消息的期望目标:

echo "##vso[task.logissue type=error]Something went very wrong."
echo "##vso[task.complete result=Failed;]Make step fail"
exit 0

这个程序运行得很好,但是看起来非常丑陋,因为"exit 0"给人的印象是步骤已经完成了,但实际上由于task.complete调用的原因,状态将会是"失败"。

尽管如此,我仍然想知道task.complete命令不中止步骤的行为是"按设计"还是我发现了一个漏洞的解决方法。


0

检查一下在退出脚本的那行代码周围是否有try-catch块。

我花了整整一天才明白为什么它一直显示错误,但任务从未被标记为失败。

如果在退出或 [system.environment]::Exit(1) 行周围没有try-catch块,它应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接