Jenkins中writeYaml无法覆盖YAML文件hash值问题求助
问题:用GIT_COMMIT覆盖YAML中的hash值失败
原始YAML结构
transfers: - name: xyz cloud: aws subheading: impact: Low reason: --- artifacts: - name: name1 type: type1 source: hash: a1b2C3dd4 # 待覆盖的值
需求
需要用Jenkins环境变量GIT_COMMIT的最新值,替换上述YAML文件中source节点下的hash字段值。
尝试的错误代码
按照相关方法编写的Groovy代码,但执行后hash值始终未变化:
def filename = ('path/to/file.yaml') def datas = readYaml file: filename //修改hash值 datas.transfers['artifacts'].source.hash[0][0] = env.GIT_COMMIT writeYaml file: filename, data: datas, overwrite: true
问题根源
代码对YAML结构的访问路径完全错误:
transfers是数组类型(YAML中-代表数组元素),必须通过索引访问第一个元素,即transfers[0]artifacts同样是数组,需要访问第一个元素artifacts[0]hash是普通字符串字段,不需要额外的[0][0]索引,直接赋值即可
修正后的代码
def filename = 'path/to/file.yaml' def datas = readYaml file: filename // 正确遍历结构:取transfers第一个元素 → 取artifacts第一个元素 → 修改source下的hash datas.transfers[0].artifacts[0].source.hash = env.GIT_COMMIT ?: 'testHash123' writeYaml file: filename, data: datas, overwrite: true
补充说明
- 代码中
?: 'testHash123'是兜底逻辑,防止GIT_COMMIT环境变量为空时出现赋值异常 - 执行后YAML中的
hash值会被成功替换为目标值
内容的提问来源于stack exchange,提问作者awesomness03
相关产品推荐
相关产品推荐

