web-dev-qa-db-ger.com

Jenkinsfile - Ausführung der bedingten Stufe in der Script-Pipeline-Syntax

Wir verwenden die Script Pipeline-Syntax für unsere Jenkinsfile-Datei, die eine Menge Schritte definiert, um unseren Code zu erstellen und bereitzustellen. Wir haben einen Anwendungsfall, in dem ich alle meine Phasen ausführen möchte, wenn ich ein Full Build mache, aber nur eine bestimmte Phase, wenn ich AWS-Routing durchführen muss. Ich weiß, dass ich die if(<expression>) verwenden kann, um eine Bühne zu überspringen oder eine Bühne auszuführen. Das Problem ist, dass ich diese if-Bedingung nicht auf jede Stufe in meinem Jenkinsfile anwenden möchte. 

In der neuen Syntax Declarative Pipeline ist dies mit der Option stage..when leicht möglich. Wir haben viele benutzerdefinierte Groovy-Helper-Funktionen in unserer Infrastruktur, so dass es an dieser Stelle nicht möglich ist, von der Syntax Script Pipeline auf die neue Syntax Declarative Pipeline zu wechseln. Was ich am Ende mit meinem bestehenden Jenkinsfile gemacht habe, ist ungefähr so ​​..

Original Jenkinsfile

  stage('Checkout Code') {}
  stage('Build') {}
  parallel(
    stage('Sonar Analysis') {}
    stage('CLM Analysis') {}
    stage('Security Analysis') {}
  )
  stage('Build Docker Image') {}
  ...
  ...
  stage('QA Deploy') {}
  stage('QA Routing') {}
  ...
  ...
  stage('Prod Deploy') {}
  stage('Prod Routing') {}

Gewechselt zu

  if (fullDeploy){
    stage('Full Build') {
        stage('Checkout Code') {}
        stage('Build') {}
        parallel(
          stage('Sonar Analysis') {}
          stage('CLM Analysis') {}
          stage('Security Analysis') {}
        )
        stage('Build Docker Image') {}
        ...
        ...
        stage('QA Deploy') {}
        stage('QA Routing') {}
        ...
        ...
        stage('Prod Deploy') {}
        stage('Prod Routing') {}          
    }
  }

  if (routeOnly){
    stage('Prod Routing') {}    
  } 

Das fühlt sich für mich ein bisschen hackig an und ich konnte in den Jenkins-Dokumenten nichts finden, was eine gute Möglichkeit bietet.

Hat jemand einen besseren Weg, wie ich das einbauen kann?

4
Ali Bhagat

Ich benutze keine Skript-Pipelines, aber ich bin mir ziemlich sicher, dass Sie dies tun würden (die bedingten Stufen in eine if einschließen).

Wenn Sie möchten, dass es mehr wie deklarativ wirkt, können Sie stattdessen if-Anweisungen in jede Stufe einfügen. Auf diese Weise würden die Stufen immer noch visualisiert. Dies ist möglicherweise nicht wünschenswert, wenn sie tatsächlich nichts unternommen haben.

Ich denke, das Wechseln zu deklarativ ist der einzige Weg, um die übersprungenen Stufen in der blauen Ozean-Benutzeroberfläche anders anzuzeigen (sie sehen anders aus, wenn sie aufgrund einer when-Klausel übersprungen werden), aber Sie haben tatsächlich den kleinsten Code Ihrer aktuellen Lösung. Es scheint mir nicht hackig zu sein, aber so etwas kann subjektiv sein. :)

2
burnettk

Ich mochte auch nicht die Idee eines redundanten if {} Blocks innerhalb meiner stage {} . Ich löste dies, indem ich die Stage wie folgt überschrieb 

def stage(name, execute, block) {
    return stage(name, execute ? block : {echo "skipped stage $name"})
}

jetzt können Sie eine Stufe wie folgt deaktivieren

stage('Full Build', false) { 
    ...
}

Update Sie können die Stufe auch überspringen, indem Sie unter def verwenden

import org.jenkinsci.plugins.pipeline.modeldefinition.Utils

def stage(name, execute, block) {
    return stage(name, execute ? block : {
        echo "skipped stage $name"
        Utils.markStageSkippedForConditional(STAGE_NAME)
    })
}
17
culmat

In den Kommentaren zu JENKINS-47286 klingt es nicht so, als würde eine when-Unterstützung zu Scripted Pipeline hinzugefügt. Als mögliche Problemumgehung gibt es eine gemeinsam genutzte Bibliothek, die die when-Anweisung für Skript-Pipelines implementiert: https://github.com/comquent/imperative-when

2
Nick Jones