在 Jenkins 管道中修改 YAML 剧本
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
是否正确取决于数据(这只会
找到第一个,如果有 none 就会失败)。很可能是你
想要 findAll
代替(这会导致所有结果的列表和
.dest
由于隐式展开运算符,赋值仍然有效。
并摆脱复制和粘贴代码
对所有四种类型(或将有多少种)执行此操作,你是
最好将转换提取为数据(例如来自
目标后缀)
我有一个 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
是否正确取决于数据(这只会
找到第一个,如果有 none 就会失败)。很可能是你
想要 findAll
代替(这会导致所有结果的列表和
.dest
由于隐式展开运算符,赋值仍然有效。
并摆脱复制和粘贴代码 对所有四种类型(或将有多少种)执行此操作,你是 最好将转换提取为数据(例如来自 目标后缀)