如何在Jenkins构建作业中使用Bash变量并传递给下游任务
问题根因
你在sh步骤的单引号包裹脚本中定义的nombre是Bash子进程的内部局部变量,Jenkins的全局env变量集不会自动捕获独立shell进程内的普通变量:这类变量的生命周期仅存在于当前sh步骤的执行窗口内,步骤执行完成、子进程销毁后变量就会被回收,跨步骤、跨阶段自然无法读取,你直接访问env.nombre会拿到null值直接报错。
你之前尝试的environment块赋值写法也不生效:environment块的赋值逻辑是Pipeline启动初始化阶段就执行的,此时PART1阶段的shell脚本还没运行,env.nombre本身就是空值,自然拿不到结果。
可用解决方案
方案1:单变量场景直接捕获sh输出(最简洁)
如果只需要传递单个变量,直接给sh步骤加returnStdout: true参数,把shell命令的标准输出捕获后直接赋值给env下的变量,全Pipeline任意阶段都可以访问:
stages{ stage('PART1'){ steps{ cleanWs() git credentialsId: 'ssh-git-access', url: 'git@bitbucket.org:XXXX/XXXXX.git' script { // .trim()用于去掉cat命令输出末尾自带的换行符,避免传参时带多余空白 env.nombre = sh( script: 'cat /home/user/nombre.txt', returnStdout: true ).trim() // 此处验证输出即可看到HELLO echo env.nombre } } } stage('PART2'){ steps{ echo env.nombre build job: 'JOB_2', parameters: [string(name: 'nombre', value: env.nombre)] } } }
修改后PART2阶段的原有逻辑不需要调整,直接读取、下游传参都能正常拿到值。
方案2:多变量场景通过属性文件导入
如果同一个shell步骤里需要生成多个要透传给Jenkins上下文的变量,可以把变量按key=value格式写入属性文件,再通过步骤加载到环境变量中:
script { sh ''' nombre=$(cat /home/user/nombre.txt) // 其他需要导出的变量也按相同格式写入文件,注意等号两侧不要加空格 echo "nombre=${nombre}" > pipeline_env.props ''' // 读取属性文件加载变量,依赖Pipeline Utility Steps插件(多数Jenkins环境默认预装) def envProps = readProperties file: 'pipeline_env.props' env.nombre = envProps.nombre }
内容的提问来源于stack exchange,提问作者FrankieGG
相关产品推荐
相关产品推荐

