如何在Declarative Pipeline各阶段(含并行阶段)间共享变量?
问题描述
我有如下流水线(内容已简化,但结构完全一致):
pipeline { agent any environment { my_var = "" } stages { stage('Stage_parallel'){ parallel{ stage('Stage_1') { steps { ... } } stage('Stage_2'){ steps { withCredentials([usernamePassword(<LOGIN>, <PASS>)]) { sh''' ... var_1 = "/path/to/folder" var_2 = "file_name" my_var = "${var_1}/${var_2}" echo ${my_var} ### returns correct value ''' }}}}} stage('Stage_3'){ steps { sh 'echo ${my_var}' ### returns "" }}}}
尝试声明全局变量,在Stage_2中更新它并在Stage_3中使用,但该变量仅在Stage_2的sh块中能输出正确值,外部则不行。还尝试过:
- 在
pipeline块外定义def my_var - 在
Stage_2中以env.my_var = "${var_1}/${var_2}"赋值,在Stage_3中以${env.my_var}调用
但这些方法都无法让Stage_3获取到Stage_2设置的my_var值,请问该如何修复这条流水线?
修复方案
核心问题是Shell脚本块(sh)和Jenkins流水线的变量空间完全隔离:你在sh里定义的my_var只是Shell进程内的局部变量,根本无法直接同步到Jenkins的环境变量或全局变量中。另外,并行阶段的执行特性也会影响变量传递,但这里主要问题出在Shell和流水线的变量隔离上。
具体修复步骤:
- 从Shell中输出变量值,再让Jenkins捕获
在Stage_2的sh块末尾把需要传递的变量值打印出来,用sh的returnStdout参数捕获输出,再赋值给Jenkins的环境变量:stage('Stage_2'){ steps { withCredentials([usernamePassword(<LOGIN>, <PASS>)]) { script { // 执行Shell并捕获输出 def shellOutput = sh( script: ''' var_1="/path/to/folder" var_2="file_name" echo "${var_1}/${var_2}" ''', returnStdout: true ).trim() // 去除输出中的换行和多余空格 // 赋值给Jenkins环境变量 env.my_var = shellOutput } } } } - 在
Stage_3中直接调用环境变量
此时Stage_3里直接使用${env.my_var}就能拿到正确值:stage('Stage_3'){ steps { sh "echo ${env.my_var}" } }
额外注意事项:
- 不要在
pipeline外定义def my_var,因为Jenkins并行阶段可能运行在不同代理节点上,这类局部变量无法跨节点共享,而env.*环境变量会被Jenkins自动同步到后续所有阶段。 - 如果并行阶段有多个分支都更新
env.my_var,最终值取决于哪个分支先执行完成,要根据业务逻辑确保变量更新的唯一性。
内容的提问来源于stack exchange,提问作者JaSON
相关产品推荐
相关产品推荐

