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
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}"
}
}
}
}
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 ...
}
...
}
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'
}
}
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 ()
Un exemple complet de pipeline scripté:
stage('Build'){
withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
sh 'bash build.sh'
}
}