web-dev-qa-db-fra.com

Mise à jour de la variable globale d'environnement dans le pipeline Jenkins à partir du niveau d'étape - est-ce possible?

J'ai un Jenkinsfile avec des variables globales et des étapes. puis-je mettre à jour la variable globale à partir d'une étape?

Un exemple:

pipeline {
  agent any

  environment {                 
    PASSWD = "${sh(returnStdout: true, script: 'python -u do_some_something.py')}"
    ACC = "HI"
  }

  stage('stage1') {
      when { expression { params.UPDATE_JOB == false } }

      steps{
        script {
          def foo= sh(  returnStdout: true, script: 'python -u do_something.py ')
          env.ACC =  foo
          println foo
          print("pw")
          println env.PASSWD
       }
     }  
   }
}

Est-il possible de mettre à jour la variable ACC avec la valeur de foo afin que je puisse utiliser la variable ACC à l'étape suivante?

12
Marvin Kallohn

Vous ne pouvez pas remplacer la variable d’environnement définie dans environment {} bloc. Cependant, il y a une astuce que vous pouvez utiliser. Vous pouvez faire référence à la variable d’environnement ACC de deux manières:

  • explicitement par env.ACC
  • implicitement par ACC

La valeur de env.ACC _ ne peut pas être modifié une fois défini dans environment {} block, mais ACC se comporte de la manière suivante: lorsque la variable ACC n’est pas définie, la valeur de env.ACC est accessible (s'il existe bien sûr). Mais lorsque ACC variable est initialisée à un stade quelconque, ACC fait référence à cette valeur nouvellement définie à un stade quelconque. Considérons l'exemple suivant:

pipeline {
    agent any

    environment {
        FOO = "initial FOO env value"
    }

    stages {
        stage("Stage 1") {
            steps {
                script {
                    echo "FOO is '${FOO}'" // prints: FOO is 'initial FOO env value'

                    env.BAR = "bar"
                }
            }
        }

        stage("Stage 2") {
            steps {
                echo "env.BAR is '${BAR}'" // prints: env.BAR is 'bar'
                echo "FOO is '${FOO}'" // prints: FOO is 'initial FOO env value'
                echo "env.FOO is '${env.FOO}'" // prints: env.FOO is 'initial FOO env value'
                script {
                    FOO = "test2"
                    env.BAR = "bar2"
                }
            }
        }

        stage("Stage 3") {
            steps {
                echo "FOO is '${FOO}'" // prints: FOO is 'test2'
                echo "env.FOO is '${env.FOO}'" // prints: env.FOO is 'initial FOO env value'
                echo "env.BAR is '${BAR}'" // prints: env.BAR is 'bar2'

                script {
                    FOO = "test3"
                }

                echo "FOO is '${FOO}'" // prints: FOO is 'test3'
            }
        }
    }
}

Et comme vous pouvez le voir dans l'exemple ci-dessus, la seule exception à la règle est si la variable d'environnement est initialisée en dehors de envrionment {} bloc. Par exemple, env.BAR dans cet exemple a été initialisé dans Stage 1, mais la valeur de env.BAR pourrait être changé dans Stage 2 et Stage 3 voit la valeur modifiée.

18
Szymon Stepniak