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

如何在Jenkins流水线中循环JSON数组变量并传递至Stage的Node

问题

我已经从指定JSON中获取到list.jvm.pega['jenkins-name']对应的数组值:["ent-giem-sasw02","ent-giem-sasw03","ent-giem-sasw04"],希望在Jenkins流水线的delete_pegarules_schema_for_each_node阶段循环该数组,将每个值传入node步骤,在对应节点执行系统信息打印操作。以下是我的现有Groovy脚本和JSON配置文件,请求实现方案。

现有Groovy脚本

#!/usr/bin/env groovy     

node{
    properties([
    parameters([   
   choice(
        name: 'environment',
        choices: ['','upgrade', 'BV' ],
        description: 'environment to choose'
        ),

    ])
]) 

    deleteDir()
        dir('dir-switch') {

      stage('Checkout') {
   
   // git branch: 'test-upgrade-json', url: 'https://gitlab.xxxxxxx/pipeline.git'
  // stash includes: '**', name: 'upgrade-pega'
        
checkout([$class: 'GitSCM', branches: [[name: '*/test-upgrade-json']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'jenkins-user-github', url: 'https://gitlab.xxxxx/pipeline.git']]])
                
    }
     
         
            stage('Get Environment') {
            sh """
                ls -lart ./*
                ls ${env.WORKSPACE}
                cp -R ./upgrade-pega/environment/env.json  /${env.WORKSPACE}/dir-switch
                ls /${env.WORKSPACE}/dir-switch
            """
        
}

def obj = readJSON file: './env.json'
def list = obj[params.environment];

println list

list.each { println (it)  }
    
stage('JVM check content') {   

sh "echo ${list.jvm.pega['jenkins-name']}" 
   
          }

   stage('delete_pegarules_schema_for_each_node') {
    
///loop 

   node("Expecting the each of the loop in the list of ${list.jvm.pega['jenkins-name']}") {
            sh """
              echo -e "-------------------------------System Information of current node running ----------------------------"
  echo -e "Hostname:\t\t"`hostname` 

            """
        
          }  
        }


     }

}

JSON配置文件

{
    "upgrade": {
        "level": 1,
        "domain": "develop.autosample.co.uk",
        "resources": {
            "db-schemas": {
                "rule": {
                    "schema": "pegarules",
                    "database": "sas_develop",
                    "jvm": ["primary", "secondary"]
                }
               
            }
        },
        "jvm": {
            "load-balancer": null,
            "pega": [{
                "jenkins-name": "ent-giem-sasw02",
                "host": "ent-giem-sasw02",
                "ip": "x.x.x.x"
            },
            
            {
                "jenkins-name": "ent-giem-sasw03",
                "host": "ent-giem-sasw03",
                "ip": "x.x.x.x"
            },
            
            {
                "jenkins-name": "ent-giem-sasw04",
                "host": "ent-giem-sasw04",
                "ip": "x.x.x.x"
            }
            ],
            "db": {
                "primary": {
                    "jenkins-name": "ent-giem-sasrd26",
                    "host": "ent-giem-sasrd26",
                    "ip": "x.x.x.x",
                    "port": 5432
                },
                "secondary": {
                    "jenkins-name": "ent-giem-sasrd98",
                    "host": "ent-giem-pgrd98",
                    "ip": "x.x.x.x",
                    "port": 5432


                  }
                }
    
            }
        }
}

实现方案

关键修改点

  1. 正确提取节点名称数组:原脚本中list.jvm.pega['jenkins-name']写法错误,因为pega是对象数组,需要用collect方法提取每个对象的jenkins-name字段,得到目标节点列表。
  2. 循环执行节点操作:在目标阶段遍历节点数组,为每个节点创建独立的node步骤,执行系统信息打印。

修改后的完整Groovy脚本

#!/usr/bin/env groovy     

node{
    properties([
        parameters([   
            choice(
                name: 'environment',
                choices: ['','upgrade', 'BV' ],
                description: 'environment to choose'
            )
        ])
    ]) 

    deleteDir()
    dir('dir-switch') {
        stage('Checkout') {
            checkout([$class: 'GitSCM', branches: [[name: '*/test-upgrade-json']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'jenkins-user-github', url: 'https://gitlab.xxxxx/pipeline.git']]])
        }
         
        stage('Get Environment') {
            sh """
                ls -lart ./*
                ls ${env.WORKSPACE}
                cp -R ./upgrade-pega/environment/env.json  /${env.WORKSPACE}/dir-switch
                ls /${env.WORKSPACE}/dir-switch
            """
        }

        def obj = readJSON file: './env.json'
        def envConfig = obj[params.environment];

        println envConfig

        // 提取pega节点的jenkins-name数组
        def pegaNodes = envConfig.jvm.pega.collect { it['jenkins-name'] }
        
        stage('JVM check content') {   
            sh "echo ${pegaNodes}" 
        }

        stage('delete_pegarules_schema_for_each_node') {
            // 循环每个节点执行操作
            pegaNodes.each { nodeName ->
                node(nodeName) {
                    sh """
                        echo -e "-------------------------------System Information of current node running ----------------------------"
                        echo -e "Hostname:\t\t"`hostname` 
                    """
                }  
            }
        }
    }
}

说明

  • envConfig.jvm.pega.collect { it['jenkins-name'] }从JSON的pega对象数组中提取所有Jenkins节点名称,得到目标数组["ent-giem-sasw02","ent-giem-sasw03","ent-giem-sasw04"]。
  • 在delete_pegarules_schema_for_each_node阶段,通过pegaNodes.each { nodeName -> ... }循环,将每个节点名称传入node(nodeName)步骤,在对应节点上执行系统信息打印命令。
  • 原list变量重命名为envConfig,提升代码可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:31:18