Updating environment global variable in Jenkins pipeline from the stage level - is it possible?

Mar*_*ohn 16 groovy jenkins jenkins-pipeline

I have a Jenkinsfile with some global variables and some stages. can I update the global variable out from a stage?

An example:

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
       }
     }  
   }
}
Run Code Online (Sandbox Code Playgroud)

是否ACC可以使用foo中的值更新变量,以便我可以ACC在下一阶段使用变量?

Szy*_*iak 27

您不能覆盖environment {}块中定义的环境变量。但是,您可能要使用一个技巧。您可以通过ACC两种方式引用环境变量:

  • 明确地由 env.ACC
  • 隐含地 ACC

env.ACC一旦在environment {}块中设置了值,就无法更改它的值,但ACC其行为如下:ACC未设置变量时,env.ACC将访问值(如果存在)。但是,ACC在任何阶段初始化变量时,在任何阶段都ACC引用此新设置的值。考虑以下示例:

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'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您在上面的示例中看到的那样,该规则的唯一例外是环境变量是否在envrionment {}块外部初始化。例如,env.BAR在此示例中,在中初始化了Stage 1,但是env.BAR可以在中更改的值Stage 2Stage 3看到更改后的值。

  • 哇,我从来没有在 Jenkins 文档中的任何地方看到“一旦在环境 {} 块内设置就无法更改”...我一直在试图找出为什么设置 `env.FOO` 在我的脚本中根本不起作用大约现在已经 6 个小时了... :facepalm: Jenkins 真是一场噩梦。 (8认同)
  • 很好的答案。我已经纠结了半天了,这个答案正是我所需要的! (2认同)
  • 感谢您对一段工作代码的精彩解释。我已经在谷歌上搜索了几个小时了。 (2认同)
  • 谢谢你,汤米!您可以在我不久前写的关于这个特定问题的博客文章中找到更多示例 - https://e.printstacktrace.blog/jenkins-pipeline-environment-variables-the-definitive-guide/ (2认同)