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

Groovy(Jenkins Pipeline)通过变量获取YAML指定值的方法咨询

问题描述

我有一个结构如下的YAML文件:

key1: value 1 
key2:
  - value 21
  - value 22
key3:
  - key31: value 311
    key32: value 321
    key33: value 331

需要获取其中的value 331,现有Groovy代码如下:

@Grab('org.yaml:snakeyaml:1.26')
import org.yaml.snakeyaml.Yaml

// parse the yaml 
def yaml = new Yaml().load(new FileReader("file.yaml"))
def var1 = "key3"
def var2 = "key33"

println yaml.key3.key33 // this is getting value 331
println yaml.$var1.$var2 // this is getting null

直接调用yaml.key3.key33可正常获取值,但使用变量yaml.$var1.$var2返回null。请问在Jenkins Pipeline场景下,还有哪些方法可通过变量获取该值?

解决方案

问题核心是key3对应的数据类型是列表(List),而非直接的Map。yaml.key3能拿到值是Groovy的语法糖自动取了列表第一个元素,但用变量yaml.$var1时得到的是完整List对象,直接访问.$var2自然返回null。以下是Jenkins Pipeline中可行的解决方法:

方法1:显式获取列表首个元素

先通过变量拿到列表,再取第一个元素后访问目标key:

def var1 = "key3"
def var2 = "key33"
def targetValue = yaml[var1][0][var2]
println targetValue // 输出value 331

方法2:结合Groovy属性访问语法

用."$变量名"的形式保持点访问风格,同时显式处理列表元素:

def var1 = "key3"
def var2 = "key33"
def targetValue = yaml."$var1"[0]."$var2"
println targetValue // 输出value 331

方法3:遍历列表(多元素场景)

如果key3下有多个Map元素,需要批量获取key33的值时,可遍历列表:

def var1 = "key3"
def var2 = "key33"
yaml[var1].each { item ->
    println item[var2] // 输出每个元素的key33对应值
}

方法4:使用Jenkins内置readYaml步骤

Jenkins Pipeline自带readYaml步骤,无需手动引入依赖,同样支持变量访问:

pipeline {
    agent any
    stages {
        stage('Read YAML') {
            steps {
                script {
                    def yaml = readYaml file: 'file.yaml'
                    def var1 = "key3"
                    def var2 = "key33"
                    def targetValue = yaml[var1][0][var2]
                    echo targetValue
                }
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Raul Martinez Lopez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:15:41