如何在声明式Jenkinsfile中重新赋值environment块定义的环境变量?
问题根因
声明式Jenkinsfile中environment块定义的全局环境变量默认是不可变的,在script块中直接修改env.PROXY_HOST的操作仅作用于script块的临时上下文,无法覆盖全局环境变量的初始值,因此后续步骤读取到的仍然是初始定义的Nothing。
解决方案
推荐使用withEnv步骤动态注入环境变量,该方法兼容性最强、作用域可控,修改后的代码如下:
environment { // 其他原有变量保留 PROXY_HOST = "Nothing" // 其他原有变量保留 } stage('deploy') { steps { script { // 先计算出目标代理地址 def targetProxy if (env.GIT_BRANCH == 'master') { targetProxy = env.PROXY_HOST_PRODUCTIVE } else if(env.GIT_BRANCH == 'develop') { targetProxy = env.PROXY_HOST_ACCEPTANCE } else { targetProxy = env.PROXY_HOST_DEV } // 使用withEnv注入变量,作用域为包裹的所有内部步骤 withEnv(["PROXY_HOST=${targetProxy}"]) { echo env.PROXY_HOST // 会打印分支对应的正确代理地址 sh 'curl "$PROXY_HOST"' // sh步骤可以正常读取到更新后的值 } } } }
如果需要该变量在多个Stage中生效,可以在pipeline最顶部定义全局Groovy变量复用:
// 定义pipeline全局可变变量,不需要放在environment块中 def PROXY_HOST = "Nothing" pipeline { agent any stages { stage('set proxy') { steps { script { if (env.GIT_BRANCH == 'master') { PROXY_HOST = env.PROXY_HOST_PRODUCTIVE } else if(env.GIT_BRANCH == 'develop') { PROXY_HOST = env.PROXY_HOST_ACCEPTANCE } else { PROXY_HOST = env.PROXY_HOST_DEV } } } } stage('deploy') { steps { // 后续stage可以直接引用该变量,需要传给sh步骤时可以用withEnv注入 withEnv(["PROXY_HOST=${PROXY_HOST}"]) { sh 'curl "$PROXY_HOST"' } } } } }
内容的提问来源于stack exchange,提问作者Toni26
相关产品推荐
相关产品推荐

