我们使用Hudson作为持续构建环境。由于某种原因,SCM Polling的线程有时会在一段时间后挂起。我尝试了很多设置,但似乎没有什么是真正有效的。如何解决这个问题,是否有一些脚本可以检测到这样的情况下,能够重新启动哈德逊?顺便说一句。重启Hudson是目前解决这个问题的唯一办法。
这与错误5413类似,应该在2010年底通过HUDSON 5977 (HUDSON 1.380+,或现在的Jenkins)解决。
在这些线程中有一些方法可以杀死任何卡在轮询步骤上的线程:
非常原始(我懒得开发更好的东西,因为这不是很重要的问题)Groovy脚本如下:
它可能会杀死没有卡住的SCM轮询,但是我们每天只自动运行这个脚本一次,所以它不会给我们带来任何麻烦。
您可以通过保存SCM轮询线程的id和名称来改进它,一段时间后再次检查并仅杀死id在上次检查列表中的线程。
Thread.getAllStackTraces().keySet().each(){ item ->
if( item.getName().contains("SCM polling") &&
item.getName().contains("waiting for hudson.remoting")){
println "Interrupting thread " + item.getId() item.interrupt()
}
}
另一个答案对我不起作用,但下面的脚本发现了这个问题的问题:
Jenkins.instance.getTrigger("SCMTrigger").getRunners().each()
{
item ->
println(item.getTarget().name)
println(item.getDuration())
println(item.getStartTime())
long millis = Calendar.instance.time.time - item.getStartTime()
if(millis > (1000 * 60 * 3)) // 1000 millis in a second * 60 seconds in a minute * 3 minutes
{
Thread.getAllStackTraces().keySet().each()
{
tItem ->
if (tItem.getName().contains("SCM polling") && tItem.getName().contains(item.getTarget().name))
{
println "Interrupting thread " + tItem.getName();
tItem.interrupt()
}
}
}
}