Jenkins 为所有作业删除早于最新 20 个构建的构建
Jenkins delete builds older than latest 20 builds for all jobs
我正在清理 Jenkins(它设置不正确),我需要为每项工作删除比最新 20 个版本更早的版本。
有什么方法可以使用脚本或其他方式自动执行此操作吗?
我找到了很多删除特定作业的某些构建的解决方案,但我似乎无法同时为所有作业找到任何解决方案。
非常感谢任何帮助。
这可以通过多种方式完成。您可以尝试以下方法
- 通过转到 jenkins 中的工作位置和 运行 以下
获取文本文件中的所有工作名称
ls >jobs.txt
现在您可以使用 for 循环编写 shell 脚本
#!/bin/bash
##read the jobs.txt
for i in 'cat <pathtojobs.txt>'
do
curl -X POST http://jenkins-host.tld:8080/jenkins/job/$i/[1-9]*/doDeleteAll
done
以上删除所有作业
您还可以refer here获得更多答案
有很多方法可以做到这一点
我个人会在作业配置中使用 'discard old builds'
如果您有很多工作,您可以使用 CLI 逐步完成所有工作以添加它
或者 configuration slicing plugin 也可以大规模地为您执行此操作
您可以使用 Jenkins Script Console 遍历所有作业,获取 N 个最近的列表并对其他作业执行一些操作。
import jenkins.model.Jenkins
import hudson.model.Job
MAX_BUILDS = 20
for (job in Jenkins.instance.items) {
println job.name
def recent = job.builds.limit(MAX_BUILDS)
for (build in job.builds) {
if (!recent.contains(build)) {
println "Preparing to delete: " + build
// build.delete()
}
}
}
Jenkins 脚本控制台是一个很好的管理维护工具,通常有一个现有脚本可以执行与您想要的类似的操作。
对于多分支管道,我稍微修改了 Dave Bacher 的脚本。使用此删除早于 "master" 个分支的最新 20 个版本的版本:
MAX_BUILDS = 20
for (job in Jenkins.instance.items) {
if(job instanceof jenkins.branch.MultiBranchProject) {
job = job.getJob("master")
def recent = job.builds.limit(MAX_BUILDS)
for (build in job.builds) {
if (!recent.contains(build)) {
println "Preparing to delete: " + build
// build.delete()
}
}
}
}
我在文件夹插件 6.6 运行 @Dave Bacher 的脚本
上遇到问题 No such property: builds for class: com.cloudbees.hudson.plugins.folder.Folder
将其更改为使用函数 api
import jenkins.model.Jenkins
import hudson.model.Job
MAX_BUILDS = 5
Jenkins.instance.getAllItems(Job.class).each { job ->
println job.name
def recent = job.builds.limit(MAX_BUILDS)
for (build in job.builds) {
if (!recent.contains(build)) {
println "Preparing to delete: " + build
build.delete()
}
}
}
我对 Jenkins 实例的建议有问题 运行。可能是因为它是码头化的。无论如何,使用底层 bash 解释器预先删除文件夹可以解决问题。我还修改了脚本以保留 180 天的构建日志并至少保留 7 个构建日志:
import jenkins.model.Jenkins
import hudson.model.Job
MIN_BUILD_LOGS = 7
def sixMonthsAgo = new Date() - 180
Jenkins.instance.getAllItems(Job.class).each { job ->
println job.getFullDisplayName()
def recent = job.builds.limit(MIN_BUILD_LOGS)
def buildsToDelete = job.builds.findAll {
!recent.contains(it) && ! (it.getTime() > sixMonthsAgo)
}
if (!buildsToDelete) {
println "nothing to do"
}
for (build in buildsToDelete) {
println "Preparing to delete: " + build + build.getTime()
["bash", "-c", "rm -r " + build.getRootDir()].execute()
build.delete()
}
}
"done"
我正在清理 Jenkins(它设置不正确),我需要为每项工作删除比最新 20 个版本更早的版本。
有什么方法可以使用脚本或其他方式自动执行此操作吗?
我找到了很多删除特定作业的某些构建的解决方案,但我似乎无法同时为所有作业找到任何解决方案。
非常感谢任何帮助。
这可以通过多种方式完成。您可以尝试以下方法
- 通过转到 jenkins 中的工作位置和 运行 以下 获取文本文件中的所有工作名称
ls >jobs.txt
现在您可以使用 for 循环编写 shell 脚本
#!/bin/bash
##read the jobs.txt
for i in 'cat <pathtojobs.txt>'
do
curl -X POST http://jenkins-host.tld:8080/jenkins/job/$i/[1-9]*/doDeleteAll
done
以上删除所有作业
您还可以refer here获得更多答案
有很多方法可以做到这一点
我个人会在作业配置中使用 'discard old builds'
如果您有很多工作,您可以使用 CLI 逐步完成所有工作以添加它
或者 configuration slicing plugin 也可以大规模地为您执行此操作
您可以使用 Jenkins Script Console 遍历所有作业,获取 N 个最近的列表并对其他作业执行一些操作。
import jenkins.model.Jenkins
import hudson.model.Job
MAX_BUILDS = 20
for (job in Jenkins.instance.items) {
println job.name
def recent = job.builds.limit(MAX_BUILDS)
for (build in job.builds) {
if (!recent.contains(build)) {
println "Preparing to delete: " + build
// build.delete()
}
}
}
Jenkins 脚本控制台是一个很好的管理维护工具,通常有一个现有脚本可以执行与您想要的类似的操作。
对于多分支管道,我稍微修改了 Dave Bacher 的脚本。使用此删除早于 "master" 个分支的最新 20 个版本的版本:
MAX_BUILDS = 20
for (job in Jenkins.instance.items) {
if(job instanceof jenkins.branch.MultiBranchProject) {
job = job.getJob("master")
def recent = job.builds.limit(MAX_BUILDS)
for (build in job.builds) {
if (!recent.contains(build)) {
println "Preparing to delete: " + build
// build.delete()
}
}
}
}
我在文件夹插件 6.6 运行 @Dave Bacher 的脚本
上遇到问题No such property: builds for class: com.cloudbees.hudson.plugins.folder.Folder
将其更改为使用函数 api
import jenkins.model.Jenkins
import hudson.model.Job
MAX_BUILDS = 5
Jenkins.instance.getAllItems(Job.class).each { job ->
println job.name
def recent = job.builds.limit(MAX_BUILDS)
for (build in job.builds) {
if (!recent.contains(build)) {
println "Preparing to delete: " + build
build.delete()
}
}
}
我对 Jenkins 实例的建议有问题 运行。可能是因为它是码头化的。无论如何,使用底层 bash 解释器预先删除文件夹可以解决问题。我还修改了脚本以保留 180 天的构建日志并至少保留 7 个构建日志:
import jenkins.model.Jenkins
import hudson.model.Job
MIN_BUILD_LOGS = 7
def sixMonthsAgo = new Date() - 180
Jenkins.instance.getAllItems(Job.class).each { job ->
println job.getFullDisplayName()
def recent = job.builds.limit(MIN_BUILD_LOGS)
def buildsToDelete = job.builds.findAll {
!recent.contains(it) && ! (it.getTime() > sixMonthsAgo)
}
if (!buildsToDelete) {
println "nothing to do"
}
for (build in buildsToDelete) {
println "Preparing to delete: " + build + build.getTime()
["bash", "-c", "rm -r " + build.getRootDir()].execute()
build.delete()
}
}
"done"