如何清除我的Jenkins/Hudson构建历史记录?

92

我最近更新了Hudson构建的配置,但是构建历史记录不同步。有没有办法清除我的构建历史记录?

谢谢。


你能详细说明一下“完全混乱”是什么意思吗?也许有人之前遇到过类似的问题,可以指导你如何解决它。 - Rob Hruska
抱歉,关于模糊不清的问题已经解决。 - Mahdi Yusuf
这里有一个更新且稍微更具体的问题:https://dev59.com/rmcs5IYBdhLWcg3wMxFF#22303284 - Erwan Legrand
这篇文章可能会有所帮助:http://codeketchup.blogspot.sg/2016/05/how-to-clean-and-reset-jenkins-build.html - Nayana Adassuriya
这是我找到的最佳答案:https://superuser.com/questions/1418885/clear-jenkins-build-history-clear-build-yesterday - Asma Zubair
17个回答

119

使用脚本控制台(管理Jenkins>脚本控制台),并使用类似于此脚本来批量删除作业的构建历史记录:https://github.com/jenkinsci/jenkins-scripts/blob/master/scriptler/bulkDeleteBuilds.groovy

该脚本假定您只想删除一定范围内的构建。要删除给定作业的所有构建,请使用以下内容(已测试):

// change this variable to match the name of the job whose builds you want to delete
def jobName = "Your Job Name"
def job = Jenkins.instance.getItem(jobName)

job.getBuilds().each { it.delete() }
// uncomment these lines to reset the build number to 1:
//job.nextBuildNumber = 1
//job.save()

5
太好了!绝对是最好的方法! :) - hek2mgl
很棒的技巧,但是如何重置构建计数器呢?有没有相应的脚本可以实现? - Jes Chergui
1
@JesChergui 我已经更新了以显示如何重置构建编号。脚本控制台可以让您控制各种事情,请参见http://javadoc.jenkins-ci.org/(AbstractProject是玩转作业的好起点) - rjohnston
我遇到了这个错误;java.lang.NullPointerException: 无法在空对象上调用getBuilds()方法 - muhammed ozbilici
尝试使用Jenkins.instance.getItemByFullName而不是Jenkins.instance.getItem。 - Michael Platings
显示剩余3条评论

84

这个答案是给Jenkins的

  1. 进入你的Jenkins首页 → 管理Jenkins脚本控制台

    在此输入图像描述

  2. 在那里运行以下脚本。将copy_folder更改为您的项目名称

代码:

def jobName = "copy_folder"
def job = Jenkins.instance.getItem(jobName)
job.getBuilds().each { it.delete() }
job.nextBuildNumber = 1
job.save()

我的文章


8
到目前为止最佳答案 - Dmitry Zaytsev
2
这是最快的解决方案。 - davegallant
是的,但对于这个问题,请不要重新启动Jenkins,否则在重启后进行构建时,似乎无法将nextbuildnumber更新为1。我的从39开始,所以我不得不重新做一遍。 - Will
适用于Jenkins 2.75的工作。 - ѺȐeallү

51

如果您点击“管理Hudson / 从磁盘重新加载配置”,Hudson将重新加载所有构建历史数据。

如果磁盘上的数据出错,您需要前往%HUDSON_HOME%\jobs\<projectname>目录,并按照预期还原构建目录。然后重新加载配置数据。

如果您只想删除所有构建历史记录,如果只有几个构建记录,可以通过UI逐个删除构建记录,或者前往%HUDSON_HOME%\jobs\<projectname>目录并删除那里的所有子目录--它们对应于构建记录。完成操作后,请重启服务以使更改生效。


