webentwicklung-frage-antwort-db.com.de

So übergeben Sie Variablen von Jenkinsfile an den Shell-Befehl

Ich möchte eine Variable verwenden, die ich in meinem Jenkinsfile -Skript verwende, und dann ihren Wert an eine Shell-Skriptausführung übergeben (entweder als Umgebungsvariable oder als Befehlszeilenparameter).

Aber die folgenden Jenkinsfile:

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

Gibt die Ausgabe aus:

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

Gewünschte Ausgabe ist so etwas wie:

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

Irgendeine Idee, wie der Wert von i an den Shell-Scipt übergeben wird?

Bearbeiten: Basierend auf Matts Antwort verwende ich jetzt diese Lösung:

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

Der Vorteil ist, dass ich das " Im Shell-Skript nicht entziehen muss.

14
Joe

Ihr Code verwendet eine Literalzeichenfolge und daher wird Ihre Jenkins-Variable im Shell-Befehl nicht interpoliert. Sie müssen " Verwenden, um Ihre Variable innerhalb Ihrer Zeichenfolgen innerhalb von sh zu interpolieren. ' Übergibt nur eine wörtliche Zeichenfolge. Wir müssen hier also einige Änderungen vornehmen.

Das erste ist, den ' In " Zu ändern:

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

Nun müssen wir uns jedoch dem " Im Inneren entziehen:

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

Wenn eine Variable wie oben beschrieben direkt an eine Zeichenfolge angehängt wird ($i In i=), Müssen wir sie mit geschweiften Klammern abschließen:

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

Das bringt dir das Verhalten, das du dir wünschst.

19
Matt Schuchard

Erweiterung zu Matts Antwort: Für mehrzeilige sh-Skripte verwenden

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

anstatt von

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

versuche dies:

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