wake-up-neo.com

Jenkins: In der Pipeline-Phase kann keine Variable definiert werden

Ich versuche, ein deklaratives Jenkins-Pipeline-Skript zu erstellen, habe jedoch Probleme mit der einfachen Variablendeklaration.

Hier ist mein Drehbuch:

pipeline {
   agent none
   stages {
       stage("first") {
           def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13."
           sh "echo ${foo}"
       }
   }
}

Ich erhalte jedoch diesen Fehler:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
           def foo = "foo"
           ^

Ich bin auf Jenkins 2.7.4 und Pipeline 2.4.

73
Crummy

Das deklarative Modell für Jenkins-Pipelines verfügt über eine eingeschränkte Teilmenge der Syntax, die in den stage -Blöcken zulässig ist. Weitere Informationen finden Sie im Syntaxhandbuch. . Sie können diese Einschränkung umgehen, indem Sie Ihre Schritte in ein script { ... } Block, aber infolgedessen verlieren Sie die Validierung von Syntax, Parametern usw. innerhalb des script Blocks.

80
abayer

Ich denke, Fehler kommt nicht aus der angegebenen Zeile, sondern aus den ersten 3 Zeilen. Versuchen Sie dies stattdessen:

node {
   stage("first") {
     def foo = "foo"
     sh "echo ${foo}"
   }
}

Ich denke, Sie hatten einige zusätzliche Zeilen, die nicht gültig sind ...

[~ # ~] edit [~ # ~]

Aus declaractive Pipeline-Modelldokumentation geht hervor, dass Sie einen environment -Deklarationsblock verwenden müssen, um Ihre Variablen zu deklarieren, z.

pipeline {
   environment {
     FOO = "foo"
   }

   agent none
   stages {
       stage("first") {
           sh "echo ${FOO}"
       }
   }
}
46
Pom12

Stimmen Sie mit @ Pom12, @abayer überein. Um die Antwort zu vervollständigen, müssen Sie einen Skriptblock hinzufügen

Versuchen Sie so etwas:

pipeline {
    agent any
    environment {
        ENV_NAME = "${env.BRANCH_NAME}"
    }

    // ----------------

    stages {
        stage('Build Container') {
            steps {
                echo 'Building Container..'

                script {
                    if (ENVIRONMENT_NAME == 'development') {
                        ENV_NAME = 'Development'
                    } else if (ENVIRONMENT_NAME == 'release') {
                        ENV_NAME = 'Production'
                    }
                }
                echo 'Building Branch: ' + env.BRANCH_NAME
                echo 'Build Number: ' + env.BUILD_NUMBER
                echo 'Building Environment: ' + ENV_NAME

                echo "Running your service with environemnt ${ENV_NAME} now"
            }
        }
    }
}
19
Si Zi

In Jenkins 2.138.3 gibt es zwei verschiedene Arten von Pipelines.

Deklarative und gescriptete Pipelines.

"Declarative Pipelines ist eine neue Erweiterung der Pipeline DSL (es ist im Grunde ein Pipelineskript mit nur einem Schritt, einem Pipelineschritt mit Argumenten (Direktiven genannt), diese Direktiven sollten einer bestimmten Syntax folgen. Der Sinn dieses neuen Formats ist, dass es ist strenger und sollte daher für Neueinsteiger in Pipelines einfacher sein, grafische Bearbeitung ermöglichen und vieles mehr. Skriptbasierte Pipelines sind der Fallback für erweiterte Anforderungen. "

Jenkins Pipeline: Agent vs Node?

Hier ist ein Beispiel für die Verwendung von Umgebungsvariablen und globalen Variablen in einer deklarativen Pipeline. Soweit ich weiß, ist die Umgebung nach dem Einstellen statisch.

def  browser = 'Unknown'

pipeline {
    agent any
    environment {
    //Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
    IMAGE = readMavenPom().getArtifactId()
    VERSION = readMavenPom().getVersion()


    }
    stages {
        stage('Example') {
            steps {
                script {
                    browser = sh(returnStdout: true, script: 'echo Chrome')
                }
            }
        }
        stage('SNAPSHOT') {
                when {
                    expression { 
                        return !env.JOB_NAME.equals("PROD") && !env.VERSION.contains("RELEASE")
                    }
                }
                steps {
                    echo "SNAPSHOT"
                    echo "${browser}"
                }
            }
            stage('RELEASE') {
                when {
                    expression { 
                        return !env.JOB_NAME.equals("TEST") && !env.VERSION.contains("RELEASE")
                    }
                }
                steps {
                    echo "RELEASE"
                    echo "${browser}"
                }
            }
    }//end of stages 
}//end of pipeline
4
pitchblack408