Another Admin job Hudson: ensure that there are not too many old builds …
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.
Schlagwörter: admin, discard old builds, groovy, hudson
You can comment below, or link to this permanent URL from your own site.
14. August 2010 um 22:07
Hey, what language is it? I mean I’ve heard of Hudson but never used it so I’m interested to know what language people write such jobs for it in.
Also what you’ve just described looks like a core function for a CI server – so the project is a bit raw if it hasn’t got it yet? And if I were to use one day I would need to google up this blog post and copy-paste the job?
Thx,
Anton
15. August 2010 um 09:26
Hi Anton,
the script is written in Groovy. Hudson provides a Groovy console (administration > console) where you could paste this code. Since a few weeks there is also a plugin „Scriptler“ which is useful for running „pre-defined“ scripts.
Hudson itself is written in Java and the plugins too. Additional they are using Jelly as HTML-providers.
Feel free to use this script.
Jan
2. November 2010 um 03:22
Auch wenn es hierzu nicht passt. Wir machen BPEL mit jBPM zuerst 4.4 nachher 5.0 und als JMS System nehmen wir HornetQ
31. März 2011 um 22:31
Hi!
Thanks for a useful script!
Would you mind if I added this to the list of scripts
on the scriptler plugin repository (http://scriptlerweb.appspot.com/catalog/list)?
This makes it simple to reuse for other people.
2. April 2011 um 21:34
That’s ok. It is not my first script there 😉
http://scriptlerweb.appspot.com/script/show/26001