Groovy声明式流水线改写YAML遇类型不匹配问题求助
Groovy声明式流水线改写YAML时的类型不匹配问题
现有YAML结构
transfers: - name: xyz cloud: aws subheading: impact: Low reason: --- artifacts: - name: name1 type: type1 source: hash: a1b2C3dd4 # 要覆盖的值
编写的Groovy代码
HASH = sh(returnStdout:true, script: 'git rev-parse HEAD').trim() data.transfers['artifacts'].source['hash'] = HASH writeYaml file: filename, data: data, overwrite = true
问题描述
执行第二行代码时出现“type mismatch”错误,原因是data.transfers['artifacts'].source['hash']为ArrayList类型,而HASH是字符串类型。已知可将HASH转为ArrayList解决,但不理解为何直接赋值无法覆盖数组内的值,想知道是否存在无需转换HASH的解决办法。
问题原因
你的代码层级访问逻辑错误:
- YAML中
transfers是数组类型(以-开头),所以data.transfers是ArrayList,不是单个Map对象 - 同理,
artifacts也是数组类型,data.transfers[0].artifacts同样是ArrayList - 你用
data.transfers['artifacts']的写法,Groovy会将其解析为从transfers列表中提取所有元素的artifacts属性,得到一个包含所有artifacts的ArrayList;继续访问.source会提取该列表中所有元素的source属性,再访问.hash就得到了所有source的hash组成的ArrayList。此时试图给ArrayList赋值字符串,自然触发类型不匹配错误。
无需转换HASH的解决办法
直接修正层级访问路径,精准定位到单个hash字段:
HASH = sh(returnStdout:true, script: 'git rev-parse HEAD').trim() // 定位到transfers数组第一个元素 → artifacts数组第一个元素 → source → hash data.transfers[0].artifacts[0].source.hash = HASH writeYaml file: filename, data: data, overwrite: true
如果YAML中存在多个transfers或artifacts元素,需要批量修改的话,可使用循环遍历:
HASH = sh(returnStdout:true, script: 'git rev-parse HEAD').trim() // 遍历所有transfers下的所有artifacts,修改hash值 data.transfers.each { transfer -> transfer.artifacts.each { artifact -> artifact.source.hash = HASH } } writeYaml file: filename, data: data, overwrite: true
内容的提问来源于stack exchange,提问作者awesomness03
相关产品推荐
相关产品推荐

