簡體   English   中英

從階段級別更新 Jenkins 管道中的環境全局變量 - 有可能嗎?

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

我有一個帶有一些全局變量和一些階段的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變量?

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

正如您在上面的示例中看到的,規則的唯一例外是環境變量在environment {}塊之外初始化。 例如,本示例中的env.BARStage 1中初始化,但env.BAR的值可以在Stage 2更改,而Stage 3值已更改。

更新 2019-12-18

有一種方法可以覆蓋在environment {}塊中定義的環境變量 - 您可以使用withEnv()塊來覆蓋現有的 env 變量。 它不會改變定義的環境的值,但會在withEnv()塊內覆蓋它。 看看下面的例子:

pipeline {
  agent any 

  stages {
    stage("Test") {
      environment {
        FOO = "bar"
      }

      steps {
        script {
          withEnv(["FOO=newbar"]) {
            echo "FOO = ${env.FOO}" // prints: FOO = newbar
          }
        }
      }
    }
  }
}

我還鼓勵您查看我的“Jenkins 管道環境變量解釋”視頻。

loggedInUser = ""
node ("cm-windows") {
withEnv(["UserLoggedIn='Vrishali'"]) {
  echo env.UserLoggedIn       
   stage('Setup'){
    def buildCause = currentBuild.getBuildCauses()[0]
    def buildPrincipal = [type:"unknown", name:""]
    def buildUserCause = 
    currentBuild.getRawBuild().getCause(hudson.model.Cause.UserIdCause)
    buildPrincipal = [type:"user", name:buildCause.userId]
    print "Prining.."
    print buildCause.userId
    print "Checking the env var"
    print env.UserLoggedIn
    echo "[*] Starting build (id: ${env.UserLoggedIn}) on ${env.UserLoggedIn}"  
    loggedInUser = buildCause.userId
    echo "Loggedin user"
    print loggedInUser
    echo loggedInUser
   } 
}
stage ('override env'){         
   withEnv(["UserLoggedIn=${loggedInUser}"]) {
       echo "inside 2 stgae"
        echo loggedInUser
        print loggedInUser 
        echo "env"
        echo env.UserLoggedIn
   }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM