我们的 Jenkins 服务器有一个工作已经运行了三天,但没有做任何事情。点击角落里的小 X 没有任何反应,控制台输出日志也没有显示任何内容。我检查了我们的构建服务器,该工作实际上似乎根本没有运行。
有没有办法告诉詹金斯工作已经“完成”,通过编辑一些文件或锁或其他东西?由于我们有很多工作,我们真的不想重新启动服务器。
我们的 Jenkins 服务器有一个工作已经运行了三天,但没有做任何事情。点击角落里的小 X 没有任何反应,控制台输出日志也没有显示任何内容。我检查了我们的构建服务器,该工作实际上似乎根本没有运行。
有没有办法告诉詹金斯工作已经“完成”,通过编辑一些文件或锁或其他东西?由于我们有很多工作,我们真的不想重新启动服务器。
我也有同样的问题,并通过 Jenkins 控制台修复它。
转到“管理 Jenkins”>“脚本控制台”并运行脚本:
Jenkins .instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));
您只需指定您的 JobName 和 JobNumber。
转到“管理 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")
);
如果您有Multibranch Pipeline -job(并且您是 Jenkins 管理员),请在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
无需使用脚本控制台或其他插件,您可以通过在浏览器中输入、或在构建 URL 之后简单地中止构建。/stop
/term
/kill
从上面的链接逐字引用:
可以通过向构建的 URL 端点发送 HTTP POST 请求来停止管道作业。
- <BUILD ID URL>/stop - 中止管道。
- <BUILD ID URL>/term - 强制终止构建(仅应在停止不起作用时使用。
- <BUILD ID URL>/kill - 硬终止管道。这是阻止管道的最具破坏性的方法,只能作为最后的手段。
第一个提议的解决方案非常接近。如果您使用 stop() 而不是 interrupt() 它甚至会杀死失控的线程,这些线程在 groovy 系统脚本中无休止地运行。这将杀死任何为工作而运行的构建。这是代码:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('YOUR JOBNAME')) {
println "Stopping $it.name"
it.stop()
}
}
一旦我遇到“脚本控制台”无法停止的构建。最后,我通过以下步骤解决了问题:
ssh onto the jenkins server
cd to .jenkins/jobs/<job-name>/builds/
rm -rf <build-number>
restart jenkins
我使用监控插件来完成这项任务。安装插件后
搜索挂起的作业名称
线程的名称将像这样开始
Executor #2 for master : executing <your-job-name> #<build-number>
单击所需工作所在行表中最右侧的红色圆形按钮
我想现在回答为时已晚,但我帮助了一些人。
抱歉,我没有足够的声誉发布图片。
希望它可以帮助
最佳答案几乎对我有用,但我遇到了一个主要问题:由于 Jenkins 重新启动的时机特别糟糕,我有大量(约 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)
确定作业是否已完成。队列中但尚未开始的构建将不会被迭代(因为该构建不会 in job.builds
),并且已经完成的构建将返回除null
for以外的其他内容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()
}
}
}
}
有同样的问题,但没有堆栈线程。我们在 Jenkins 控制台中使用此代码段删除了该作业。用你的替换 jobname 和 build dnumber。
def jobname = "Main/FolderName/BuildDefinition"
def buildnum = 6
Jenkins.instance.getItemByFullName(jobname).getBuildByNumber(buildnum).delete();
最近我遇到了一个节点/代理,它有一个执行程序被管道作业的构建“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()
: 的答案都不适用,因为构建不再存在!更新:
我再次遇到了类似的情况,其中一个 Executor 被一个(仍然存在的)完成的管道构建占用了好几天。此代码段是唯一可行的解决方案。
在这种情况下,我通常使用 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
by
java -jar jenkins-cli.jar delete-builds
我看到这个问题的原因是http
页面上的链接不正确,而不是https
应该停止工作。您需要做的就是编辑onclick
html页面中的属性,如下
onclick
属性以编辑其值s
_http
https
我在最后半小时遇到了同样的问题...
无法删除在我的多分支管道中运行的僵尸构建。甚至服务器通过 UI 甚至通过命令行重新启动sudo service jenkins restart
确实阻止了执行......构建不可停止......它总是重新出现。
使用版本:Jenkins 2.150.2 版
我很恼火,但是......在查看构建日志时,我发现日志末尾有一些有趣的东西:
红色标记的部分是“令人沮丧的部分”......如您所见,我一直想从 UI 中止构建,但它没有工作......
但是有一个带有文本的超链接Click here to forcibly terminate running steps
...(第一个绿色的)现在我按下了链接...)在链接执行之后,Still paused
出现了一条关于另一个链接的消息Click
here to forcibily kill entire build
(第二个绿色的)在按下这个链接之后,构建最终也很困难杀了……
所以这似乎在没有任何特殊插件的情况下工作(除了多分支管道构建插件本身)。
这对我每次都有效:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('YOUR JOBNAME')) {
println "Stopping $it.name"
it.stop()
}
}
感谢 funql.org
我有很多僵尸作业,所以我使用了以下脚本:
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"))
}
在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)
}
}
}
我现在两次遇到同样的问题,唯一的修复沙发是重新启动 tomcat 服务器并重新启动构建。
我写的一个叫做jkillthread的实用程序可以用来停止任何 Java 进程中的任何线程,只要你可以在同一帐户下登录到运行该服务的机器。
这些解决方案都不适合我。我不得不重新启动安装服务器的机器。无法杀死的工作现在已经消失了。
您可以复制作业并删除旧作业。如果您丢失旧的构建日志并不重要。
这是我在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 的方式。
进入蓝海界面。尝试从那里停止工作。