Bedingter Schritt / Stufe in der Jenkins-Pipeline

89

Wie führen Sie einen Build-Schritt / eine Build-Phase nur aus, wenn Sie einen bestimmten Zweig erstellen?

Führen Sie beispielsweise einen Bereitstellungsschritt nur aus, wenn der Zweig aufgerufen wird deployment, und lassen Sie alles andere gleich.

Devonte
quelle

Antworten:

179

Im Folgenden finden Sie einige Beispiele für die deklarative Pipeline-Syntax:

stage('master-branch-stuff'){
  agent any
  when{
    branch 'master'
  }
  steps {
    echo 'run this stage - ony if the branch = master branch'
  }
}

<b

stage('feature-branch-stuff') {
    agent label:'test-node'
    when { branch "feature/*" }
    steps {
        echo 'run this stage - only if the branch name started with feature/'
    }
}

<b

stage('expression-branch') {
    agent label:'some-node'
    when {
    expression {
        return env.BRANCH_NAME != 'master';
        }
    }
    steps {
        echo 'run this stage - when branch is not equal to master'
    }
}

<b

stage('env-specific-stuff') {
    agent label:'test-node'
    when { 
      environment name: 'NAME', value: 'this' 
    }
    steps {
        echo 'run this stage - only if the env name and value matches'
    }
}

Effektivere Möglichkeiten - https://issues.jenkins-ci.org/browse/JENKINS-41187 Siehe
auch - https://jenkins.io/doc/book/pipeline/syntax/#when


Die Anweisung beforeAgent truekann festgelegt werden, um zu vermeiden, dass ein Agent zum Ausführen der Bedingung hochgefahren wird, wenn für die Bedingung kein Git-Status erforderlich ist, um zu entscheiden, ob Folgendes ausgeführt werden soll:

when { beforeAgent true; expression { return isStageConfigured(config) } }

Beitrag und Dokumente freigeben


UPDATE
New WHEN-Klausel
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative

gleich - Vergleicht zwei Werte - Zeichenfolgen, Variablen, Zahlen, Boolesche Werte - und gibt true zurück, wenn sie gleich sind. Ich bin mir ehrlich gesagt nicht sicher, wie wir es verpasst haben, dies früher hinzuzufügen! Sie können auch "nicht gleich" -Vergleiche mit der Kombination "nicht {gleich ...}" durchführen.

changeRequest - In seiner einfachsten Form gibt dies true zurück, wenn diese Pipeline eine Änderungsanforderung erstellt, z. B. eine GitHub-Pull-Anforderung. Sie können auch detailliertere Überprüfungen der Änderungsanforderung durchführen, um zu fragen, ob dies eine Änderungsanforderung für die Hauptniederlassung ist. und vieles mehr.

buildingTag - Eine einfache Bedingung, die nur prüft, ob die Pipeline für ein Tag in SCM ausgeführt wird und nicht für einen Zweig oder eine bestimmte Festschreibungsreferenz.

tag - Ein detaillierteres Äquivalent zu buildingTag, mit dem Sie den Tag-Namen selbst überprüfen können.

Chandan Nayak
quelle
1
Kann ich dies für die Post-Build-Aktionen verwenden?
Doug
1
Ich finde, Jenkins dreht den angegebenen Agenten hoch, auch wenn die when{}Bedingung als falsch ausgewertet wird. :(
Trejkaz
1
@ Trejkaz können Sie jetzt verwenden beforeAgent true, um das zu vermeiden
Nick Jones
1
@NickJones beforeAgentist jetzt in der Tat eine Problemumgehung dafür.
Trejkaz
45

Verwenden Sie einfach ifund env.BRANCH_NAME, Beispiel:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       
Krzysztof Krasoń
quelle
4
ob sollte vor oder nach der Bühne sein?
Jet
5
Vor der Bühne können Bühnen drinnen sein, wenn Zweige
Krzysztof Krasoń
Ich glaube nicht, dass die Platzierung wirklich wichtig ist
omu_negru
9
Ich kann diese Arbeit nicht mit einer deklarativen Pipeline bekommen. Funktioniert dies mit deklarativen Pipelines? WorkflowScript: 9: Erwartet eine Stufe @ Zeile 9, Spalte 9. if (env.BRANCH_NAME == "Deployment") {WorkflowScript: 8: Keine Stufen angegeben in Zeile 8, Spalte 5. Stufen {
Pitchblack408

4
Dies funktioniert nur in Skript-Pipelines. Für deklarative Pipelines sollten Sie im Schritt das Skript {} verwenden.
Pedro Henrique
1

Nach anderen Antworten füge ich das Szenario der parallelen Stufen hinzu:

pipeline {
    agent any
    stages {
        stage('some parallel stage') {
            parallel {
                stage('parallel stage 1') {
                    when {
                      expression { ENV == "something" }
                    }
                    steps {
                        echo 'something'
                    }
                }
                stage('parallel stage 2') {
                    steps {
                        echo 'something'
                    }
                }
            }
        }
    }
}
Yakir GIladi Edry
quelle