如何在Jenkins流水线中修改Ansible YAML playbook按后缀补全dest字段值
错误原因
报错是YAML字段的访问层级错误导致:你调用endsWith()的对象是列表而非单个文件的src字符串。
你的delivery.yaml结构层级如下,你漏了前两层列表的下标访问:
- 根层级是数组,第一个元素才是Ansible Play配置
tasks字段也是数组,第一个元素才是「Copy files」复制任务- 复制任务下的
with_items才是存储所有待复制文件配置的列表
正确实现代码
你可以直接用后缀映射表的方式批量赋值,无需重复写多次查找逻辑:
stage('YAML test'){ steps{ script{ // 定义后缀与目标路径的映射规则 def suffixMap = [ 'xml': 'target1', 'so': 'target2', 'exe': 'target3', 'lib': 'target4' ] def yamlData = readYaml file: 'delivery.yaml' // 遍历所有待复制文件配置赋值dest yamlData[0].tasks[0].with_items.each { item -> def suffix = item.src.split('\\.').last() if(suffixMap.containsKey(suffix)){ item.dest = suffixMap[suffix] } } writeYaml file: 'delivery_temp.yaml', data: yamlData sh "cat delivery_temp.yaml" } } }
如果你的tasks列表里有多个任务,推荐按任务名匹配定位复制任务,避免下标顺序变化导致的错误:
// 替换yamlData[0].tasks[0]的部分,按任务名过滤更稳妥 def copyTask = yamlData[0].tasks.find { it.name == 'Copy files' } copyTask.with_items.each { item -> // 同上赋值逻辑 }
内容的提问来源于stack exchange,提问作者Matou
相关产品推荐
相关产品推荐

