Cacher le mot de passe dans le script du pipeline Jenkins

j'essaie de masquer un mot de passe dans mon build Jenkins.

j'ai essayé le masque des mots de passe plugin.

cependant, cela ne semble pas fonctionner avec mon script de pipeline Jenkins, parce que si je définis le mot de passe PASSWD1 puis-je l'utiliser dans le script comme ceci ${PASSWD1}, j'obtiens:

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

Si j'utilise env.PASSWD1, alors sa valeur sera résolu null.

alors comment masquer un mot de passe dans un pipeline Jenkins script?

20
demandé sur octavian 2017-02-21 18:49:03

2 réponses

Le plus simple serait d'utiliser le Informations D'Identification Plugin.

vous pouvez définir différents types de justificatifs, qu'il s'agisse d'un mot de passe unique ("texte secret"), d'un fichier, ou d'une combinaison nom d'utilisateur/mot de passe. Plus d'autres plugins peuvent contribuer d'autres types de justificatifs d'identité.

lorsque vous créez un justificatif d'identité (via le lien "Credentials"sur la page principale de Jenkins), assurez-vous de définir un "ID". Dans l'exemple ci-dessous, j'ai appelé my-pass. Si vous n'avez pas mettez-le, il fonctionnera toujours, Jenkins vous attribuera un UUID opaque à la place.

Dans tous les cas, vous pouvez facilement générer la syntaxe requise avec l' extrait de code générateur.

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

ceci rendra le mot de passe disponible dans la variable donnée seulement dans ce bloc. Si vous tentez d'imprimer le mot de passe, comme je le fais ici, il sera masqué.

29
répondu Christopher Orr 2017-12-05 22:01:46

la Recherche sur cette question, https://issues.jenkins-ci.org/browse/JENKINS-27392, vous devriez être en mesure de faire ce qui suit:

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

cependant, si vous regardez les derniers commentaires dans ce numéro, cela ne fonctionne pas, cela ressemble à un bug. Cependant, si vous connaissez le secret et imprimez accidentellement int dans les logs, le Il est caché, comme ceci:

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

cela produit:

[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

Concernant l'erreur que vous obtenez, No such DSL method '$' found among steps ..., je suis juste devinant mais vous utilisez probablement ${VAR} directement dans le script du pipeline,${...} n'est pertinente à l'intérieur de chaînes en groovy.

modifier: Ou vous pouvez utiliser le Credentails Plugin et étape du pipeline 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!"
""";
    }
}

résultat:

[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

notez que ce plugin lie la variable directement à la fermeture et non à l'environnement comme l'autre, par exemple je peux utiliser la variable SECRET directement.

9
répondu Jon S 2017-02-21 17:19:39