You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}"
                // 可在此添加后续部署等逻辑
            }
        }
    }
}

关键说明

  1. returnStdout: true:这是Jenkins从shell向Groovy传递数据的标准方式,会将shell命令的标准输出作为返回值。
  2. 替换for k in $(find ...):改用while read可以兼容带空格的文件名,避免解析错误。
  3. 路径处理优化:用sed去掉路径开头的./,比多次cut操作更简洁可靠。

内容的提问来源于stack exchange,提问作者Nitin k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:20:42