Как передать переменные из Jenkinsfile в команду shell

Я хочу использовать переменную, которую я использую внутри моей Jenkinsfile script, а затем передать его значение в выполнение сценария оболочки (либо в качестве переменной среды или параметра командной строки).

а после Jenkinsfile:

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

дает на выходе:

a
from shell i=
b
from shell i=
c
from shell i=

желаемый результат-это что-то вроде:

a
from shell i=a
b
from shell i=b
c
from shell i=c

любая идея, как передать значение i к снаряду scipt?

Edit: на основе Мэтт!--22--> ответ, теперь я использую такое решение:

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

преимущество в том, что мне не нужно избегать " в shell-скрипт.

3 ответов


ваш код использует литеральную строку, и поэтому ваша переменная Дженкинса не будет интерполирована внутри команды оболочки. Вам нужно использовать " чтобы интерполировать переменную внутри строк внутри sh. ' просто передаст литеральную строку. Поэтому нам нужно внести некоторые изменения.

первое, чтобы изменить ' to ":

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

однако теперь нам нужно избежать " на внутри:

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

кроме того, если переменная добавляется непосредственно к строке, как вы делаете выше ($i на i=), нам нужно закрыть его с некоторыми фигурными скобками:

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

это даст вам поведение, которое вы желаете.


расширение для ответа Matts: Для многострочных SH скриптов используйте

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

вместо

sh '''...'''

попробуйте это:

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