为什么Teamcity发送键盘中断来终止我的构建?

为什么Teamcity发送键盘中断来终止我的构建?,teamcity,integration-testing,interrupt,keyboardinterrupt,control-c,Teamcity,Integration Testing,Interrupt,Keyboardinterrupt,Control C,我在TeamCity中运行了一个构建,只有一个构建步骤:启动BAT文件。TeamCity有时会用(双)键盘中断来终止我的构建,我不知道为什么。构建结束时的输出如下所示: Running build failed. Error: NUnit test failed (7). Starting BuildFailureTarget: recover Uninstalling service under test..Terminate batch job (Y/N)? ^C Process exit

我在TeamCity中运行了一个构建,只有一个构建步骤:启动BAT文件。TeamCity有时会用(双)键盘中断来终止我的构建,我不知道为什么。构建结束时的输出如下所示:

Running build failed.
Error:
NUnit test failed (7).
Starting BuildFailureTarget: recover
Uninstalling service under test..Terminate batch job (Y/N)? 
^C
Process exited with code -1073741510
此版本在安装Windows服务和SQL数据库后,通过NUnit运行一些集成测试。如果任何一个测试失败,构建脚本(使用FAKE,F#s Make)会运行一些清理,卸载服务,删除数据库。生成通过时运行的清理代码相同,只是目标名称不同(
recover
)。TeamCity似乎只有在某些测试失败时才会终止构建。我应该注意,“卸载测试中的服务”消息来自运行卸载程序的子进程。即使我们关闭了几个失败条件,使得构建(虚假地)在几个测试失败后通过(我们没有使用Java,所以我们假设其中一个是不相关的),这种情况仍然会发生:


我不明白为什么TeamCity会在我的构建完成之前就终止它。我如何确定是什么原因导致TeamCity发出此中断?

如果TeamCity检测到挂起的进程,它似乎会这样做(不确定如何更精确)。我们所发生的情况是,当我们运行子流程时,在停止该流程的代码之前,第三方库引发了一个异常。异常得到了处理,异常触发的清理将导致进程关闭(通过另一种方式),但在清理完成之前,TeamCity正在扼杀我们的构建:讽刺的是,这意味着进程从未关闭


我们的解决方案是捕获异常并确保在失败之前调用第一个关闭代码。最终,我们无法从TeamCity方面更清楚地了解发生了什么:我们通过仔细分析代码发现了错误。但是,当子流程的标准清理逻辑失败时,似乎会发生这种情况。

我建议您检查buildAgent/logs/teamcity-agent.log和buildAgent/logs/teamcity-build.log文件以获取线索。在构建结束时,Teamcity将终止构建启动的所有子进程,以避免内存中出现垃圾。若构建过程并没有等待子过程完成,这可能是一个问题。