2012-09-06 17 views

risposta

41

Non ho provato io stesso, ma guardando il API dovrebbe essere possibile nel seguente modo:

import hudson.model.* 

def q = Jenkins.instance.queue 

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

tutto Link API:

+2

Impressionante! Funziona come un fascino :) – GuySoft

+0

Nota: assicurati che sia uno script * system * groovy – GuySoft

+0

Come si ottengono i parametri del job (cioè buildVariables?) Da un'attività in coda? –

2

Usa il jenkins groovy postbu plug-ild:
penso che questo sarebbe lo script Groovy:

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

Considerando che la console di script potrebbe essere usata, o in un certo numero di altri modi - non sono sicuro che la prima affermazione abbia senso - forse alcuni dei metodi avrebbero più senso. –

4

non poteva aggiungere come commento, ma a partire da oggi con le ultime Jenkins, lo script di Andrey (bel) richiede un altro importazione di lavorare. Esecuzione come script Groovy di sistema.

Errori Jenkins e cita la classe mancante. Ho incluso l'URL che menzionato la questione:

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

Per controllare coda di costruzione lavoro, è possibile usare questo plugin anche: https://wiki.jenkins-ci.org/display/JENKINS/Block+queued+job+plugin

  • Per bloccare lavoro, quando l'ultima build del progetto di destinazione definito è in costruzione stato
  • Per bloccare lavoro, quando l'ultima build del progetto di destinazione definito è risultato
2

Qui è la mia soluzione, se si desidera eseguire solo il lavoro più recente dello stesso progetto dalla coda di costruzione e annullare altri:

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

ho ampliato sul frammento da Igor Zilberman in modo che interrompe anche l'esecuzione dei lavori, quando c'è un lavoro in coda con la stessa causa (quello che vedi quando passi il mouse sopra il lavoro nella coda di build, guardando solo la prima riga). Sto eseguendo questo come un lavoro con la fase di costruzione "Esegui Script Groovy di sistema".


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

so che è una specie di vecchia questione, ma Google mi ricorda a questo. Gli script mostrati qui rimuovono solo i lavori dalla coda e non smettono di eseguire build. Lo script che segue, solo rimuove tutto dalla coda e uccide tutti in esecuzione costruisce:

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

Questa dovrebbe essere la risposta accettata. –

Problemi correlati