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.

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.


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 ...
    }                                                                       

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'
                    }
                }
            }
        }
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.