如何在Teamcity CMD步骤失败时触发脚本?

时间:2018-01-17 11:22:16

标签: bash teamcity

我有一个TeamCity作业,它使用内联bash脚本运行CMD步骤。

如果用户取消作业或失败,我想通过tcp向另一个系统发送通知。

我将陷阱处理程序放入脚本中,但陷阱没有触发,表明它没有传递任何通常的信号。

#!/usr/bin/env bash 

function handle_error() {
    echo "TRAPPED $1"
    exit 1;
}

trap 'handle_error ERR' ERR
trap 'handle_error INT' INT
trap 'handle_error TERM' TERM
trap 'handle_error QUIT' QUIT
trap 'handle_error EXIT' EXIT

for i in $(seq 30); do echo $i; sleep 1; done

当我启动作业然后取消它时,我得到以下输出。

[11:34:36][Step 1/1] Starting: /opt/teamcity_agent_a11/temp/agentTmp/custom_script4059331588446614618
[11:34:36][Step 1/1] in directory: /opt/teamcity_agent_a11/work/84217cc201b5cd23
[11:34:36][Step 1/1] 1
[11:34:37][Step 1/1] 2
[11:34:38][Step 1/1] 3
[11:34:39][Step 1/1] 4
[11:34:40][Step 1/1] 5
[11:34:43][Step 1/1] Process exited with code 137
[11:34:43][Step 1/1] Step Command Line interrupted
[11:34:44]Build was interrupted. Artifacts will not be published for this build
[11:34:44]Build canceled

未显示TRAPPED消息。有没有办法使这项工作?

或者,如果此作业失败或被取消,是否有办法配置TeamCity触发另一个脚本?

- 的更新 -

我现在发现,自 10.0.2 以来,TeamCity通过参数提供对此行为的控制。

通过设置teamcity.force.kill.process.on.cancel.build=false,Teamcity将首先发送 SIGTERM ,然后在 60 秒后使用 SIGKILL 关注它(可覆盖通过teamcity.force.kill.process.on.cancel.build.timeout.sec)如果还活着

此票证中的更多详细信息:https://youtrack.jetbrains.com/issue/TW-13367#comment=27-1573848

2 个答案:

答案 0 :(得分:2)

我现在发现,由于 10.0.2 ,Teamcity通过参数提供对此行为的控制。

通过设置teamcity.force.kill.process.on.cancel.build=false,Teamcity将首先发送 SIGTERM ,然后在 60 秒后使用 SIGKILL 关注它(可覆盖通过teamcity.force.kill.process.on.cancel.build.timeout.sec)如果还活着

此票证中的更多详细信息:https://youtrack.jetbrains.com/issue/TW-13367#comment=27-1573848

答案 1 :(得分:1)

根据Exit Codes With Special Meanings说明,退出代码137表示该进程已被SIGKILL杀死,

  

无法被捕获,阻止或忽略

根据docs(请参阅12.1.2. Usage of signals with kill部分)