221

我们的 Jenkins 服务器有一个工作已经运行了三天,但没有做任何事情。点击角落里的小 X 没有任何反应,控制台输出日志也没有显示任何内容。我检查了我们的构建服务器,该工作实际上似乎根本没有运行。

有没有办法告诉詹金斯工作已经“完成”,通过编辑一些文件或锁或其他东西?由于我们有很多工作,我们真的不想重新启动服务器。

4

27 回答 27

302

我也有同样的问题,并通过 Jenkins 控制台修复它。

转到“管理 Jenkins”>“脚本控制台”并运行脚本:

 Jenkins .instance.getItemByFullName("JobName")
        .getBuildByNumber(JobNumber)
        .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")); 

您只需指定您的 JobName 和 JobNumber。

于 2016-07-20T12:49:22.127 回答
270

转到“管理 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")
                );
于 2014-10-10T18:48:05.170 回答
56

如果您有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

于 2018-01-16T10:52:54.523 回答
38

无需使用脚本控制台或其他插件,您可以通过在浏览器中输入、或在构建 URL 之后简单地中止构建。/stop/term/kill

从上面的链接逐字引用:

可以通过向构建的 URL 端点发送 HTTP POST 请求来停止管道作业。

  • <BUILD ID URL>/stop - 中止管道。
  • <BUILD ID URL>/term - 强制终止构建(仅应在停止不起作用时使用。
  • <BUILD ID URL>/kill - 硬终止管道。这是阻止管道的最具破坏性的方法,只能作为最后的手段。
于 2019-08-14T17:31:52.993 回答
30

第一个提议的解决方案非常接近。如果您使用 stop() 而不是 interrupt() 它甚至会杀死失控的线程,这些线程在 groovy 系统脚本中无休止地运行。这将杀死任何为工作而运行的构建。这是代码:

Thread.getAllStackTraces().keySet().each() {
    if (it.name.contains('YOUR JOBNAME')) {  
      println "Stopping $it.name"
      it.stop()
    }
}
于 2017-02-22T16:39:51.297 回答
29

一旦我遇到“脚本控制台”无法停止的构建。最后,我通过以下步骤解决了问题:

ssh onto the jenkins server
cd to .jenkins/jobs/<job-name>/builds/
rm -rf <build-number>
restart jenkins
于 2016-11-18T09:22:58.233 回答
26

我使用监控插件来完成这项任务。安装插件后

  1. 转到管理 Jenkins > 监控 Hudson/Jenkins master
  2. 展开Threads的Details,右侧的蓝色小链接
  3. 搜索挂起的作业名称

    线程的名称将像这样开始

    Executor #2 for master : executing <your-job-name> #<build-number>

  4. 单击所需工作所在行表中最右侧的红色圆形按钮

于 2015-03-19T14:03:32.833 回答
15

如果您有不可阻挡的流水线作业,请尝试以下操作:

  1. 通过单击构建进度条旁边的红色 X 中止作业
  2. 单击构建上的“暂停/恢复”以暂停
  3. 再次单击“暂停/恢复”以恢复构建

暂停/恢复管道作业

詹金斯会意识到工作应该被终止并停止构建

于 2016-12-14T08:13:08.373 回答
8

我想现在回答为时已晚,但我帮助了一些人。

  1. 安装监控插件。(http://wiki.jenkins-ci.org/display/JENKINS/Monitoring
  2. 转到 jenkinsUrl/monitoring/nodes
  3. 转到底部的线程部分
  4. 点击大师左侧的详情按钮
  5. 按用户时间(毫秒)排序
  6. 然后查看线程的名称,你会有构建的名称和编号
  7. 杀了它

抱歉,我没有足够的声誉发布图片。

希望它可以帮助

于 2015-04-17T16:18:02.313 回答
8

最佳答案几乎对我有用,但我遇到了一个主要问题:由于 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),并且已经完成的构建将返回除nullfor以外的其他内容build.getResult()。一个合法运行的作业也会有一个构建结果null,所以在运行它之前确保你没有不想杀死的正在运行的作业。

多个嵌套循环主要用于发现 Multibranch Pipeline 项目中每个存储库的每个分支/PR;如果您不使用 Multibranch Pipelines,您可以直接使用类似Jenkins.instance.getItems().each.

于 2017-11-28T20:04:02.650 回答
7

对于这种情况,构建超时插件可以派上用场。如果时间过长,它会自动终止工作。

于 2013-01-22T15:05:42.053 回答
5

我查看了 Jenkins 源代码,看来我想做的事情是不可能的,因为停止工作似乎是通过线程中断完成的。我不知道为什么这份工作挂了..

编辑:

无法停止工作的可能原因:

  • 如果 Jenkins 陷入无限循环,它永远无法中止。
  • 如果 Jenkins 在 Java VM 中进行网络或文件 I/O(例如冗长的文件复制或 SVN 更新),则无法中止。
于 2013-01-22T11:38:44.993 回答
5

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()
      }
    }
  }
}
于 2017-03-06T02:13:51.683 回答
4

