Jenkins中如何在sh代码块外部获取变量值?
Jenkins流水线:将sh块内循环结果传递到外部变量
你的两种尝试失效的原因
第一种方案问题
- Jenkins的
sh块运行在独立的shell进程中,里面定义的lambda_deployers是shell本地变量,和你在Groovy层面声明的def lambda_deployers属于完全不同的变量空间,二者互不影响。 - 第二个
sh """echo $lambda_deployers"""使用双引号时,Groovy会先解析替换$lambda_deployers,而这个Groovy变量初始为空字符串,实际执行的是echo "",自然没有输出。
第二种方案问题
environment块定义的是Jenkins层面的环境变量,属于Groovy上下文,shell进程无法直接修改它。sh块里的lambda_deployers依然是shell自己的本地变量,和env.lambda_deployers没有关联,所以外部输出为null。
正确实现方法
要将shell内的结果传递到Groovy,核心是让shell把目标内容输出到标准输出,再通过Jenkins sh步骤的returnStdout: true参数捕获输出,赋值给Groovy变量。
代码示例(合并为字符串)
stage('Fetch lambda paths') { steps { script { // 捕获shell输出并赋值给Groovy变量 def lambda_deployers = sh( script: ''' cd "$WORKDIR/$BASE_DIR/" # 遍历所有package.json文件,输出对应目标路径 find . -type f -name 'package.json' | while read -r file; do # 去掉路径开头的./,拼接成最终路径 dir=$(dirname "$file" | sed 's/^\.\///') echo "/$BASE_DIR/$dir" done | tr '\\n' ' ' # 将换行替换为空格,合并成一行字符串 ''', returnStdout: true ).trim() // 在Groovy层面直接使用变量 echo "获取到的Lambda部署路径:${lambda_deployers}" // 在另一个sh块中使用该变量(双引号让Groovy先替换变量) sh """echo "Shell中使用路径:${lambda_deployers}"""" } } }
代码示例(转为Groovy列表)
如果需要逐个处理路径,可以将输出转为列表:
stage('Fetch lambda paths') { steps { script { def lambda_paths = sh( script: ''' cd "$WORKDIR/$BASE_DIR/" find . -type f -name 'package.json' | while read -r file; do dir=$(dirname "$file" | sed 's/^\.\///') echo "/$BASE_DIR/$dir" done ''', returnStdout: true ).trim().split('\n') echo "路径列表:${lambda_paths}" // 遍历处理每个路径 lambda_paths.each { path -> echo "正在处理路径:${path}" // 可在此添加后续部署等逻辑 } } } }
关键说明
returnStdout: true:这是Jenkins从shell向Groovy传递数据的标准方式,会将shell命令的标准输出作为返回值。- 替换
for k in $(find ...):改用while read可以兼容带空格的文件名,避免解析错误。 - 路径处理优化:用
sed去掉路径开头的./,比多次cut操作更简洁可靠。
内容的提问来源于stack exchange,提问作者Nitin k
相关产品推荐
相关产品推荐

