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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:18:08