[英]How to update a Jenkins Properties Global Environment Variable from within a pipeline stage in Jenkinsfile
[英]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.BAR
在Stage 1
中初始化,但env.BAR
的值可以在Stage 2
更改,而Stage 3
值已更改。
有一種方法可以覆蓋在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.