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
相关产品推荐
相关产品推荐

