web-dev-qa-db-de.com

Wie man einfache if-Anweisungen in einer deklarativen Pipeline in Jenkins ausführt

Ich versuche, meine Skriptpipeline in eine deklarative Pipeline zu konvertieren. Ich frage mich, wie eine einfache if-Anweisung in einem steps {}-Block ausgeführt werden kann.

    stage ('Deploy to Docker') {
        steps {
            parallel (
                "instance1" : {
                    environment {
                        containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                    }
                    steps {
                        if (containerId.isEmpty()) {
                            docker.image('some/image').run("--name ${fullDockerImageName}")
                        }
                    }
                }
            )
        }
   }

Dies verursacht die folgende Ausnahme:

WorkflowScript: 201: Expected a step @ line 201, column 29.
                           if (containerId.isEmpty()) {

Da ich keine einfache if(..) innerhalb eines steps {}-Blocks ausführen darf, haben Sie eine Idee, wie das geht?

Es scheint nicht sinnvoll zu sein, dies mit einem when {} zu einer vollständigen Phase zu machen, da es in einer einfachen Phase weitere Schritte gibt (Starten eines angehaltenen Containers, falls vorhanden usw.).

Was ist der beste Weg, um ein einfaches if durchzuführen?

13
Jasper Roel

Leider müssen Sie es vorerst in eine script packen. Wie es sagt hier ;

Deklarative Pipelines verwendet möglicherweise alle verfügbaren Schritte, die in der Referenzliste Pipeline-Schritte dokumentiert sind. Diese enthält eine umfassende Liste von Schritten mit den unten aufgeführten Schritten, die nur in der deklarativen Pipeline unterstützt werden.

Und wenn Sie sich die Schrittreferenz ansehen, werden einfach alle Plugins aufgelistet, die Pipeline-Schritte beitragen. Und soweit ich sehen kann, gibt es keinen Schritt, wenn dann sonst. Die Antwort ist also, nein, momentan ist dies nicht möglich, aber es sollte ziemlich einfach sein, dies als Schritt zu implementieren und zu einem Plugin hinzuzufügen.

11
Jon S

Das sollte funktionieren

pipeline {
     stages {
        stage ('Main Stage') {
            steps {
                script {
                    if (true) {
                        stage ('Stage 1') {
                            sh 'echo Stage 1'
                        }
                    }
                    if (false) {
                        stage ('Stage 2') {
                            sh 'echo Stage 2'
                        }
                    }
                }
            }
        }
    }
}
6
Reuben Abela

Mit dem Conditional BuildStep plugin können Sie einen when {}-Schritt hinzufügen, um eine Bedingung zu bearbeiten.

Folgendes sollte funktionieren und Syntaxprobleme mit der isEmpty () - Prüfung in diesem Kontext verhindern.

stage ('Deploy to Docker') {
    steps {
        parallel (
            "instance1" : {
                environment {
                    containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                }
                when {
                    expression {
                        return containerId.isEmpty()
                    }
                }
                step {
                    docker.image('some/image').run("--name ${fullDockerImageName}")
                }
            }
        )
    }
}

Der zugehörige Blogpost ist hier.

EDIT: Tut mir leid, der tatsächliche Snytax scheint näher dran zu sein, der keinen Zugriff auf die benötigten Bedingungen hat:

stage ('Deploy to Docker') {
    when {
        expression {
            return containerId.isEmpty()
        }
    }
    steps {
        parallel (
            "instance1" : {
                environment {
                    containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                }
                step {
                    docker.image('some/image').run("--name ${fullDockerImageName}")
                }
            }
        )
    }
}
1
IronSean

Ich denke, dass dies der beste Weg zur Verwendung von if/else oder Steuerlogik in Ihrer deklarativen Jenkins-Pipeline ist.

https://jenkins.io/doc/book/pipeline/syntax/#when

Antwort von @IronSean, scheint nicht, dass Sie dieses Plugin (mehr) benötigen.

0
Ruwd