Ich habe eine deklarative Jenkins-Pipeline mit stage1
, stage2
, stage3
und so weiter. Ich möchte stage2
von der Ausführung abhalten, wenn stage1
den Build instabil/fail setzt.
Ich weiß, ich kann die Ausführung von stage1
mit return
stoppen, wenn der Build nicht erfolgreich ist, aber keinen Weg finden konnte, auf dem ich einfach die Pipeline beenden kann, ohne die folgenden Schritte auszuführen. stage1
Folgendes habe ich:
stage('stage1') {
steps {
script{
//somesteps
if ("${stdout}" == "1"){
currentBuild.result = 'UNSTABLE'
return
} //if
//somesteps
} //script
} //steps
} //stage
// run only when stage1 is success
stage('stage2'){
when {
expression {
params.name ==~ /x|y/
}
}
steps {
script{
//stage2 steps
}
}
}
Wenn params.name ==~ /z/
Stufe 3 ausgeführt wird, wird Sprungstufe2 ausgeführt
Hinweis: Ich kann die Schritte in stage2/3/.. nicht in stage1 aufnehmen. Es sollte so sein. Basierend auf den Build-Parametern wird stage2/3/4 ... nach stage1 aufgerufen
Der einfachste Weg, die verbleibenden Pipeline-Stufen zu überspringen, besteht darin, eine Variable einzurichten, die steuert, ob die folgenden Stufen übersprungen werden sollen oder nicht. Etwas wie das:
def skipRemainingStages = false
pipeline {
agent any
stages {
stage("Stage 1") {
steps {
script {
skipRemainingStages = true
println "skipRemainingStages = ${skipRemainingStages}"
}
}
}
stage("Stage 2") {
when {
expression {
!skipRemainingStages
}
}
steps {
script {
println "This text wont show up...."
}
}
}
stage("Stage 3") {
when {
expression {
!skipRemainingStages
}
}
steps {
script {
println "This text wont show up...."
}
}
}
}
}
Dies ist ein sehr einfaches Beispiel, bei dem skipRemainingStages
bei Stage 1
auf wahr gesetzt wird und Stage 2
und Stage 3
get übersprungen werden, da der Ausdruck im when
-Block nicht als wahr ausgewertet wird.
Alternativ können Sie error(String message)
step aufrufen, um die Pipeline anzuhalten und ihren Status auf FAILED
zu setzen. Zum Beispiel, wenn Ihre Stufe 1 den Schritt error(msg)
wie folgt aufruft:
stage("Stage 1") {
steps {
script {
error "This pipeline stops here!"
}
}
}
In diesem Fall wird die Pipeline angehalten, wenn error(msg)
step gefunden wird und alle verbleibenden Stufen ignoriert werden (when
-Blöcke werden nicht einmal geprüft).
Natürlich können Sie error(msg)
abhängig von einer bestimmten Bedingung aufrufen, um FAILED
nur dann festzulegen, wenn bestimmte Bedingungen erfüllt sind.
Sie können auch einfach eine Ausnahme auslösen. Dadurch wird der Build abgebrochen. Das einfache Festlegen des Buildstatus in einer catch-Klausel funktioniert ziemlich gut .. Sie können auch eine benutzerdefinierte Logik in den finally-Block zum Senden von Benachrichtigungen für Buildstatusänderungen (E-Mail, Slack-Nachricht) einfügen usw)
Also vielleicht so etwas wie das Folgende. HINWEIS: Ich habe einige davon aus einer vorhandenen Jenkins-Datei kopiert. Also nicht 100% sicher, dass dies die gleiche Syntax ist, die Sie verwendet haben:
pipeline {
try {
stages {
stage("stage1") {
if (something) {
throw new RuntimeException("Something went wrong")
}
}
stage("stage2") {
}
}
} catch (e) {
currentBuild.result = "FAILED"
throw e
}
}
Sie können post in einer Phase wie folgt verwenden:
pipeline {
stages {
stage('stage 1') {
steps {
//step 1
}
}
stage('stage 2') {
steps {
script{
//step 2
}
}
post{
success {
}
failure {
script{
sh "exit 1"
//or
error "Failed, exiting now..."
}
}
aborted {
}
unstable {
script{
sh "exit 1"
//or
error "Unstable, exiting now..."
}
}
}
}
}
}
Dadurch wird der Build abgebrochen und der Job wird nicht weiter ausgeführt.