Answers:
转到“管理Jenkins”>“脚本控制台”以在服务器上运行脚本以中断挂起的线程。
您可以获取所有活动线程,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")
);
t -> println(t.getName());
t.getName()=="SOME NAME"
?
t.stop
:Thread.getAllStackTraces().keySet().each() { t -> if (t.getName()=="YOUR THREAD NAME" ) { println(“Found, stopping now… “); t.stop(); } }
我也遇到了同样的问题,并通过Jenkins Console进行了修复。
转到“管理Jenkins”>“脚本控制台”并运行脚本:
Jenkins .instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));
您只需指定JobName和JobNumber。
Jenkins.instance.getItemByFullName("JobName").getBuildByNumber(JobNumber).delete();
在执行了此步骤并重新启动了詹金斯之后,僵尸构建终于消失了。
finish
在AbstractBuild或FreeSyleBuild或MavenModulesetBuild中都没有方法
groovy.lang.MissingMethodException: No signature of method: hudson.model.FreeStyleBuild.finish() is applicable for argument types: (hudson.model.Result, java.io.IOException) values: [ABORTED, java.io.IOException: Aborting build] Possible solutions: find(), findAll(), find(groovy.lang.Closure) at
如果您有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"));
从https://issues.jenkins-ci.org/browse/JENKINS-43020
如果不确定作业的全名(路径)是什么,则可以使用以下代码段列出所有项目的全名:
Jenkins.instance.getAllItems(AbstractItem.class).each {
println(it.fullName)
};
来自https://support.cloudbees.com/hc/en-us/articles/226941767-Groovy-to-list-all-jobs
我将监视插件用于此任务。安装插件后
搜索挂起的作业名称
线程的名称将以此开头
Executor #2 for master : executing <your-job-name> #<build-number>
单击所需工作所在行表中最右边的红色圆形按钮
一旦我遇到了无法通过“脚本控制台”停止的构建。最后,我通过以下步骤解决了问题:
ssh onto the jenkins server
cd to .jenkins/jobs/<job-name>/builds/
rm -rf <build-number>
restart jenkins
提出的第一个解决方案非常接近。如果您使用stop()而不是interrupt(),它甚至会杀死可逃脱的线程,这些线程在繁琐的系统脚本中无限地运行。这将杀死任何运行的构建。这是代码:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('YOUR JOBNAME')) {
println "Stopping $it.name"
it.stop()
}
}
contains
此处是不正确且危险的-如果您的工作名称为“运行测试”,它将同时杀死所有名为“运行测试-集成”,“运行测试-单元”等的工作。意外终止无关的工作
而不必使用脚本控制台或额外的插件,你可以简单地中止构建的进入/stop
,/term
或/kill
之后在浏览器中生成URL。
从上面的链接中逐字引用:
可以通过向构建的URL端点发送HTTP POST请求来停止管道作业。
- <BUILD ID URL> / stop-中止管道。
- <BUILD ID URL> / term-强制终止构建(仅当stop不起作用时才应使用。
- <BUILD ID URL> / kill-硬终止管道。这是停止管道的最具破坏性的方法,应仅用作最后的手段。
在这种情况下,构建超时插件可以派上用场。如果花费太长时间,它将自动终止该作业。
我想现在回答还为时已晚,但我会帮助一些人。
我的信誉不足,无法发布图片。
希望能有所帮助
在顶部的答案几乎是为我工作,但我有一个重大问题:我有僵尸工作的一个非常大的数量(约100),由于一个特别差的定时詹金斯重新启动,所以手动查找作业名称,每个版本号和每一个僵尸工作然后手动杀死它们都是不可行的。这是我自动找到并杀死僵尸工作的方式:
Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
repository.getItems().each { branch->
branch.builds.each { build->
if (build.getResult().equals(null)) {
build.doKill()
}
}
}
}
该脚本遍历所有作业的所有构建,并用于getResult().equals(null)
确定作业是否完成。处于队列中但尚未开始的构建不会被迭代(因为该构建不会进入job.builds
),并且已经完成的构建将返回null
for 以外的内容build.getResult()
。合法运行的作业还将具有的生成结果null
,因此请确保您没有不想杀死的正在运行的作业,然后再运行。
要发现Multibranch Pipeline项目中每个存储库的每个分支/ PR,必须使用多个嵌套循环。如果您不使用Multibranch Pipelines,则可以直接使用来循环浏览所有作业Jenkins.instance.getItems().each
。
runningBuilds = Jenkins.instance.getView('All').getBuilds().findAll() { it.getResult().equals(null) } runningBuilds.each { branch->branch.doKill() }
我看了看詹金斯的资料,看来我想做的事情是不可能的,因为停止工作似乎是通过线程中断完成的。我不知道为什么工作被挂了..
编辑:
不可阻挡的工作的可能原因:
在这种情况下,我通常使用jenkins-cli。您可以从页面下载jar http://your-jenkins-host:PORT/cli
。然后跑
java -jar jenkins-cli.jar delete-builds name_of_job_to_delete hanging_job_number
辅助信息:
您也可以通过一系列构建350:400
。通过运行可获得常规帮助
java -jar jenkins-cli.jar help
上下文命令帮助delete-builds
的
java -jar jenkins-cli.jar delete-builds
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()
}
}
}
}
最近,我遇到了一个节点/代理,该节点/代理中有一个执行程序被管道作业的构建“ X”占用了几天,尽管该作业页面声称构建“ X”不再存在(在10个后续构建(!)之后被丢弃,因为在管道作业中配置)。验证在磁盘上:构建“ X”确实消失了。
解决方案:是代理程序/节点错误地报告占用的执行程序正在忙于运行构建“ X”。中断该执行程序的线程已立即释放它。
def executor = Jenkins.instance.getNode('NODENAME').computer.executors.find {
it.isBusy() && it.name.contains('JOBNAME')
}
println executor?.name
if (executor?.isBusy()) executor.interrupt()
考虑的其他答案:
Thread.getAllStackTraces()
:没有匹配的线程。getBuildByNumber()
:的答案都不适用于该版本,因为该构建不再存在!更新:
我再次遇到了类似的情况,一个执行器被(仍然存在的)已完成的管道构建占用了数天。此代码段是唯一可行的解决方案。
我在最后一个半小时遇到了同样的问题...
无法删除在我的多分支管道中运行的僵尸版本。甚至Server也通过UI重启,甚至通过命令行sudo service jenkins restart
从命令行重启,都阻止了执行...构建不可停止...它总是会重新出现。
使用的版本:Jenkins ver 2.150.2
我很生气,但是...当查看构建日志时,我发现在日志末尾有一些有趣的地方:
红色标记的部分是“令人沮丧的部分” ...正如您所看到的,我一直想从UI中止构建,但是它没有用...
但是有一个带有文本的超链接Click here to forcibly terminate running steps
...(第一个绿色的)现在我按了链接...)链接执行后,关于Still paused
另一个链接的消息出现了Click
here to forcibily kill entire build
(第二个绿色的)在按了此链接之后,构建也很困难被杀...
因此,这似乎不需要任何特殊的插件(多分支管道构建插件本身除外)也可以工作。
tail
或日志查看器来获取链接呢?
<a href="#" onclick="new Ajax.Request('[server]/jenkins/job/[pipeline_name]/[job_number]/kill'); return false">Click here to forcibly kill entire build</a>
每次都对我有用:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('YOUR JOBNAME')) {
println "Stopping $it.name"
it.stop()
}
感谢funql.org
我编写的名为jkillthread的实用程序可用于停止任何Java进程中的任何线程,只要您可以使用同一帐户登录到运行该服务的计算机即可。
我看到此问题的原因是http
页面上的链接不正确,而不是https
应该停止工作。您需要做的就是onclick
在html页面中编辑属性,方法如下
onclick
属性以编辑其值s
到http
有https
在https:// my-jenkins / script上使用脚本控制台
import hudson.model.Job
import org.jenkinsci.plugins.workflow.job.WorkflowRun
Collection<Job> jobs = Jenkins.instance.getItem('My-Folder').getAllJobs()
for (int i = 0; i < jobs.size(); i++) {
def job = jobs[i]
for (int j = 0; j < job.builds.size(); j++) {
WorkflowRun build = job.builds[j]
if (build.isBuilding()) {
println("Stopping $job ${build.number}")
build.setResult(Result.FAILURE)
}
}
}
这是我在2.100
Blue Ocean 版本中解决此问题的方法
ssh
放入我的詹金斯盒子
cd ~/.jenkins
(存放詹金斯的
地方)
cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>
此后,您可以选择更改编号nextBuildNumber
(我这样做了)。
最后,我重新启动了jenkins(brew services restart jenkins
)。根据您如何管理和安装Jenkins,此步骤显然会有所不同。
输入蓝色海洋用户界面。尝试从那里停止工作。