2011-04-22 35 views
4

我们在我们的连续构建环境中使用Hudson。出于某种原因,SCM轮询的线程会在一段时间后影响事端。我的设置经验丰富,但似乎没有任何工作。如何解决这个问题,并有一些脚本可以检测到这种情况下,能够重新启动哈德森?顺便说一句。重新启动哈德森是目前解决这个问题的唯一方法。Hudson SCM轮询线程轮询

+0

什么SCM工具(S)您使用(SVN,汞等)? – pwan 2011-04-26 04:17:57

+0

哪个哈德森版?你能否也给我们堆栈痕迹? – 2011-04-26 07:57:57

回答

4

这与bug 5413类似,应该从2010年末开始使用HUDSON 5977(Hudson 1.380+或现在的Jenkins)来解决。

你不得不在那些线程some way to kill any thread stuck on the polling step

非常原始的(我懒得来开发更好的东西,因为这不是很重要的问题),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() 
    } 
} 
0

对方回答没有为我工作,但下面的脚本found the the issue for this problem做:

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() 
     } 
    } 
    } 
}