Jenkins中使用ReadJSON读取packages.json特定子元素的问题
Jenkins中使用ReadJSON读取packages.json特定子元素的问题
我明白你现在遇到的困扰了——想通过Jenkins流水线里的环境变量env.VM_PACKAGE,从packages.json里拿到对应包的CPU、内存和磁盘配置,但之前的写法一直没生效对吧?
先确认下你的packages.json结构是没问题的:
{ "packages": { "pkg1": { "Cpu": "2", "Memory": "8", "Disk": "100" }, "pkg2": { "Cpu": "4", "Memory": "16", "Disk": "200" } } }
问题出在你获取子元素的语法上,props['packages'].props["${env.VM_PACKAGE}"]这种写法是错误的——props['packages']本身就是一个Map对象,不需要再额外调用.props。咱们直接通过键名访问就行,Groovy处理Map的语法其实可以更简洁。
下面是修正后的流水线脚本:
stage('Parse package details') { steps { echo "Read packages JSON file" script { def props = readJSON file: "${WORKSPACE}/maintenance-vm/packages.json" // 先拿到指定的包对象,后续取值更清晰 def targetPackage = props.packages[env.VM_PACKAGE] env.PACKAGE_CPU = targetPackage.Cpu env.PACKAGE_MEMORY = targetPackage.Memory env.PACKAGE_DISK = targetPackage.Disk } echo "Cpu: ${env.PACKAGE_CPU} Memory: ${env.PACKAGE_MEMORY} Disk: ${env.PACKAGE_DISK}" } }
我来拆解下修正点:
- 用
props.packages[env.VM_PACKAGE]直接获取对应包的配置对象,env.VM_PACKAGE可以直接作为Map的键,不需要额外加引号包裹(Groovy会自动处理) - 之后通过对象属性的方式
targetPackage.Cpu取值,比.get()方法更直观,要是你习惯用.get(),写成targetPackage.get("Cpu")也完全没问题 - 这样当
env.VM_PACKAGE的值是pkg2时,echo就会输出你想要的Cpu: 4 Memory: 16 Disk: 200
另外给你个小建议:如果担心env.VM_PACKAGE指定的包可能不存在,可以加个判断避免流水线莫名失败,比如:
script { def props = readJSON file: "${WORKSPACE}/maintenance-vm/packages.json" if (!props.packages.containsKey(env.VM_PACKAGE)) { error "Package ${env.VM_PACKAGE} not found in packages.json!" } def targetPackage = props.packages[env.VM_PACKAGE] env.PACKAGE_CPU = targetPackage.Cpu env.PACKAGE_MEMORY = targetPackage.Memory env.PACKAGE_DISK = targetPackage.Disk }
这样如果环境变量指定的包不存在,流水线会直接抛出明确的错误提示,方便你快速排查问题。
备注:内容来源于stack exchange,提问作者Darwick
相关产品推荐
相关产品推荐