有同样的问题,但没有堆栈线程。我们在 Jenkins 控制台中使用此代码段删除了该作业。用你的替换 jobname 和 build dnumber。

def jobname = "Main/FolderName/BuildDefinition"
def buildnum = 6
Jenkins.instance.getItemByFullName(jobname).getBuildByNumber(buildnum).delete(); 
于 2018-05-01T15:19:05.567 回答
4

最近我遇到了一个节点/代理,它有一个执行程序被管道作业的构建“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()

考虑的其他答案:

  • @cheffe 的回答:没有用(见下一点,并在下面更新)。
  • 答案是Thread.getAllStackTraces():没有匹配的线程。
  • @levente-holló 的答案以及所有带有getBuildByNumber(): 的答案都不适用,因为构建不再存在!
  • @austinfromboston 的回答:这接近我的需求,但它也会破坏目前正在运行的任何其他构建。

更新:
我再次遇到了类似的情况,其中一个 Executor 被一个(仍然存在的)完成的管道构建占用了好几天。此代码段是唯一可行的解​​决方案。

于 2018-10-10T18:21:28.570 回答
3

在这种情况下,我通常使用 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-buildsby

java -jar jenkins-cli.jar delete-builds
于 2014-12-11T14:07:10.320 回答
3

非常简单的解决方案

我看到这个问题的原因是http页面上的链接不正确,而不是https应该停止工作。您需要做的就是编辑onclickhtml页面中的属性,如下

  1. 打开挂起的作业(管道)的控制台日志
  2. 单击可终止作业的任何内容(x 图标、“单击此处强制终止正在运行的步骤”等)以显示“单击此处强制终止整个构建”链接(目前无法单击)
  3. 打开浏览器的控制台(对 chrome 使用以下三种中的任何一种:F12;ctrl + shift + i;菜单->更多工具->开发者工具
  4. 手动找到“单击此处强制终止整个构建”链接或使用控制台的“选择页面中的元素”按钮
  5. 双击onclick属性以编辑其值
  6. 追加有s_httphttps
  7. 按 Enter 提交更改
  8. 单击“单击此处强制终止整个构建”链接

使用截图作为参考 在此处输入图像描述

于 2019-06-18T19:29:02.137 回答
2

我在最后半小时遇到了同样的问题...

无法删除在我的多分支管道中运行的僵尸构建。甚至服务器通过 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(第二个绿色的)在按下这个链接之后,构建最终也很困难杀了……

所以这似乎在没有任何特殊插件的情况下工作(除了多分支管道构建插件本身)。

于 2019-02-27T20:45:06.853 回答
2

这对我每次都有效:

Thread.getAllStackTraces().keySet().each() {
    if (it.name.contains('YOUR JOBNAME')) {  
      println "Stopping $it.name"
      it.stop()
    }
}

感谢 funql.org

于 2020-01-05T09:56:38.213 回答
1

我有很多僵尸作业,所以我使用了以下脚本:

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"))
}
于 2018-08-27T15:17:39.170 回答
1

在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)
    }
  }
}
于 2019-06-22T17:26:05.067 回答
0

我现在两次遇到同样的问题,唯一的修复沙发是重新启动 tomcat 服务器并重新启动构建。

于 2014-05-14T07:34:43.350 回答
0

我写的一个叫做jkillthread的实用程序可以用来停止任何 Java 进程中的任何线程,只要你可以在同一帐户下登录到运行该服务的机器。

于 2015-10-01T13:36:43.250 回答
0

这些解决方案都不适合我。我不得不重新启动安装服务器的机器。无法杀死的工作现在已经消失了。

于 2019-12-03T16:41:42.780 回答
-1

您可以复制作业并删除旧作业。如果您丢失旧的构建日志并不重要。

于 2016-03-07T08:34:58.460 回答
-2

这是我在2.100Blue Ocean 版本中解决此问题的方法

  • 我安装的唯一插件是用于 bitbucket。
  • 我只有一个节点。

ssh进入我的詹金斯盒子
cd ~/.jenkins(我保存詹金斯的地方)
cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>

在此之后,您可以选择更改nextBuildNumber(我做了这个) 中的数字

最后,我重新启动了 jenkins(brew services restart jenkins)这一步显然会有所不同,具体取决于您管理和安装 Jenkins 的方式。

于 2018-01-05T18:41:26.857 回答
-4

进入蓝海界面。尝试从那里停止工作。

于 2018-07-24T04:45:38.353 回答