3
votes

Utilisation de la variable d'environnement Jenkins dans le script Pipeline SH

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
        }
    }
}


1 commentaires

vous essayez d'imprimer le numéro de build?


3 Réponses :


2
votes

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"


5 commentaires

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.



1
votes

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.


0 commentaires

0
votes

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
    }
}


0 commentaires