2012-09-06 32 views

Respuesta

41

no he probado yo mismo, pero mirando el API debería ser posible de la siguiente manera:

import hudson.model.* 

def q = Jenkins.instance.queue 

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

enlaces API pertinentes:

+2

Awesome! Funciona como un amuleto :) – GuySoft

+0

Nota: asegúrese de que sea una secuencia de comandos groovy * system * – GuySoft

+0

¿Cómo se obtienen los parámetros del trabajo (también conocido como buildVariables?) De una tarea en cola? –

2

Usa el jenkins groovy postbu Plugin de ILD:
creo que esto sería el guión maravilloso:

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

Teniendo en cuenta que la consola de scripts se puede usar, o de varias otras maneras, no estoy seguro de que la primera afirmación tenga sentido, quizás algunos de los métodos tengan más sentido. –

4

no podían añadir al menos un comentario, pero a partir de hoy con las últimas Jenkins, el guión de Andrey (agradable) requiere otra importación trabajar. Ejecutando como script Groovy del sistema.

Jenkins comete errores y menciona la clase que falta. Incluí la url que menciona el tema:

//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

Para controlar cola de construcción trabajo, puede utilizar este plugin también: https://wiki.jenkins-ci.org/display/JENKINS/Block+queued+job+plugin

  • Para bloquear trabajo cuando la última compilación del proyecto de destino definido es en la construcción estado
  • Para bloquear trabajo cuando la última compilación del proyecto de destino definido ha resultado
2

Aquí es mi solución, si desea ejecutar sólo el más reciente trabajo del mismo proyecto de la cola de construcción y cancelar la otra:

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

he ampliado sobre el fragmento de Igor Zilberman de modo que también aborta ejecución de trabajos cuando hay un trabajo en la cola con la misma causa (lo que ves cuando pasas el cursor sobre el trabajo en la cola de creación, solo mirando la primera línea). Estoy ejecutando esto como un trabajo con el paso de compilación "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

sé que es un poco de una vieja pregunta, pero Google me señala a éste. Los scripts que se muestran aquí solo eliminan los trabajos de la cola y no detienen la ejecución de compilaciones. El siguiente script simplemente elimina todo de la cola y elimina todas las compilaciones en ejecución:

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

Esta debería ser la respuesta aceptada. –

Cuestiones relacionadas