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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:06:41