首先是这个有趣的挑战的背景。 在开发和testing死锁,循环或导致永无止境的testing的其他问题期间,持续集成构build经常会失败。 所以通知构build失败的所有机制都变得毫无用处。
如果构build日志文件的输出超过5分钟,那么解决scheme将会使构build脚本超时,因为构build过程会在进行时按常规写出unit testing的名称。 所以这是识别“冻结”的最好方法。
好的。 现在,基本上…
构build服务器使用Hudson运行一个简单的bash脚本,该脚本调用基于Nant和MSBuild(全部在Windows上)的更复杂的构build脚本。
到目前为止,networking上的所有解决scheme都涉及命令总运行时间的超时。 但是这种解决scheme在这种情况下失败了,因为testing可能会在前5分钟内挂起或冻结。
我们到目前为止的想法是:
首先,这里是高级别的bash命令,在Hudson运行完整的testing套件。
build.sh clean free test
该命令只是将所有的Nant和MSBuild构build日志logging发送到标准输出。
很显然,我们需要将输出发送到一个文件:
build.sh clean free test 2>&1 | tee build.out
然后并行一个命令需要睡眠,检查文件的修改时间,如果超过5分钟,杀死主进程。 在这一点上, kill -9
会很好 – 一旦冻结,就不需要优雅的东西。
这是你可以帮忙的部分。
事实上,15年前我写了一个这样的脚本,在没有任何活动的情况下用数据电话线连接到日本,但不记得我是怎么做的。
韦恩,真诚
build.sh clean free test 2>&1 | tee build.out & sleep 300 kill -KILL %1
您可能可以使用timeout
:
timeout 300 command
通过编写一个bash脚本来解决这个问题。
它被称为iotimeout与一个参数是秒数。
你这样使用它:
build.sh clean dev test | iotimeout 120
iotimeout有2个循环。
一种是简单的读线回路,回声线回显,但它也使用触摸命令更新一个tmp文件的修改时间,每次写一行。 不幸的是,它不可能监视build.out文件,因为Windoze不会更新文件修改时间,直到您关闭文件。 好吧。
另一个循环在后台运行,这是一个永久循环睡眠10秒,然后检查临时文件的修改时间。 如果超过120秒,那么该循环强制整个进程组退出。
唯一棘手的问题是返回原始程序的退出代码。 Bash给你一个PIPESTATUS数组来解决这个问题。
另外,搞清楚如何杀死整个程序组是一些研究,但事实证明这很容易 – 杀死0