我已删除“/var/lib/jenkins/jobs/Demo”目录下的所有文件和文件夹,但当我进入Jenkins UI时,在该JOB中仍然看到构建历史记录。 - paul
1
在你"猴子般"地调整目录结构后,只需进入"管理Jenkins"并选择"从磁盘重新加载配置"。 - DanBaker
1
@Paul,在那里删除文件夹后,需要重新启动Jenkins才能看到构建历史记录从UI中消失。 顺便说一下,如果我们正在使用Jenkins,则路径通常位于/var/jenkins_home/jobs/{project name}/builds/。 - Bright
我认为这个解决方案在系统方面需要太多步骤,@Nayana Adassuriya的答案提供了一个更加简洁的解决方案。 - lfn

24

这里还有另一种选择:使用 cURL 删除构建。

$ curl -X POST http://jenkins-host.tld:8080/jenkins/job/myJob/[1-56]/doDeleteAll

上述操作将删除名为myJob的任务的第1到56次构建记录。

如果Jenkins实例启用了身份验证,需要提供用户名和API令牌,例如:

$ curl -u userName:apiToken -X POST http://jenkins-host.tld:8080/jenkins/job/myJob/[1-56]/doDeleteAll

API令牌必须从Jenkins的/me/configure页面获取。只需点击"Show API Token..."按钮即可显示用户名和API令牌。

编辑:根据Jenkins使用的配置或版本,可能需要将上述URL中的doDeleteAll替换为doDelete才能使其正常工作。


非常有用,谢谢!这是唯一一个(至少在这个问题上)允许选择性删除的答案,例如当您发现一个工作之前没有配置为丢弃旧构建并想要摆脱大量(但不是全部)历史记录时。 - Chris Hillery

12

以下是使用Jenkins脚本删除所有任务的所有构建历史记录的方法......

def jobs = Jenkins.instance.projects.collect { it } 
jobs.each { job -> job.getBuilds().each { it.delete() }} 

jenkins 2.293返回:结果:[],构建未被删除。 - JRichardsz

9

您可以暂时修改项目配置,仅保存最后1次构建,重新加载配置(这应该会删除旧的构建),然后再将配置设置更改为所需值。


抱歉,我已经好几年没有使用Hudson了,但是关于重新加载配置的问题,你可以参考这个链接:https://dev59.com/OW435IYBdhLWcg3wxDP_ - the_mandrill
作为一个没有Jenkins管理员权限的人,这是我唯一可行的选择。 - DrStrangepork

7

如果您想清除MultiBranchProject(例如pipeline)的构建历史记录, 请进入Jenkins主页→管理Jenkins→脚本控制台并运行以下脚本:

def projectName = "ProjectName"
def project = Jenkins.instance.getItem(projectName)
def jobs = project.getItems().each {
  def job = it
  job.getBuilds().each { it.delete() }
  job.nextBuildNumber = 1
  job.save()
}

这是唯一有效的方法。谢谢Marin! - Rodyb

7
这是目前最好的选择。
Jenkins.instance.getAllItems(AbstractProject.class).each {it -> Jenkins.instance.getItemByFullName(it.fullName).builds.findAll { it.number > 0 }.each { it.delete() } }

这段代码将删除所有Jenkins作业构建历史记录。


3
如果有人想知道如何运行上述代码,请前往Jenkins主页>管理Jenkins>脚本控制台。那里将会有一个文本框,您可以在其中输入此脚本。 - Pharaoh Tools
Jenkins 2.293 返回了作业名称,但是构建并没有被移除。 - JRichardsz

3

使用脚本控制台。

如果任务已分组,则可以使用斜杠给出完整名称:

getItemByFullName("folder_name/job_name") 
job.getBuilds().each { it.delete() }
job.nextBuildNumber = 1
job.save()

或者像这样遍历层次结构:
def folder = Jenkins.instance.getItem("folder_name")
def job = folder.getItem("job_name")
job.getBuilds().each { it.delete() }
job.nextBuildNumber = 1
job.save()

2

进入“管理Jenkins”>“脚本控制台”

运行以下命令:

def jobName = "build_name"  
def job = Jenkins.instance.getItem(jobName)  
job.getBuilds().each { it.delete() }  
job.save()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接