You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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就能正常触发了。另外补充两个脚本优化点:

  1. 如果要捕获任务失败的错误信号,建议在脚本开头加上set -e,这样任何命令执行失败时都会触发ERR陷阱(默认bash的ERR陷阱不会捕获管道或循环内的错误,set -e能增强这个行为)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:29:57