web-dev-qa-db-fra.com

Variable Jenkinsfile utilisée à deux étapes distinctes

J'ai un travail de pipeline qui utilise deux noeuds distincts (un pour la construction, un pour le test) et j'aimerais partager une variable entre deux de ces blocs de code dans ma Jenkinsfile. Je suppose que c'est possible, mais je suis très novice en matière de groovy et du concept Jenkinsfile. Voici le code pertinent jusqu'à présent:

node('build') {
    stage('Checkout') {
        checkout scm
    }
    stage('Build') {
        bat(script: 'build')
        def rev = readFile('result')
    }
}

node('test') {
    stage('Test') {
            def SDK_VERSION = "5.0.0001.${rev}"
            bat "test.cmd ${env.BUILD_URL} ${SDK_VERSION}"
            archiveArtifacts artifacts: 'artifacts/**/*.xml'
            junit 'artifacts/**/*.xml'
       }
}

Je souhaite affecter la variable "rev" à l'étape de construction, mais la concaténer à la variable SDK_VERSION à l'étape de test. Mon erreur est: 

groovy.lang.MissingPropertyException: No such property: rev for class: groovy.lang.Binding
10
user3270760

Définissez simplement la variable avant votre bloc node:

def rev = ''
node('build') {
  stage('Checkout') {
    checkout scm
  }
  stage('Build') {
    bat(script: 'build')
    rev = readFile('result')
  }
}
11
mkobit

Dans un pipeline déclaratif, la réponse de @ mkobit ne fonctionnera pas. Vous pouvez cependant basculer explicitement en mode script et utiliser sa portée, par exemple. ainsi:

...
steps {
   script {
       def foo = sh script: "computeFoo", returnStdout: true

       node('name') {
           script {
               someStep()
           }
       }
    }
}
...
0
Raphael