Asignar la salida de un comando a una variable en una tubería declarativa

El comando en cuestión:

stage('Stage 1') {

    environment {
        CYPRESS_VERSION = ""
    }
            
    steps {
        script {
            CYPRESS_VERSION = "\$(npm show cypress version)"
            print("$CYPRESS_VERSION")                    
        }
   }
}

La impresión emite el texto npm show cypress version

Donde como si yo usara CYPRESS_VERSION = sh "npm show cypress version", produce la versión en los registros de consola (6.1.0), pero no se asigna a la variable.

La salida del comando anterior es null.

Cómo puedo asignar la salida del comando (6.1.0) a la variable CYPRESS_VERSION ¿Por favor?

Muchas gracias.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codealchemyf00f


3 Respuestas:

  • Usted tiene que devolver la salida estándar de la sh comando:

    CYPRESS_VERSION = sh(script: "npm show cypress version", returnStdout: true).toString().trim()

    Respondida el Dec 16, 2020 a las 16:15 - por compilerhero

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que estás intentando asignar la salida de un comando de shell a una variable en un paso declarativo de Pipeline de Jenkins. Cuando usas el método sh en un Pipeline de Jenkins, este comando se ejecuta en un shell diferente, por lo que no puedes asignar directamente su salida a una variable de Groovy.

    Una forma de lograr lo que deseas es utilizar un paso declarativo dentro de la sección steps llamado script que te permitirá ejecutar comandos de shell y asignar su salida a una variable de Groovy. Aquí te muestro cómo puedes hacerlo:

    groovy
    stage('Stage 1') {
        environment {
            CYPRESS_VERSION = ""
        }
    
        steps {
            script {
                def output = sh(script: 'npm show cypress version', returnStdout: true).trim()
                CYPRESS_VERSION = output
                println(CYPRESS_VERSION)
            }
        }
    }
    

    En el código anterior, se utiliza el método sh dentro de un bloque script para ejecutar el comando npm show cypress version y se captura su salida en la variable output. Luego, se asigna el valor de output a la variable CYPRESS_VERSION y se imprime su valor. De esta manera, puedes asignar la salida del comando a la variable CYPRESS_VERSION correctamente.

    Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 17, 2020 a las 16:19 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para asignar la salida de un comando a una variable en una tubería declarativa en Jenkins, debes utilizar el método readToString() en el objeto sh. Aquí tienes el código corregido:

    groovy
    stage('Stage 1') {
    
        environment {
            CYPRESS_VERSION = ""
        }
    
        steps {
            script {
                CYPRESS_VERSION = sh(script: "npm show cypress version", returnStdout: true).trim()
                print("$CYPRESS_VERSION")                    
            }
       }
    }
    

    El método returnStdout se utiliza para capturar la salida estándar del comando y almacenarla en una cadena. El método trim() se utiliza para eliminar los espacios en blanco iniciales y finales de la cadena.

    También puedes utilizar el método readLines() para capturar la salida del comando como una lista de líneas. Sin embargo, en este caso, solo necesitas una sola línea, por lo que readToString() es más apropiado.

    Respondida el Dec 17, 2020 a las 16:30 - por Gemini

    Votos positivos: 0 | Votos negativos: 0