如何在声明式流水线的Jenkinsfile中设置环境变量
你提供的写法是不正确的。
原因:Jenkins 中每个 sh 步骤都会启动独立的 Shell 子进程,进程退出后内部定义的临时变量会被销毁,第二个 sh 步骤运行在全新的进程上下文,无法读取前一步设置的 MY_ENV_VAR,最终执行脚本时传入的是空值。
方法1:同一sh步骤内定义并使用变量
把变量定义和使用逻辑放在同一个sh块中,共享同一个Shell进程即可生效:
stage("build_my_code") { steps { sh ''' MY_ENV_VAR="some_value" ./my_script.sh $MY_ENV_VAR ''' } }
使用三个单引号包裹多段Shell命令,可以避免额外的转义操作。
方法2:通过environment块定义全局/阶段级环境变量
如果需要变量在整个流水线、或当前Stage的所有步骤中都可以被访问,可以声明在environment块中:
- 定义在
pipeline根块下的environment:全流水线所有Stage都可以访问 - 定义在单个
stage块下的environment:仅当前Stage的步骤可以访问
示例(Stage级环境变量):
stage("build_my_code") { environment { MY_ENV_VAR = "some_value" } steps { // 所有当前Stage的sh步骤都可以直接读取该变量 sh './my_script.sh $MY_ENV_VAR' sh 'echo $MY_ENV_VAR' // 也可以通过env对象在Jenkinsfile中读取 echo "读取变量值:${env.MY_ENV_VAR}" } }
方法3:动态生成变量传递到后续步骤
如果变量值需要通过Shell命令动态生成(比如获取Git commit哈希、生成时间戳等),可以通过sh步骤的returnStdout参数捕获输出,再传递到后续步骤使用:
stage("build_my_code") { steps { script { // trim()用于去除命令输出末尾默认的换行符 MY_DYNAMIC_VAR = sh(script: 'date +%Y%m%d', returnStdout: true).trim() } sh "echo 动态生成的变量值为 ${MY_DYNAMIC_VAR}" sh "./my_script.sh ${MY_DYNAMIC_VAR}" } }
动态生成的变量也可以直接放在environment块中定义,作用范围和普通环境变量一致。
内容的提问来源于stack exchange,提问作者TheWaterProgrammer
相关产品推荐
相关产品推荐

