Quadratical
Quadratical

Reputation: 11

How can I abort all jobs with a certain name?

I'm attempting to set up a script to kill/abort all Jenkins jobs with a certain name in them. I've had trouble finding documentation on Jenkins classes and what's contained in them.

I know there are plugins available, but I've been directed not to use them. Otherwise, I've referred to a few semi-related questions here (How to stop an unstoppable zombie job on Jenkins without restarting the server?), (Cancel queued builds and aborting executing builds using Groovy for Jenkins), and I attempted to rework some of the code from those, however it doesn't quite result in killed jobs:

import hudson.model.*

def jobList = Jenkins.instance.queue

jobList.items.findAll { it.task.name.contains('searchTerm') }.each { jobList.kill(it.task) }

I've also tried the following:

def jobname = ""
def buildnum = 85

def job = Jenkins.instance.getItemByFullName(jobname)
 for (build in job.builds) {
     if (buildnum == build.getNumber().toInteger()){
       if (build.isBuilding()){
         build.doStop();
         build.doKill();

       }
     }

}

Instead of hard-killing jobs, the first script does nothing, while the second throws a NullPointerException:

java.lang.NullPointerException: Cannot get property 'builds' on null object

Upvotes: 0

Views: 6089

Answers (1)

Quadratical
Quadratical

Reputation: 11

I managed to get it working; my second example wasn't working because I brainfarted and the job I was testing it on had no builds. :(

def searchTerm = ""
def matchedJobs = Jenkins.instance.items.findAll { job ->
        job.name.contains(searchTerm)
def desiredState = "stop"

if (desiredState.equals("stop")) {
            println "Stopping all current builds ${job.name}"
            for (build in job.builds) {
                if (build.isBuilding()){
                    build.doStop();
                    println build.name + " successfully stopped!"
                }
            }
}

Upvotes: 1

Related Questions