web-dev-qa-db-fra.com

Comment passer des variables de Jenkinsfile à la commande Shell

Je veux utiliser une variable que j'utilise à l'intérieur de mon script Jenkinsfile, puis passer sa valeur dans une exécution de script Shell (soit en tant que variable d'environnement ou paramètre de ligne de commande).

Mais le Jenkinsfile suivant:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh 'echo "from Shell i=$i"'
}

Donne la sortie:

a
from Shell i=
b
from Shell i=
c
from Shell i=

La sortie souhaitée est quelque chose comme:

a
from Shell i=a
b
from Shell i=b
c
from Shell i=c

Une idée comment passer la valeur de i au scipt Shell?

Edit: Basé sur Matt's réponse, j'utilise maintenant cette solution:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh "i=${i}; " + 'echo "from Shell i=$i"'
}

L'avantage est que je n'ai pas besoin d'échapper au " dans le script Shell.

14
Joe

Votre code utilise une chaîne littérale et par conséquent votre variable Jenkins ne sera pas interpolée à l'intérieur de la commande Shell. Vous devez utiliser " pour interpoler votre variable à l'intérieur de vos chaînes à l'intérieur du sh. ' passera juste une chaîne littérale. Nous devons donc apporter quelques modifications ici.

La première consiste à modifier le ' à ":

for (i in [ 'a', 'b', 'c' ]) {
  echo i
  sh "echo "from Shell i=$i""
}

Cependant, nous devons maintenant échapper au " à l'intérieur:

for (i in [ 'a', 'b', 'c' ]) {
  echo i
  sh "echo \"from Shell i=$i\""
}

De plus, si une variable est ajoutée directement à une chaîne comme vous le faites ci-dessus ($i sur i=), nous devons le fermer avec quelques accolades:

for (i in [ 'a', 'b', 'c' ]) {
  echo i
  sh "echo \"from Shell i=${i}\""
}

Cela vous donnera le comportement que vous désirez.

19
Matt Schuchard

Extension to Matts answer: Pour les scripts sh multilignes, utilisez

sh """
  echo ${paramName}
"""

au lieu de

sh '''...'''
13
TouDick

essaye ça:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh '''
    echo "from Shell i=$i"
    '''
}
1
chenchuk