我们的Jenkins服务器有一个已经运行了三天但没有做任何事情的工作.单击角落中的小X不会执行任何操作,控制台输出日志也不会显示任何内容.我已经检查了我们的构建服务器,并且该作业实际上似乎根本没有运行.
有没有办法通过编辑某个文件或锁定或其他东西告诉詹金斯这项工作是"完成"的?由于我们有很多工作,我们真的不想重启服务器.
小智 235
我也有同样的问题,并通过Jenkins控制台修复它.
转到"管理Jenkins">"脚本控制台"并运行脚本:
Jenkins .instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));
Run Code Online (Sandbox Code Playgroud)
您只需指定JobName和JobNumber即可.
Zah*_*hra 179
转到"管理Jenkins">"脚本控制台"以在服务器上运行脚本以中断挂起的线程.
您可以获取所有活动线程Thread.getAllStackTraces()并中断挂起的线程.
Thread.getAllStackTraces().keySet().each() {
t -> if (t.getName()=="YOUR THREAD NAME" ) { t.interrupt(); }
}
Run Code Online (Sandbox Code Playgroud)
更新:
使用线程的上述解决方案可能无法在更新的Jenkins版本上运行.要中断冻结管道,请参考此解决方案(由alexandru-bantiuc提供)并运行:
Jenkins.instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(
hudson.model.Result.ABORTED,
new java.io.IOException("Aborting build")
);
Run Code Online (Sandbox Code Playgroud)
Mar*_*lte 25
如果您有一个Multibranch Pipeline -job(并且您是Jenkins-admin),请在Jenkins脚本控制台中使用此脚本:
Jenkins.instance
.getItemByFullName("<JOB NAME>")
.getBranch("<BRANCH NAME>")
.getBuildByNumber(<BUILD NUMBER>)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));
Run Code Online (Sandbox Code Playgroud)
来自https://issues.jenkins-ci.org/browse/JENKINS-43020
che*_*ffe 24
我使用Monitoring Plugin执行此任务.安装插件后
搜索挂起的作业名称
Thread的名字将这样开始
Executor #2 for master : executing <your-job-name> #<build-number>
单击所需作业所在行表格右侧的红色圆形按钮
mug*_*ugi 22
一旦我遇到了"脚本控制台"无法阻止的构建.最后我通过以下步骤解决了问题:
ssh onto the jenkins server
cd to .jenkins/jobs/<job-name>/builds/
rm -rf <build-number>
restart jenkins
Run Code Online (Sandbox Code Playgroud)
小智 20
第一个提出的解决方案非常接近.如果使用stop()而不是interrupt(),它甚至会杀死失控的线程,这些线程在一个时髦的系统脚本中无休止地运行.这会杀死任何为作业运行的构建.这是代码:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('YOUR JOBNAME')) {
println "Stopping $it.name"
it.stop()
}
}
Run Code Online (Sandbox Code Playgroud)
Lev*_*lló 12
如果您有不可阻挡的管道作业,请尝试以下操作:
Jenkins将意识到应该终止这项工作并停止构建
我想现在回答为时已晚,但我帮助了一些人.
我没有足够的声誉来发布图片抱歉.
希望它可以提供帮助
在顶部的答案几乎是为我工作,但我有一个重大问题:我有僵尸工作的一个非常大的数量(约100),由于一个特别差的定时詹金斯重新启动,所以手动查找作业名称,并建立各自的数量和每个僵尸工作,然后手动杀死他们是不可行的.这是我如何自动发现和杀死僵尸工作:
Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
repository.getItems().each { branch->
branch.builds.each { build->
if (build.getResult().equals(null)) {
build.doKill()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此脚本循环遍历所有作业的所有构建,并用于getResult().equals(null)确定作业是否已完成.在队列中但尚未启动的构建将不会被迭代(因为该构建将不在其中job.builds),并且已经完成的构建将返回除nullfor之外的其他内容build.getResult().合法运行的作业也将具有构建结果null,因此请确保在运行此作业之前没有您想要杀死的正在运行的作业.
多个嵌套循环主要用于发现Multibranch Pipeline项目中每个存储库的每个分支/ PR; 如果您没有使用Multibranch Pipelines,您可以直接使用类似的东西遍历所有作业Jenkins.instance.getItems().each.
我看过Jenkins的来源,似乎我想做的事情是不可能的,因为停止工作似乎是通过线程中断来完成的.我不知道为什么工作挂了..
编辑:
不可阻挡的工作可能的原因:
Alexandru Bantiuc 的回答对我停止构建很有效,但我的执行者仍然很忙。我可以使用以下方法清除繁忙的执行程序状态
server_name_pattern = /your-servers-[1-5]/
jenkins.model.Jenkins.instance.getComputers().each { computer ->
if (computer.getName().find(server_name_pattern)) {
println computer.getName()
execList = computer.getExecutors()
for( exec in execList ) {
busyState = exec.isBusy() ? ' busy' : ' idle'
println '--' + exec.getDisplayName() + busyState
if (exec.isBusy()) {
exec.interrupt()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
最近,我遇到一个节点/代理,其中一个执行程序被管道作业的构建“X”占用了数天,尽管该作业页面声称构建“X”不再存在(在 10 个后续构建后被丢弃(!),因为在管道作业中配置)。已验证磁盘上:构建“X”确实消失了。
\n\n解决方案:代理/节点错误地报告占用的执行器正忙于运行构建“X”。中断该执行器的线程会立即释放它。
\n\ndef executor = Jenkins.instance.getNode(\'NODENAME\').computer.executors.find {\n it.isBusy() && it.name.contains(\'JOBNAME\')\n}\n\nprintln executor?.name\nif (executor?.isBusy()) executor.interrupt()\nRun Code Online (Sandbox Code Playgroud)\n\n考虑的其他答案:
\n\nThread.getAllStackTraces():没有匹配的线程。getBuildByNumber(): 的答案都不适用,因为构建不再存在了!更新:
\n我再次经历了类似的情况,其中执行器被(仍然存在的)已完成的管道构建占用了数天。该代码片段是唯一可行的解决方案。
| 归档时间: |
|
| 查看次数: |
128012 次 |
| 最近记录: |