如何在TeamCity CMD步骤失败或取消时触发脚本?
解决TeamCity中取消/失败任务时bash脚本trap不触发的问题
为什么你的trap没生效?
默认情况下,TeamCity在用户取消构建或者任务失败时,会直接给进程发送SIGKILL信号(对应退出码137),这个信号是无法被捕获或忽略的——你的脚本根本没机会执行trap处理逻辑就被强制终止了,自然看不到TRAPPED输出。
方案1:让TeamCity先发送可捕获的信号
从TeamCity 10.0.2版本开始,有参数可以控制取消构建时的信号发送逻辑:
- 在你的构建配置中添加自定义参数:
teamcity.force.kill.process.on.cancel.build=false
开启后,TeamCity会先给进程发送SIGTERM信号,等待一段时间后如果进程还没终止,才会发送SIGKILL强制杀死。 - (可选)调整等待超时时间:添加参数
teamcity.force.kill.process.on.cancel.build.timeout.sec,设置你需要的秒数(默认60秒)
调整后,你的脚本里的trap 'handle_error TERM' TERM就能正常触发了。另外补充两个脚本优化点:
- 如果要捕获任务失败的错误信号,建议在脚本开头加上
set -e,这样任何命令执行失败时都会触发ERR陷阱(默认bash的ERR陷阱不会捕获管道或循环内的错误,set -e能增强这个行为) - EXIT陷阱会在脚本正常结束时也触发,你可以在
handle_error里区分信号类型,比如:
function handle_error() { if [ "$1" != "EXIT" ]; then echo "TRAPPED $1" # 这里添加你的TCP通知逻辑 fi exit 1; }
方案2:用TeamCity内置触发器触发通知脚本
如果不想修改脚本和信号传递逻辑,也可以直接用TeamCity的构建结束触发器来实现通知:
- 进入你的构建配置页面,切换到「触发器」标签
- 添加「构建结束触发器」(Build Finish Trigger)
- 在触发条件里选择:
- 当构建状态为「失败」时触发
- 当构建被「取消」时触发
- 指定要触发的目标构建配置(这个配置里只需要放发送TCP通知的脚本即可)
这种方式不需要依赖原脚本的trap,完全由TeamCity的内置机制管控,更稳定可靠。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

