繁体   English   中英

在 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是否正确取决于数据(这只会找到第一个,如果没有就会失败)。 很可能您想要findAll (这会导致所有结果的列表,并且.dest分配由于隐式传播运算符仍然有效)。

为了摆脱对所有四种类型(或有多少种)执行此操作的复制和粘贴代码,最好将转换提取为数据(例如,从后缀到目标的 map)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM