2012-04-23 10 views

Respuesta

1

Puede hacerlo con un sistema Groovy Script ejecutado a través de Groovy Script Plugin. Tal script tiene acceso directo a Jenkins a través de su programming API. No veo otra forma.

+0

Grande, gracias por la punta de. Eso debería funcionar para lo que necesito. –

+2

Hay una consola de script en 'http: // [jenkins_server]/script', que es extremadamente útil para experimentar y depurar scripts de Groovy. –

+0

Así que investigué hoy, usando el consejo de Scot, pero parece que es posible hacer exactamente lo contrario de lo que necesito. Si utilizo Groovy Script y Jenkins API como primera tarea, usándolo para determinar la información que necesito, ese script no se ejecutará hasta que Jenkins ejecute el trabajo y lo ejecute, lo que lo hace útil si quieres matarlo. todos los trabajos detrás de usted (en la cola en ese momento) pero no es posible iniciarlo de alguna manera mientras está en la cola, para matar a los más viejos en lugar de a los más nuevos. Continuando con la investigación, se actualizará si descubro algo. –

0

No creo que este problema pueda resolverse perfectamente si solo se agrega una secuencia de comandos groovy antes de la compilación. Si el nuevo trabajo entra mientras el anterior ya ha estado compilando (no puede verificar la cola, ya que su parte previa a la construcción ha pasado), el nuevo todavía tiene que esperar.

Como veo, para lograr un trabajo preventivo de jenkins, necesitamos crear otro trabajo de supervisión. Este trabajo debería verificar si hay compilaciones nuevas en la cola regularmente y terminar la anterior si es necesario.

Pero crear un trabajo supervisado parece complejo. También espero una solución perfecta.

3

uso execute system groovy script paso:

import hudson.model.Result 
import jenkins.model.CauseOfInterruption 

//iterate through current project runs 
build.getProject()._getRuns().each{id,run-> 
    def exec = run.getExecutor() 
    //if the run is not a current build and it has executor (running) then stop it 
    if(run!=build && exec!=null){ 
    //prepare the cause of interruption 
    def cause = new CauseOfInterruption(){ 
     public String getShortDescription(){ 
     return "interrupted by build #${build.getId()}" 
     } 
    } 
    exec.interrupt(Result.ABORTED, cause) 
    } 
} 

//just for test do something long... 
Thread.sleep(10000) 

y en el trabajo interrumpido habrá un registro:

Build was aborted 
interrupted by build #12 
Finished: ABORTED 
Cuestiones relacionadas