2016-12-01 9 views
7

In unserem Job Jenkins Pipeline haben wir ein paar Stufen, und was ich möchte ist, wenn einer der Stufen scheitern, dann den Build stoppen und nicht weiter zu den weiteren Phasen.Halt einen jenkins pipeline job früh

Hier ist ein Beispiel für eine der Stufen:

stage('Building') { 
    def result = sh returnStatus: true, script: './build.sh' 
    if (result != 0) { 
     echo '[FAILURE] Failed to build' 
     currentBuild.result = 'FAILURE' 
    } 
} 

Das Skript wird fehlschlagen, und das Build-Ergebnis wird aktualisiert, aber der Job weiter auf die nächsten Etappen. Wie kann ich den Job abbrechen oder anhalten, wenn dies geschieht?

Antwort

7

Grundsätzlich ist das der Schritt sh. Wenn Sie das Ergebnis in einer Variablen nicht erfassen, können Sie einfach laufen:

sh "./build" 

Dies verlassen wird, wenn das Skript einen Nicht-Null-Exit-Code reurns.

Wenn Sie Sachen müssen zuerst tun, und müssen das Ergebnis erfassen, können Sie einen Shell-Schritt verwenden, um den Job

stage('Building') { 
    def result = sh returnStatus: true, script: './build.sh' 
    if (result != 0) { 
     echo '[FAILURE] Failed to build' 
     currentBuild.result = 'FAILURE' 
     // do more stuff here 

     // this will terminate the job if result is non-zero 
     // You don't even have to set the result to FAILURE by hand 
     sh "exit ${result}" 
    } 
} 

aber die folgenden beenden werden Ihnen das gleiche geben, scheinen aber mehr gesund zu tun

stage('Building') { 
    try { 
     sh './build.sh' 
    } finally { 
     echo '[FAILURE] Failed to build' 
    } 
} 

Es ist auch möglich, Rückkehr in Ihrem Code aufzurufen. Wenn Sie jedoch innerhalb eines stage sind, wird es nur von dieser Stufe zurückkehren. So

stage('Building') { 
    def result = sh returnStatus: true, script: './build.sh' 
    if (result != 0) { 
     echo '[FAILURE] Failed to build' 
     currentBuild.result = 'FAILURE' 
     return 
    } 
    echo "This will not be displayed" 
} 
echo "The build will continue executing from here" 

wird nicht den Job beenden, aber

stage('Building') { 
    def result = sh returnStatus: true, script: './build.sh' 
} 
if (result != 0) { 
    echo '[FAILURE] Failed to build' 
    currentBuild.result = 'FAILURE' 
    return 
} 

Willen.

3

Eine andere Möglichkeit, dieses Verhalten zu erzielen, ist das Auslösen einer Ausnahme. Genau das macht Jenkins selbst. Auf diese Weise können Sie den Build-Status auch auf ABORTED oder FAILURE setzen. Dieses Beispiel bricht die Build:

stage('Building') { 
    currentBuild.rawBuild.result = Result.ABORTED 
    throw new hudson.AbortException('Guess what!') 
    echo 'Further code will not be executed' 
} 

Ausgang:

[Pipeline] stage 
[Pipeline] { (Building) 
[Pipeline] } 
[Pipeline] // stage 
[Pipeline] End of Pipeline 
ERROR: Guess what! 
Finished: ABORTED 
+0

Mit Jenkins 2.89.3 dies ist ein Fehler: 'org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Skripte nicht verwenden, um neue zulässig hudson.AbortException java.lang.String' –

+0

Sieht so aus, als wäre der Sandbox-Modus aktiviert und verbietet das Auswerfen dieser Ausnahme. Etwas seltsam, aber deaktivieren Sandbox-Modus sollte den Trick tun. – Jazzschmidt

+0

Alternativ können Sie die Verwendung über Jenkins verwalten> In-Prozess-Skriptgenehmigung zulassen – Jazzschmidt

Verwandte Themen