Skip to content

Instantly share code, notes, and snippets.

@kumbasar
Forked from pkouman/jenkins_delete_builds.groovy
Last active June 10, 2021 17:07
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save kumbasar/9f45da525e9cf20ee48e624b2f9533fc to your computer and use it in GitHub Desktop.
Save kumbasar/9f45da525e9cf20ee48e624b2f9533fc to your computer and use it in GitHub Desktop.
Jenkins - Delete old builds script
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
}
}
@laluxgp
Copy link

laluxgp commented Jun 20, 2019

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

try {

    stage('Eliminar Builds antiguos') {
        
        getJobs().each { job ->
            try {
                def recent = job.builds.limit(max_builds)

                if (job.fullName == 'bfs-desarrollo-pipelines/pipeline-angular-test-app/master') {
                    job.builds.each { build ->
                        if (!recent.contains(build) && !build.isBuilding()) {
                            println "> > > Deleting: " + build
                            build.delete()
                            println ""
                        }
                    }
                }
            } catch(Exception ex) {
                println ' Ignoring exception ' + ex
            }
        }
        
    }

    currentBuild.result = 'SUCCESS'

} catch(e) {
    currentBuild.result = 'FAILURE'
    throw e
}

}

@NonCPS
def getJobs() {
return Jenkins.instance.getAllItems(hudson.model.Job.class)
}

@kumbasar
Copy link
Author

¡Hola!

Could you please provide the error console?

@laluxgp
Copy link

laluxgp commented Jun 21, 2019

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

@laluxgp
Copy link

laluxgp commented Jun 24, 2019

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)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment