我们的Jenkins服务器有一个已经运行了三天的作业,但是没有做任何事情。单击角落里的小X没有任何作用,控制台输出日志也没有显示任何内容。我在我们的构建服务器上检查过,该作业实际上似乎根本没有在运行。
有没有办法告诉jenkins工作已经“完成”了,比如编辑一些文件或锁之类的?因为我们有很多任务,所以我们并不想重新启动服务器。
我们的Jenkins服务器有一个已经运行了三天的作业,但是没有做任何事情。单击角落里的小X没有任何作用,控制台输出日志也没有显示任何内容。我在我们的构建服务器上检查过,该作业实际上似乎根本没有在运行。
有没有办法告诉jenkins工作已经“完成”了,比如编辑一些文件或锁之类的?因为我们有很多任务,所以我们并不想重新启动服务器。
当前回答
进入"Manage Jenkins" > "Script Console"在服务器上运行一个脚本以中断挂起的线程。
您可以使用Thread.getAllStackTraces()获取所有活动线程,并中断正在挂起的线程。
Thread.getAllStackTraces().keySet().each() {
t -> if (t.getName()=="YOUR THREAD NAME" ) { t.interrupt(); }
}
更新:
上述使用线程的解决方案可能不适用于最新的Jenkins版本。要中断冻结的管道,请参考这个解决方案(由alexandru-bantiuc),并运行:
Jenkins.instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(
hudson.model.Result.ABORTED,
new java.io.IOException("Aborting build")
);
其他回答
我看了Jenkins源代码,似乎我要做的是不可能的,因为停止一个作业似乎是通过线程中断完成的。我不知道为什么这个工作被搁置了。
编辑:
就业势不可挡的可能原因:
如果Jenkins陷入了无限循环,它就永远不能中止。 如果Jenkins在Java虚拟机中进行网络或文件I/O(例如长时间的文件复制或SVN更新),则不能中止。
我有很多僵尸工作,所以我使用下面的脚本:
for(int x = 1000; x < 1813; x = x + 1) {
Jenkins .instance.getItemByFullName("JOBNAME/BRANCH")
.getBuildByNumber(x)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"))
}
如果你有一个不可阻挡的管道作业,试试下面的方法:
通过单击构建进度条旁边的红色X来终止作业 点击构建上的“Pause/resume”暂停 再次单击“暂停/恢复”以恢复构建
Jenkins将意识到该作业应该终止并停止构建
不需要使用脚本控制台或其他插件,您可以通过在浏览器中的构建URL后输入/stop、/term或/kill来简单地中止构建。
从上述链接逐字引用:
管道作业可以通过向URL发送HTTP POST请求来停止 构建的端点。 <BUILD ID URL>/stop -中止管道。 <BUILD ID URL>/term -强制终止构建(应该只在stop不起作用时使用。 <BUILD ID URL>/kill -硬杀死一个管道。这是阻止管道的最具破坏性的方法,只能作为最后一种方法 度假胜地。
构建超时插件在这种情况下可以派上用场。如果花费太长时间,它会自动终止工作。