簡體   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