web-dev-qa-db-fra.com

Comment définir et référencer une variable dans un fichier Jenkins

J'ai un script de pipeline déclaratif pour mon projet multibranches dans lequel j'aimerais lire un fichier texte et stocker le résultat sous la forme d'une variable chaîne à laquelle accéder par une étape ultérieure du pipeline. En utilisant le générateur d'extrait de code, j'ai essayé de faire quelque chose comme ceci:

filename = readFile 'output.txt'

Pour lequel filename serait ma chaîne.

Je reçois une erreur dans la sortie de la console Jenkins:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 30: Expected a step @ line 30, column 5.
            filename = readFile 'output.txt'

Dois-je utiliser une étape withEnv pour définir la sortie de readFile sur une variable d'environnement Jenkins? Si c'est le cas, comment?

Merci

25
Dalton Sweeney

L'erreur est due au fait que vous ne pouvez utiliser que des étapes de pipeline dans la directive steps. Une solution de contournement que je connaisse consiste à utiliser l'étape script, à envelopper le script de pipeline arbitraire à l'intérieur et à enregistrer le résultat dans la variable d'environnement afin qu'il puisse être utilisé ultérieurement.

Donc dans votre cas:

pipeline {
    agent any
    stages {
        stage("foo") {
            steps {
                script {
                    env.FILENAME = readFile 'output.txt'
                }
                echo "${env.FILENAME}"
            }
        }
    }
}
41
Jon S

Selon la documentation , vous pouvez également définir des variables d'environnement globales si vous souhaitez utiliser ultérieurement la valeur de la variable dans d'autres parties de votre script. Dans votre cas, il s’agirait de le placer dans le pipeline racine:

pipeline {
  ...
  environment {
    FILENAME = readFile ...
  }
  ...
}
18
Adam Link

Nous avons contourné cela en ajoutant des fonctions à l'étape environment, c'est-à-dire:

environment {
    ENVIRONMENT_NAME = defineEnvironment() 
}
...
def defineEnvironment() {
    def branchName = "${env.BRANCH_NAME}"
    if (branchName == "master") {
        return 'staging'
    }
    else {
        return 'test'
    }
}
2
Jansky

Je ne peux pas encore commenter, mais juste un indice: utilisez des clauses try/catch pour éviter de rompre le pipeline (si vous êtes sûr que le fichier existe, ignorez)

    pipeline {
        agent any
            stages {
                stage("foo") {
                    steps {
                        script {
                            try {                    
                                env.FILENAME = readFile 'output.txt'
                                echo "${env.FILENAME}"
                            }
                            catch(Exception e) {
                                //do something i.e echo 'File not found'
                            }
                        }
                   }
    }

Autre astuce (cela a été commenté par @hao, et je pense que cela vaut la peine d'être partagé): vous voudrez peut-être couper comme ceci readFile ('output.txt'). Trim ()

1
Paulo Vinícius

Un exemple complet de pipeline scripté:

       stage('Build'){
            withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
                sh 'bash build.sh'
            }
        }
0
Qiang Li