Especially if you have a large number of jobs and they are running more often, you’ll come to a point, where your disk is full of old builds.
Hudson provides a configuration parameter for that: “discard old builds”. This will delete old builds according to the specified number of days or number of builds.
For Apache I wrote a script which ensures, that all jobs have “discard” setting and that existing values are not higher than a defined maximum value.
/** Default-Setting for the "number of old builds" */
numberOfOldBuilds = 10
/** Maximum of "number of days" */
maxDaysOfOldBuilds = 14
/** Should we override existing values? */
overrideExistingValues = true
/** Closures for setting default 'max number' */
setMaxNum = { job ->
job.logRotator = new hudson.tasks.LogRotator(-1, numberOfOldBuilds)
}
/** Closures for setting default 'max number' */
setMaxDays = { job ->
job.logRotator = new hudson.tasks.LogRotator(maxDaysOfOldBuilds, -1)
}
// ----- Do the work. -----
// Access to the Hudson Singleton
hudsonInstance = hudson.model.Hudson.instance
// Retrieve all active Jobs
allItems = hudsonInstance.items
activeJobs = allItems.findAll{job -> job.isBuildable()}
// Table header
col1 = "Old".center(10)
col2 = "New".center(10)
col3 = "Job".center(50)
col4 = "Action".center(14)
header = "$col1 | $col2 | $col3 | $col4"
line = header.replaceAll("[^|]", "-").replaceAll("\\|", "+")
title = "Set 'Discard old builds'".center(line.size())
println title
println line
println header
println line
// Do work and create the result table
activeJobs.each { job ->
// Does the job have a discard setting?
discardActive = job.logRotator != null
// Enforce the settings
action = ""
newValue = ""
oldValue = ""
if (!discardActive) {
// No discard settings, so set the default
setMaxNum.call(job)
action = "established"
newValue = "$numberOfOldBuilds jobs"
} else {
// What are the current settings?
oldDays = job.logRotator.daysToKeep
oldNums = job.logRotator.numToKeep
if (oldNums > 0) {
// We have a set value for 'numbers'
if (oldNums > numberOfOldBuilds && overrideExistingValues) {
// value is too large so set a new one
setMaxNum.call(job)
action = "updated"
newValue = "$numberOfOldBuilds jobs"
oldValue = "$oldNums jobs"
} else {
// Correct value or we arent allowed to override.
oldValue = "$oldNums jobs"
}
} else {
// we have a value for 'days'
if (oldDays > maxDaysOfOldBuilds && overrideExistingValues) {
// value is too large so set a new one
setMaxDays.call(job)
action = "updated"
newValue = "$maxDaysOfOldBuilds days"
oldValue = "$oldDays days"
} else {
// Correct value or we aren't allowed to override.
oldValue = "$oldDays days"
}
}
}
// String preparation for table output
oldValue = oldValue.padLeft(10)
newValue = newValue.padLeft(10)
jobname = job.name.padRight(50)
// Table output
println "$oldValue | $newValue | $jobname | $action"
}
println line
// Meaningful output on the Groovy console
// (the console will output the result of the last statement)
printout = "Number of Jobs: $activeJobs.size"
In the first section I define the “constants” (line 001-008). After that I define two closures which update a given Hudson job (line 010-018).
The basic structure is the one I used in earlier scripts …
The work here is in lines 053-088. But that’s pretty easy: check the given values and eventually set new values using the pre defined closures.
New is the last line: I dont use a >x = “”< instruction for suppressing the output. I use a more meaningful message: the number of jobs.


