Je ne trouve pas de moyen d'utiliser le BUILD_NUMBER fourni par jenkins dans un script sh. J'ai lu des réponses à des questions similaires, mais rien ne semble m'aider.
node { echo "Build number 1 $BUILD_NUMBER" // output ok stage('stage1') { echo "Build number 2 $BUILD_NUMBER" // output ok def BUILD_NUMBER = "$BUILD_NUMBER" withCredentials([sshUserPrivateKey(credentialsId: 'github-rsa-key', variable: 'RSAKEY')]) { echo "Build number 3 " + BUILD_NUMBER // output ok echo "Build number 4 $BUILD_NUMBER" // output ok // ----------------- sh 'echo $BUILD_NUMBER' // NullPointer sh "echo $BUILD_NUMBER" // NullPointer sh "echo \$BUILD_NUMBER" // NullPointer sh "echo BUILD_NUMBER" // NullPointer withEnv(["BUILD_NUMBER=BUILD_NUMBER"]) { sh "echo $BUILD_NUMBER" // NullPointer!! } env.BUILD_NUMER = "$BUILD_NUMBER" sh "echo $BUILD_NUMBER" // NullPointer sh "echo ${env.BUILD_NUMBER}" // NullPointer } } }
3 Réponses :
Voici un exemple simple qui fonctionne pour moi. Jenkins 2.164.2
Modifiez pour ajouter un script physique également: /tmp/script.sh contient ..
node { echo "Build number 1 $BUILD_NUMBER" // output ok stage('stage1') { withCredentials([string(credentialsId: 'my_password', variable: 'TOKEN')]) { sh ''' echo "Shell: Build number: $BUILD_NUMBER" ''' sh ('/tmp/script.sh') } } }
Et le travail Jenkins
node { echo "Node: Build number: $BUILD_NUMBER" stage('stage1') { echo "Stage: Build number: $BUILD_NUMBER" sh ("echo Shell: Build number: $BUILD_NUMBER") sh ("/tmp/script.sh") } }
Cet exemple utilise un bloc "withCredentials". Notez les guillemets simples, qui sont référencés ici - https://jenkins.io/doc / pipeline / steps / credentials-binding /
#!/bin/bash echo "Script: - Build number: $BUILD_NUMBER"
essayer ceci avec le bloc withCredentials ()
vous donnera l'exception groovy.lang.MissingPropertyException: Aucune propriété de ce type: BUILD_NUMBER pour la classe: groovy.lang.Binding
Essayez le dernier exemple, bien que mon bloc withCredentials ne soit pas exactement le vôtre, cela a fonctionné pour moi.
votre réponse ressemble exactement au code de la question, dites-vous simplement que cela fonctionne tel quel dans une version plus récente de jenkins? Ou pouvez-vous expliquer la différence et la solution spécifiquement dans la description, car en l'état, je ne comprends pas comment résoudre le problème.
@ justin.m.chase - Vous essayez simplement de référencer la variable de numéro de construction du travail Jenkins à partir d'un script shell appelé par le travail Jenkins? Référencez-la simplement comme une variable dans le script shell, c'est tout. Tout ce que je faisais était de publier des exemples simples qui fonctionnent pour moi, pour être utiles. Je viens d'essayer le premier exemple (les deux premiers blocs de code que j'ai écrits ci-dessus), qui est un script shell externe appelé par un travail de pipeline, et cela fonctionne.
Cela fonctionne aussi pour moi, fausse alerte. J'ai eu un autre problème dans le code qui réinitialisait accidentellement la var dans le processus et cela donnait l'impression que la var d'environnement n'était pas définie.
Il peut y avoir une approche plus idiomatique (merci de la partager si vous le savez) mais elle fonctionne si vous la définissez d'abord dans un bloc environnement
. Quelque chose comme:
stage('Show Build Number') { environment { BUILD_NUMBER = "${env.BUILD_NUMBER}" } steps { sh ''' echo "This is build $BUILD_NUMBER" ''' } }
Il y a un bon article sur code maven avec des exemples utiles.
Solution de base : enveloppe le script shell dans le bloc "" "
Running on Jenkins in /var/lib/jenkins/workspace/test-infra-env [Pipeline] { [Pipeline] echo Build number 1: 5 [Pipeline] stage [Pipeline] { (stage1) [Pipeline] echo Build number 2: 5 [Pipeline] echo Build number 3: 5 [Pipeline] echo Build number 4: 5 [Pipeline] sh + printenv JENKINS_HOME=/var/lib/jenkins MAIL=/var/mail/jenkins USER=jenkins ... ... JOB_BASE_NAME=test-infra-env BUILD_NUMBER=5 ... ... [Pipeline] sh + echo Build number in sh script: 5 Build number in sh script: 5 + echo Job base name: test-infra-env Job base name: test-infra-env [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline Finished: SUCCESS
Sortie de la console :
node { echo "Build number 1: $BUILD_NUMBER" // output ok stage('stage1') { echo "Build number 2: $BUILD_NUMBER" // output ok def BUILD_NUMBER = "$BUILD_NUMBER" echo "Build number 3: " + BUILD_NUMBER // output ok echo "Build number 4: $BUILD_NUMBER" // output ok // ----------------- sh 'printenv' sh """ echo "Build number in sh script: ${env.BUILD_NUMBER}" echo "Job base name: ${env.JOB_BASE_NAME}" """ // output ok } }
vous essayez d'imprimer le numéro de build?