Jenkins 为所有作业删除早于最新 20 个构建的构建

Jenkins delete builds older than latest 20 builds for all jobs

我正在清理 Jenkins(它设置不正确),我需要为每项工作删除比最新 20 个版本更早的版本。

有什么方法可以使用脚本或其他方式自动执行此操作吗?

我找到了很多删除特定作业的某些构建的解决方案,但我似乎无法同时为所有作业找到任何解决方案。

非常感谢任何帮助。

这可以通过多种方式完成。您可以尝试以下方法

  1. 通过转到 jenkins 中的工作位置和 运行 以下
  2. 获取文本文件中的所有工作名称

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"