2012-04-23 6 views

Antwort

1

Sie können es mit einem System Groovy Script über Groovy Script Plugin ausführen. Ein solches Skript hat direkten Zugriff auf Jenkins über seine programming API. Ich sehe keinen anderen Weg.

+0

Große, Danke für Deinen Tipp. Das sollte für das funktionieren, was ich brauche. –

+2

Es gibt eine Skriptkonsole unter http: // [jenkins_server]/script, die sehr nützlich ist, um mit Groovy-Skripten zu experimentieren und sie zu debuggen. –

+0

Also habe ich heute Nachforschungen angestellt, mit Ratschlägen von Scot, aber es sieht so aus, als ob es genau das Gegenteil von dem ist, was ich brauche. Wenn ich groovy script und Jenkins API als erste Aufgabe benutze, um das zu bestimmen, was ich brauche, wird dieses Skript nicht ausgeführt, bis der Job nicht aus der Warteschlange genommen und von Jenkins ausgeführt wird, was es nützlich macht, wenn man killt alle Jobs hinter dir (in der Warteschlange in diesem Moment), aber es ist nicht möglich, es irgendwie zu starten, während es in der Warteschlange ist, um die ältesten statt der neuesten zu töten. Fortsetzung der Untersuchung, wird aktualisiert, wenn ich etwas herausfinden. –

0

Ich glaube nicht, dass dieses Problem perfekt gelöst werden kann, indem nur ein grooviges Skript vor dem Build hinzugefügt wird. Wenn der neue Job eingeht, während der ältere bereits erstellt wurde (er kann die Warteschlange nicht überprüfen, da sein Pre-Build-Teil bereits übergeben wurde), muss der neue noch warten.

Wie ich sehe, um einen präventiven Job von jenkins zu erreichen, müssen wir einen anderen beaufsichtigen Job schaffen. Dieser Job sollte überprüfen, ob regelmäßig neue Builds in der Warteschlange vorhanden sind, und bei Bedarf die älteren Builds beenden.

Aber erstellen Sie einen Übersee-Job scheint komplex. Ich erwarte auch eine perfekte Lösung.

3

Verwendung execute system groovy script Schritt:

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) 

und im unterbrochenen Job wird es ein Protokoll sein:

Build was aborted 
interrupted by build #12 
Finished: ABORTED