从阶段级别更新Jenkins管道中的环境全局变量-可能吗?

时间:2018-11-29 14:41:18

标签: jenkins groovy jenkins-pipeline

我有一个Jenkinsfile,其中包含一些全局变量和某些阶段。 我可以从一个阶段更新全局变量吗?

一个例子:

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
       }
     }  
   }
}

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

1 个答案:

答案 0 :(得分:7)

您不能覆盖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'
            }
        }
    }
}

如上例所示,该规则的唯一例外是环境变量是否在envrionment {}块之外初始化。例如,本示例中的env.BARStage 1中进行了初始化,但是env.BAR的值可以在Stage 2中进行更改,并且Stage 3会看到更改后的值。