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.