2012-09-06 25 views

Antwort

41

Ich habe es selbst nicht getestet, aber am API sucht, sollte es in der folgenden Art und Weise möglich sein:

import hudson.model.* 

def q = Jenkins.instance.queue 

q.items.findAll { it.task.name.startsWith('my') }.each { q.cancel(it.task) } 

Relevante API Links:

+2

Super! Funktioniert wie ein Charme :) – GuySoft

+0

Hinweis: Stellen Sie sicher, es ist ein groovy * System * Skript – GuySoft

+0

Wie bekommt man die Job-Parameter (aka buildVariables?) Von einer Aufgabe in der Warteschlange? –

2

Verwenden Sie die Jenkins Groovy Postbu ild Plugin:
Ich denke, das das fetzige Skript wäre:

import hudson.model.* 
def q = jenkins.model.Jenkins.getInstance().getQueue() 
def items = q.getItems() 
for (i=0;i<items.length;i++){ 
    if(items[i].task.getName() == "job_name"){ 
    items[i].doCancelQueue() 
} 
} 
+0

Wenn man bedenkt, dass die Skriptkonsole verwendet werden kann, oder eine Reihe anderer Möglichkeiten - ich bin mir nicht sicher, ob die erste Aussage sinnvoll ist -, wären vielleicht einige der Methoden sinnvoller. –

4

nicht als Kommentar hinzufügen könnte, aber ab heute mit den neuesten jenkins, Andrey Drehbuch (nice) erfordert einen weiteren Import zu arbeiten. Als Groovy-Skript ausführen.

Jenkins Fehler und erwähnt die fehlende Klasse. Ich enthalten die URL, das das Problem erwähnt:

//import hudson.model.* 
// per http://stackoverflow.com/questions/17429050/running-groovy-command-from-jenkins-using-groovy-script-plugin 
// requires this now 
import jenkins.model.Jenkins 

def q = Jenkins.instance.queue 

q.items.findAll { it.task.name.startsWith('my') }.each { q.cancel(it.task) } 
2

Hier Lösung, wenn Sie nur die neueste Arbeit von demselben Projekt aus der Build-Warteschlange ausgeführt werden sollen und Abbrechen andere:

def q = Jenkins.instance.queue 
//Find items in queue that match <project name> 
def queue = q.items.findAll { it.task.name.startsWith('sample_project') } 
//get all jobs id to list 
def queue_list = [] 
queue.each { queue_list.add(it.getId()) } 
//sort id's, remove last one - in order to keep the newest job, cancel the rest 
queue_list.sort().take(queue_list.size() - 1).each { q.doCancelItem(it) } 
0

ich auf das Snippet von Igor Zilberman erweitert habe, so dass es bricht auch Arbeitsplätze laufen, wenn es ein Job in der Warteschlange mit der gleichen Ursache (was Sie sehen, wenn Sie den Mauszeiger über den Job in der Erstellungswarteschlange bewegen und nur die erste Zeile betrachten). Ich führe dies als einen Job mit Build-Schritt "Execute System Groovy Script".


import hudson.model.Result 
import jenkins.model.CauseOfInterruption 
import jenkins.model.*; 

[ // setup job names here 
'my-jobname-here' 
].each {jobName -> 
    def queue = Jenkins.instance.queue 
    def q = queue.items.findAll { it.task.name.equals(jobName) } 
    def r = [:] 
    def projs = jenkins.model.Jenkins.instance.items.findAll { it.name.equals(jobName) } 

    projs.each{p -> 
    x = p._getRuns() 
    x.each{id, y -> 
     r.put(id, y) 
    } 
    } 

    TreeMap queuedMap = [:] 
    TreeMap executingMap = [:] 

    q.each{i-> 
    queuedMap.put(i.getId(), i.getCauses()[0].getShortDescription()) //first line 
    } 
    r.each{id, run-> 
    def exec = run.getExecutor() 
    if(exec != null){ 
     executingMap.put(id, run.getCauses()[0].getShortDescription()) //first line 
    } 
    } 

    println("Queued:") 
    queuedMap.each{ k, v -> println "${k}:${v}" } 
    println("Executing:") 
    executingMap.each{ k, v -> println "${k}:${v}" } 

    // First, if there is more than one queued entry, cancel all but the highest one. 
    // Afterwards, if there is a queued entry, cancel the running ones 

    def queuedNames = queuedMap.values(); 
    queuedNames.each{n -> 
    def idsForName = [] 
    queuedMap.each{ id, name -> 
     if(name.equals(n)){ 
     idsForName.add(id) 
     } 
    } 
    if (idsForName.size() > 1){ 
     println("Cancelling queued job: "+n) 
    } 
    // remove all but the latest from queue 
    idsForName.sort().take(idsForName.size() - 1).each { queue.doCancelItem(it) } 
    } 
    executingMap.each{ id, name -> 
    if(queuedMap.values().contains(name)){ 
     r.each{rid, run-> 
     if (id == rid){ 
      def exec = run.getExecutor() 
      if(exec != null){ 
      println("Aborting running job: "+id+": "+name) 
      exec.interrupt(Result.ABORTED) 
      } 
     } 
     } 
    } 
    } 
} 
return "Done" 
2

Ich weiß, es ist eine Art von einer alten Frage ist, aber Google verweist mich auf diese. Die hier gezeigten Skripts entfernen nur die Jobs aus der Warteschlange und beenden nicht das Ausführen von Builds. Das folgende Skript entfernt einfach alles aus der Warteschlange und beendet alle laufenden Builds:

import java.util.ArrayList 
    import hudson.model.*; 

    // Remove everything which is currently queued 
    def q = Jenkins.instance.queue 
    for (queued in Jenkins.instance.queue.items) { 
    q.cancel(queued.task) 
    } 

    // stop all the currently running jobs 
    for (job in Jenkins.instance.items) { 
    stopJobs(job) 
    } 

    def stopJobs(job) { 
    if (job in com.cloudbees.hudson.plugins.folder.Folder) { 
     for (child in job.items) { 
     stopJobs(child) 
     }  
    } else if (job in org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject) { 
     for (child in job.items) { 
     stopJobs(child) 
     } 
    } else if (job in org.jenkinsci.plugins.workflow.job.WorkflowJob) { 

     if (job.isBuilding()) { 
     for (build in job.builds) { 
     build.doKill() 
     } 
     } 
    } 
    } 
+0

Dies sollte die akzeptierte Antwort sein. –

Verwandte Themen