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

Jenkins声明式流水线:如何跨节点读取文件数据到数组?

这个问题我太熟了!你遇到的核心问题是不同节点的Shell环境完全隔离——每个stage里的arr1都是当前节点Shell进程的本地变量,根本传不到其他节点或者后续stage里去,所以最后Node-A只能拿到自己本地的数据。

咱直接上解决方案,核心思路是用Jenkins流水线的Groovy全局变量来跨节点存储数据,因为Groovy变量是在Jenkins控制器端维护的,不管哪个节点执行stage,都能访问和修改它。

修改后的完整代码

pipeline {
    agent none
    stages {
        stage("收集Node-C的数据") {
            agent { label "Node-C" }
            steps {
                script {
                    // 捕获Node-C上grep的输出,trim去掉首尾空白和换行
                    def nodeCResult = sh(
                        script: 'grep -i "docker" /opt/abc/Text1.txt',
                        returnStdout: true
                    ).trim()
                    
                    // 初始化全局数组(如果还没定义的话)
                    if (!binding.hasVariable('globalDockerArr')) {
                        globalDockerArr = []
                    }
                    
                    // 如果有结果,按空格拆分成数组元素并加入全局数组
                    if (nodeCResult) {
                        globalDockerArr.addAll(nodeCResult.split(' '))
                    }
                }
            }
        }

        stage("收集Node-B的数据") {
            agent { label "Node-B" }
            steps {
                script {
                    def nodeBResult = sh(
                        script: 'grep -i "docker" /opt/abc/Text1.txt',
                        returnStdout: true
                    ).trim()
                    
                    if (nodeBResult) {
                        globalDockerArr.addAll(nodeBResult.split(' '))
                    }
                }
            }
        }

        stage("在Node-A汇总处理数据") {
            agent { label "Node-A" }
            steps {
                script {
                    // 先打印Groovy数组里的所有数据
                    echo "==== 所有节点收集到的Docker相关内容 ===="
                    globalDockerArr.each { item ->
                        echo "== $item =="
                    }

                    // 如果需要在Shell里处理,把Groovy数组转成字符串传给Shell
                    def arrStr = globalDockerArr.join(' ')
                    sh '''
                        for i in ''' + arrStr + '''
                        do
                            echo "Shell端输出: == $i =="
                        done
                    '''
                }
            }
        }
    }
}

关键知识点说明

  1. 全局变量跨节点共享:globalDockerArr是Groovy全局变量,存在Jenkins控制器中,每个节点的stage执行时都会把数据传回控制器,所以能实现跨节点汇总。
  2. 捕获Shell输出:用sh returnStdout: true替代直接在Shell里操作数组,因为Shell本地变量无法跨节点传递,必须把输出结果传回Groovy层。
  3. 空值处理:添加trim()和非空判断,避免把空字符串或多余换行符加入数组。
  4. 灵活拆分规则:如果你的需求是按行而不是按空格拆分结果,把split(' ')改成split('\n')就行。

额外注意事项

  • 如果文件内容包含空格、引号等特殊字符,建议按行拆分并对每个元素做转义处理,避免Shell执行时出错。
  • 若数据量极大,不建议用全局数组存储,可考虑写入共享存储(如NFS)或用Jenkins工件(Artifact)传递数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:12:13