web-dev-qa-db-fra.com

Comment utiliser la variable d'environnement jenkins dans l'instruction Jenkinsfile if

J'essaie d'utiliser une instruction if dans mon fichier Jenkins pour un projet de pipeline multi-branches. Pour le bien de cette question, supposons que j'ai un fichier texte dans mon répertoire actuel appelé "scan.txt". Le fichier texte est généré avec une commande bash

echo "False" > scan.txt

Donc, le seul contenu est la chaîne "False"

J'ai défini une variable d'environnement arbitraire dans mon fichier Jenkins au contenu de scan.txt comme suit:

script {
    env.TEXT = readFile 'scan.txt'
}

Si je fais

echo "${env.TEXT}" 

en dehors du bloc de script, la console jenkins affiche False pour cette étape, comme prévu.

Cependant, toutes mes tentatives pour vérifier si elle est égale à "False" ont échoué. J'ai essayé ce qui suit immédiatement après le bloc de script:

if (env.TEXT.equals("False")) {
    //do something
}

if (env.TEXT.matches("False")) {
    //do something
}


if (env.TEXT == "False") {
    //do something
}

et aucun d'eux ne fonctionne. Toutes ces conditions sont fausses booléennes. La documentation de l'étape du pipeline de fichiers lus indique qu'elle renvoie une chaîne du contenu du fichier https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-readfile-code-read- file-from-workspace donc je ne suis pas sûr de ce qui se passe ici. Quelqu'un a-t-il des idées?

Merci

5
Dalton Sweeney

Le problème est que lorsque vous faites echo "False" > scan.txt Écho laisse un saut de ligne à la fin du fichier, vous pouvez le voir si vous faites écho env.TEXT Dans votre script de pipeline.

Donc, ce que vous devez faire est d'utiliser String.trim() avant de vérifier si elle est égale à False, trim supprimera tous les espaces blancs au début et à la fin. De plus, la meilleure façon de tester si une chaîne contient est d'utiliser Boolean.parseBoolean(), cela fait tout le travail pour vous.

Essayons ça:

node {
    sh 'echo "False" > output.txt'
    def val = readFile 'output.txt'
    echo "${val}"
    echo "${val.trim()}"
    if (val.equals("False")) { // This will print No
        echo "Yes"
    } else {
        echo "No"
    }
    if (val.trim().equals("False")) { // This will print Yes
        echo "Yes"
    } else {
        echo "No"
    }
    if (!Boolean.parseBoolean(val)) { // This will print Yes
        echo "Yes"
    } else {
        echo "No"
    }
}

Et sur la sortie on obtient:

Started by user jon
[Pipeline] node
Running on master in /var/lib/jenkins/workspace/pl
[Pipeline] {
[Pipeline] sh
[pl] Running Shell script
+ echo False
[Pipeline] readFile
[Pipeline] echo
False

[Pipeline] echo
False
[Pipeline] echo
No
[Pipeline] echo
Yes
[Pipeline] echo
Yes
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Comme vous pouvez le voir, nous avons un saut de ligne supplémentaire lorsque nous faisons la première étape d'écho. Notez également que Boolean.parseBoolean() gère la chaîne sans aucun découpage.

15
Jon S

voici quelques cas, j'espère que cela fera gagner du temps à certaines personnes:

node {

sh 'echo "False" > output.txt'
def val = readFile 'output.txt'
echo "${val}"
echo "${val.trim()}"
if ( "${val.trim()}" ==~ /False/ ) {
    echo "Match Yes trim"
} else {
    echo "Match No trim"
}

if ( "${val}" ==~ /(?ms)False/ ) {
    echo "Match Yes (?ms)"
} else {
    echo "Match No (?ms)"
}

if ( "${val}" ==~ /(?ms)False.*/ ) {
    echo "Match Yes (?ms).*"
} else {
    echo "Match No (?ms).*"
}

if ( "${val}" =~ /False/ ) {
    echo "Match Yes 1="
} else {
    echo "Match No 1="
}

}

Production:

[Pipeline] sh
+ echo False
[Pipeline] readFile
[Pipeline] echo
False

[Pipeline] echo
False
[Pipeline] echo
Match Yes trim
[Pipeline] echo
Match No (?ms)
[Pipeline] echo
Match Yes (?ms).*
[Pipeline] echo
Match Yes 1=

Où (? Ms) signifie plusieurs lignes et s pour une nouvelle ligne de correspondance de points dans l'expression régulière.

Notez que echo "False" > ajoutera une nouvelle ligne au fichier. Cela doit être coupé ou echo -n utilisé.

1
Arunas Bartisius