-
-
Save kumbasar/9f45da525e9cf20ee48e624b2f9533fc to your computer and use it in GitHub Desktop.
MAX_BUILDS = 10 // max builds to keep | |
def jobs = Jenkins.instance.items; | |
for (job in jobs) { | |
println "Job: " + job.name | |
try { | |
if(job instanceof jenkins.branch.MultiBranchProject) { | |
println "Multibranch" | |
job = job.getJob("master") | |
} | |
def recent = job.builds.limit(MAX_BUILDS) | |
println "Recent Builds: " + recent | |
println "=============================" | |
for (build in job.builds) { | |
if (!recent.contains(build) && !build.isBuilding()) { | |
println "Deleting: " + build | |
build.delete() | |
println "" | |
} | |
} | |
} catch(Exception ex) { | |
continue | |
} | |
} |
¡Hola!
Could you please provide the error console?
Sure
Thanks for you advance.
[Pipeline] echo
MULTIBRANCH-PROJECT: (pipeline-angular-test-app)
[Pipeline] echo
MULTIBRANCH-JOB: (master)
[Pipeline] echo
Checking for Old Builds...
[Pipeline] echo
Eliminando... bfs-desarrollo-pipelines/pipeline-angular-test-app/master #58
[Pipeline] echo
Eliminando... bfs-desarrollo-pipelines/pipeline-angular-test-app/master #56
[Pipeline] End of Pipeline
java.util.NoSuchElementException
at org.jenkinsci.plugins.workflow.cps.persistence.IteratorHack$Itr.next(IteratorHack.java:72)
at com.cloudbees.groovy.cps.impl.ForInLoopBlock$ContinuationImpl.increment(ForInLoopBlock.java:63)
at sun.reflect.GeneratedMethodAccessor995.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at WorkflowScript.deleteOldBuilds(WorkflowScript:25)
at WorkflowScript.listJobObjects(WorkflowScript:51)
at WorkflowScript.listJobObjects(WorkflowScript:47)
at WorkflowScript.listJobObjects(WorkflowScript:42)
at WorkflowScript.run(WorkflowScript:66)
at cps.transform(Native Method)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:60)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixName(FunctionCallBlock.java:77)
at sun.reflect.GeneratedMethodAccessor298.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
at com.cloudbees.groovy.cps.Next.step(Next.java:83)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:129)
at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:186)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:370)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:93)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:282)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:270)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE
Lo resolví así
import jenkins.model.*
import hudson.model.*
import com.cloudbees.hudson.plugins.folder.*
import jenkins.branch.*
import org.jenkinsci.plugins.workflow.job.*
import org.jenkinsci.plugins.workflow.multibranch.*
/**
- Función para eliminar los builds antiguos
- @param item El elemento Jenkins actual a procesar, puede ser una carpeta o un proyecto.
- @param numberOfBuildsToKeep El número total de builds para mantener en cada job
*/
def deleteOldBuilds(item, Integer numberOfBuildsToKeep) {
if (numberOfBuildsToKeep < 0) return
def sizeBuilds = getSizeBuildsOfJob(item)
while (sizeBuilds > numberOfBuildsToKeep) {
build = getFirstBuildbyItem(item)
echo 'Eliminando...... ' + build
build.delete()
sizeBuilds = getSizeBuildsOfJob(item)
}
}
def getSizeBuildsOfJob(item) {
return Jenkins.instance.getItemByFullName(item.fullName).builds.size()
}
def getFirstBuildbyItem(item) {
return item.getFirstBuild()
}
def listJobObjects(item, Integer numberOfBuildsToKeep) {
if(item instanceof Project) {
// echo 'PROYECTO: (' + item.getName() + ')'
deleteOldBuilds(item, numberOfBuildsToKeep)
} else if(item instanceof Folder) {
// echo ''
// echo 'CARPETA: (' + item.getName() + ')'
// echo '*************************************'
for (subItem in item.items) {
listJobObjects(subItem, numberOfBuildsToKeep)
}
} else if(item instanceof WorkflowMultiBranchProject) {
// echo 'MULTIBRANCH-PROYECTO: (' + item.getName() + ')'
for (subItem in item.items) {
listJobObjects(subItem, numberOfBuildsToKeep)
}
} else if(item instanceof WorkflowJob) {
// echo 'MULTIBRANCH-JOB: (' + item.getName() + ')'
deleteOldBuilds(item, numberOfBuildsToKeep)
} else if(item instanceof OrganizationFolder) {
// echo 'ORG-CARPETA: (' + item.getName() + ')'
for (subItem in item.items) {
listJobObjects(subItem, numberOfBuildsToKeep)
}
} else {
echo 'UNKNOWN: (' + item.getName() + ')'
echo 'CLASS: (' + item.getClass() + ')'
echo 'INSPECT: (' + item.inspect() + ')'
}
}
for (item in Jenkins.instance.items) {
echo ''
listJobObjects(item, 10)
}
Realice un job para eliminar los builds y mantener solo los 10 últimos pero se está comportando inestable:
Me marca el error Ignoring exception java.util.NoSuchElementException
Esto siempre pasa al intentar eliminar el último build. Si truena elimina el build antepenúltimo
Que estoy haciendo mal?
#!groovy
node {
def max_builds = 10 // max builds to keep
}
@NonCPS
def getJobs() {
return Jenkins.instance.getAllItems(hudson.model.Job.class)
}