在 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 由于隐式展开运算符,赋值仍然有效。

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