es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Modifica un playbook YAML en un pipeline de Jenkins.

Tengo un archivo delivery.yaml utilizado por Ansible para desplegar datos:

“`

  • name: Desplegar en el Filer en el host
    hosts: host
    tasks:

    • name: Copiar archivos
      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: ” }
        “`

Necesito completar el valor “dest” de acuerdo con la extensión del archivo:

archivos xml => destino1
archivos so => destino2
archivos exe => destino3
archivos lib => destino4

¿Cómo escribirlo? No estoy acostumbrado con el lenguaje Groovy. Actualmente, escribo esto pero no funciona:

stage('Prueba YAML') {
pasos{
script{
yamlData = readYaml file: 'delivery.yaml'
yamlData.tasks.with_items.find{it.src.endsWith("xml")}.dest="destino1"
writeYaml file: 'delivery_temp.yaml', data: yamlData
sh "cat delivery_temp.yaml"
}
}
}

Obtengo este error:

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.endsWith() is applicable for argument types: (java.lang.String) values: [xml]

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para completar el valor “dest” de acuerdo con la extensión del archivo, podemos usar un mapa para hacer coincidir la extensión con el valor objetivo. Aquí hay una versión actualizada del script en groovy:

    etapa('Prueba de YAML'){
        pasos{
            script{
                def extensionToTargetMap = [
                    'xml': 'target1',
                    'so': 'target2',
                    'exe': 'target3',
                    'lib': 'target4'
                ]
                def yamlData = readYaml file: 'delivery.yaml'
                yamlData.tasks.with_items.each { item ->
                    def extension = item.src.tokenize('.').last()
                    item.dest = extensionToTargetMap[extension]
                }
                writeYaml file: 'delivery_temp.yaml', data: yamlData
                sh "cat delivery_temp.yaml"
            }
        }
    }
    

    Explicación:
    – Creamos un mapa llamado extensionToTargetMap que relaciona cada extensión de archivo con su valor objetivo.
    – Leemos el archivo YAML en una variable yamlData.
    – Recorremos cada elemento de la lista tasks utilizando each, y para cada elemento:
    – Extraemos la extensión del archivo utilizando el método tokenize, que divide la cadena en una matriz utilizando el punto como delimitador, y obtenemos el último elemento de esa matriz (la extensión del archivo).
    – Actualizamos el valor dest del elemento utilizando el mapa que creamos.
    – Finalmente, escribimos los datos YAML actualizados en un archivo llamado delivery_temp.yaml, y usamos sh para imprimir su contenido.

Comments are closed.