Estoy tratando de enmascarar una contraseña en mi compilación Jenkins.

He estado probando el complemento mask-passwords.

Sin embargo, esto no parece funcionar con mi script de canalización de Jenkins, porque si defino la contraseña PASSWD1 y luego la uso en el script como este ${PASSWD1}, obtengo:

No such DSL method '$' found among steps [addToClasspath, ansiColor, ansiblePlaybook, ....]

Si uso env.PASSWD1, su valor se resolverá en null.

Entonces, ¿cómo debo enmascarar una contraseña en un script de canalización de Jenkins?

27
octavian 21 feb. 2017 a las 18:49

2 respuestas

La mejor respuesta

La forma más sencilla sería utilizar el Credentials Plugin.

Allí puede definir diferentes tipos de credenciales, ya sea una contraseña única ("texto secreto"), un archivo o una combinación de nombre de usuario / contraseña. Además, otros complementos pueden aportar otros tipos de credenciales.

Cuando cree una credencial (a través del enlace Credenciales en la página principal de Jenkins), asegúrese de establecer una "ID". En el siguiente ejemplo, lo he llamado my-pass. Si no lo configura, seguirá funcionando, Jenkins le asignará un UUID opaco.

En cualquier caso, puede generar fácilmente la sintaxis requerida con el generador de fragmentos.

withCredentials([string(credentialsId: 'my-pass', variable: 'PW1')]) {
    echo "My password is '${PW1}'!"
}

Esto hará que la contraseña esté disponible en la variable dada solo dentro de este bloque. Si intenta imprimir la contraseña, como hago aquí, se enmascarará.

45
mkobit 5 dic. 2017 a las 22:01

Mirando este problema, https://issues.jenkins-ci.org/browse/JENKINS- 27392, debe poder hacer lo siguiente:

node {
    wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: '123ADS', var: 'SECRET']]]) {
        echo env['SECRET'];
    }
}

Sin embargo, si observa los últimos comentarios en ese tema, no funciona, parece un error. Sin embargo, si conoce el secreto e imprime accidentalmente int en los registros, se oculta de la siguiente manera:

node {
        wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: '123ADS', var: 'SECRET']]]) {
        echo "123ADS";
    }
}

Esto produce:

[Pipeline] node
Running on master in workspace/pl
[Pipeline] {
[Pipeline] wrap
[Pipeline] {
[Pipeline] echo
********
[Pipeline] }
[Pipeline] // wrap
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Con respecto al error que está obteniendo, No such DSL method '$' found among steps ..., solo estoy adivinando, pero probablemente esté utilizando ${VAR} directamente en el script de la tubería, ${...} solo es relevante dentro de las cadenas en groovy.

EDITAR: O puede usar el Credentails Plugin y el paso de canalización withCredentials:

// Credential d389273c-03a0-45af-a847-166092b77bda is set to a string secret in Jenkins config.
node {
    withCredentials([string(credentialsId: 'd389273c-03a0-45af-a847-166092b77bda', variable: 'SECRET')]) {
        bat """
if ["${SECRET}"] == ["123ASD"] echo "Equal!"
""";
    }
}

Esto resulta en:

[Pipeline] node
Running on master in workspace/pl
[Pipeline] {
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] bat
[pl] Running batch script

workspace/pl>if ["****"] == ["****"] echo "Equal!" 
"Equal!"
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Tenga en cuenta que este complemento vincula la variable directamente al cierre y no al entorno como el otro, p. Puedo usar la variable SECRET directamente.

18
Jon S 21 feb. 2017 a las 17:19