web-dev-qa-db-fra.com

Jenkins: impossible de définir une variable en phase de pipeline

J'essaie de créer un script de pipeline Jenkins déclaratif, mais j'ai des problèmes avec la déclaration de variable simple.

Voici mon script:

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

Cependant, j'obtiens cette erreur:

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

Je suis sur Jenkins 2.7.4 et Pipeline 2.4.

73
Crummy

Le modèle déclaratif pour les pipelines Jenkins a un sous-ensemble restreint de syntaxe qu'il autorise dans les blocs stagevoir le guide de la syntaxe pour plus d'informations . Vous pouvez contourner cette restriction en encapsulant vos étapes dans un bloc script { ... }, mais vous perdrez ainsi la validation de la syntaxe, des paramètres, etc., dans le bloc script.

80
abayer

Je pense que l'erreur ne vient pas de la ligne spécifiée mais des 3 premières lignes. Essayez ceci à la place:

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

Je pense que vous avez eu quelques lignes supplémentaires qui ne sont pas valides ...

EDIT

D'après déclaractive documentation du modèle de pipeline , il semble que vous deviez utiliser un bloc de déclaration environment pour déclarer vos variables, par exemple:

pipeline {
   environment {
     FOO = "foo"
   }

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

D'accord avec @ Pom12, @abayer. Pour compléter la réponse, vous devez ajouter un bloc de script.

Essayez quelque chose comme ça:

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

Dans Jenkins 2.138.3, il existe deux types de pipelines différents.

Pipelines déclaratifs et scriptés.

"Les pipelines déclaratifs sont une nouvelle extension du pipeline DSL (c’est un script de pipeline avec une seule étape, une étape de pipeline avec des arguments (appelés directives), ces directives doivent suivre une syntaxe spécifique. Ce nouveau format a pour but de est plus stricte et devrait donc être plus facile pour les débutants en pipelines, permettre l'édition graphique, etc.

pipeline Jenkins: agent vs noeud?

Voici un exemple d'utilisation de variables d'environnement et globales dans un pipeline déclaratif. D'après ce que je peux dire, l'environnement est statique après son paramétrage.

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