[英]Modify a YAML playbook in a Jenkins pipeline
我有一个 Delivery.yaml 被 Ansible 用来部署数据:
---
- name: Deploy to Filer on host
hosts: host
tasks:
- name: Copy files
copy: src={{ item.src }} dest={{ item.dest }} mode=0775
with_items:
- { src: 'data1.xml', dest: '' }
- { src: 'data2.so', dest: '' }
- { src: 'data3.exe', dest: '' }
- { src: 'data4.lib', dest: '' }
我需要根据数据扩展完成“dest”值:
xml files => target1
so files => target2
exe files => target3
lib files => target4
怎么写? 我不使用 groovy 语言。 目前,我写了这个,但它不起作用:
stage('YAML test'){
steps{
script{
yamlData = readYaml file: 'delivery.yaml'
yamlData.tasks.with_items.find{it.src.endsWith("xml")}.dest="target1"
writeYaml file: 'delivery_temp.yaml', data: yamlData
sh "cat delivery_temp.yaml"
}
}
}
我收到了这个错误:
hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.endsWith() is applicable for argument types: (java.lang.String) values: [xml]
这里的问题是,您最外层的数据类型已经是一个列表。 所以 Groovy 将使用隐式扩展运算符。 这里暗示的是:
yamlData*.tasks*.with_items.find{ it*.src.endWith ... }
所以你实际上想要对最外层的每个元素进行转换:
yamlData.each{ it.tasks.each { task -> task.with_items.find{it.src.endsWith("xml")}.dest="target1" } }
这里的find
是否正确取决于数据(这只会找到第一个,如果没有就会失败)。 很可能您想要findAll
(这会导致所有结果的列表,并且.dest
分配由于隐式传播运算符仍然有效)。
为了摆脱对所有四种类型(或有多少种)执行此操作的复制和粘贴代码,最好将转换提取为数据(例如,从后缀到目标的 map)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.