Rub*_*ink 25 error-handling powershell teamcity
我有一个TeamCity 7构建配置,它几乎只是.ps1
使用各种TeamCity参数调用脚本.
我希望这可能是一个简单的设置问题:
脚本
文件
脚本文件
%system.teamcity.build.workingDir%/ Script.ps1
脚本执行模式
使用"-File"参数执行.ps1脚本
脚本参数
%system.teamcity.build.workingDir%-OptionB%BuildConfigArgument %% BuildConfigArg2%
然后我会期待:
exit
具有非0
错误级别的脚本我希望构建失败(也许这不是惯用的PS错误管理 - 只有.ps1只能通过没有异常来报告成功吗?)问题:它不起作用.它应该如何工作?有什么东西我做错了,我可以通过选择不同的选项来解决这个问题吗?
Rub*_*ink 33
将错误输出
Error
设置为并添加构建失败条件如果存在语法错误和异常,PowerShell会将它们写入stderr.要使TeamCity无法进行构建,请将Error Output选项设置为Error并添加构建失败条件,该条件将导致任何错误输出的构建失败.
完成这项工作的关键是更改两个默认值:
在9.1中,以下工作(如果它也适用于早期版本,我不会感到惊讶):
trap { Write-Error "Exception $_" ; exit 98 }
在脚本的顶部添加一个(对于TeamCity构建脚本中适合的脚本类型,可选但更正确的IMO)
显示高级选项并打开选项:添加-NoProfile参数
(可选,但对我来说这应该是默认值,因为它更清晰地呈现@Jamal Mavadat所建议的)
显示高级选项并打开错误输出:错误
(ASIDE @JetBrains:如果标签是"格式化stderr输出为",则会减少误导性)
这包括以下情况:
throw
直接或间接在您的PS代码中显示并触发TC的退出代码以停止构建]exit n
脚本中的显式传播到构建(如果非零,则将其失败)TeamCity中存在一个已知错误,导致原始海报注意到的行为.
但是,它很容易解决.
在PowerShell脚本的末尾,添加指示已到达脚本末尾的输出:
Echo "Packaging complete (end of script reached)"
Run Code Online (Sandbox Code Playgroud)
然后,如果输出中不存在您回显的文本,则在构建上设置新的构建失败条件失败.
你过分思考问题.试试这个:
脚本
File
Run Code Online (Sandbox Code Playgroud)脚本文件
Script.ps1
Run Code Online (Sandbox Code Playgroud)
你不需要给它一个路径 - 默认情况下,它相对于checkout目录.
脚本执行模式
Put script into PowerShell stdin with "-Command -" arguments
Run Code Online (Sandbox Code Playgroud)这正是我用来在Teamcity中运行一堆PowerShell脚本的原因.
我在原帖中错过了关于在powershell脚本中出现故障导致构建失败的问题.道歉!
我用两种不同的方式解决了这部分难题.
将主代码块包装在一个try...catch
; 如果发生异常,则返回非零整数值.要成功执行,请返回0.
这种为成功而归零的惯例可以追溯到历史上很长的路 - 它被Unix/Linux系统,DOS,CP/M等使用.
使用包装器powershell脚本调用psake并通过向stdout 写入响应消息直接设置teamcity构建的结果.
在脚本开始时,定义表示失败的状态消息:
$global:buildResult = "#teamcity[buildStatus status='FAILURE' text='It died.']
Run Code Online (Sandbox Code Playgroud)
在psake脚本中,更新$global:buildResult
以指示最后运行的专用任务的成功.
$global:buildResult = "#teamcity[buildStatus status='SUCCESS' text='It lives.']
Run Code Online (Sandbox Code Playgroud)
在包装器脚本的末尾,输出状态消息
write-host $global:buildResult
Run Code Online (Sandbox Code Playgroud)
如果构建脚本中的任何内容失败,则最后一个任务将不会运行,并且将输出默认消息(指示失败).
无论哪种方式,Teamcity都会接收消息并适当地设置构建状态.