如何在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 } } } } }
实现方案
关键修改点
- 正确提取节点名称数组:原脚本中
list.jvm.pega['jenkins-name']写法错误,因为pega是对象数组,需要用collect方法提取每个对象的jenkins-name字段,得到目标节点列表。 - 循环执行节点操作:在目标阶段遍历节点数组,为每个节点创建独立的
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
相关产品推荐
相关产品推荐

