【发布时间】:2018-03-13 15:13:51
【问题描述】:
我使用 CAKE 0.22.0 和 TeamCity 9.x。
在 TeamCity 中,我只有一个构建步骤调用 build.ps1。反过来,它运行build.cake。
在build.ps1,我添加了以下内容:
trap
{
write-output $_
##teamcity[buildStatus status='FAILURE' ]
exit 1
}
原因是为了规避a known PowerShell bug(即,使用-file 执行脚本在不应该返回退出代码0 时)。
build.ps1 内抛出异常时,TeamCity 正确显示构建失败:
但是,如果在 build.cake 中发生错误,TeamCity 会错误地声称一切运行成功:
这是上面截图中引用的“成功”构建的相应构建日志:
如您所见,错误是在build.cake 任务中引发的。 build.ps1 中的 trap 子句未捕获此错误,因此没有通知 TeamCity 构建失败。
我曾考虑在build.cake 中的所有任务中添加OnError 子句(该子句将包含类似于Information(@"Some error message\n##teamcity[buildStatus status='FAILURE']]" 的内容),但这会导致大量重复代码。
是否有一种简洁的方法来确保在build.cake 中的任务中引发的任何错误都被build.ps1 中的trap 子句捕获?
【问题讨论】:
-
我想你可能找错了树。
trap修复只会在您的 Powershell 脚本引发异常时帮助您。使用 cake 时,PS 脚本只是调用 cake 可执行文件并返回 Cake 返回的退出代码。 Cake 将处理任何从任务中抛出的异常。事实上,您的构建日志显示Process exited with code 1,对我来说,PS 脚本正在返回正确的代码,并且您的构建步骤可能没有使用退出代码来指示错误。我会检查您的 TeamCity 构建步骤。 -
@heavyd 感谢您的回复!在我的 TeamCity 构建步骤中,参数
Format stderr output as设置为Warning。这能否解释为什么 TeamCity 将构建显示为成功? -
对不起,我在原来的评论中弄错了,设置不是在单个构建步骤上,而是在构建配置的“失败条件”部分。 See docs here。确保选中
the build process exit code is not zero。 -
@heavyd 谢谢你的建议。我已经检查了我的失败条件并且确实检查了
the build process exit code is not zero,所以问题出在其他地方......
标签: c# powershell teamcity cakebuild