web-dev-qa-db-ja.com

Jenkinsfileからシェルコマンドに変数を渡す方法

Jenkinsfileスクリプト内で使用している変数を使用し、その値を(環境変数またはコマンドラインパラメーターとして)シェルスクリプトの実行に渡します。

ただし、次の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の値をShell sciptに渡す方法はありますか?

Edit:Matt's answerに基づいて、このソリューションを使用します:

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

利点は、シェルスクリプトで"をエスケープする必要がないことです。

14
Joe

コードはリテラル文字列を使用しているため、Jenkins変数はShellコマンド内で補間されません。 "を使用して、sh内の文字列内の変数を補間する必要があります。 'は、リテラル文字列を渡すだけです。したがって、ここでいくつかの変更を行う必要があります。

1つ目は、'"に変更することです。

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

それはあなたが望む行動を取得します。

19
Matt Schuchard

Mattsの回答の拡張:複数行のshスクリプトの使用

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

の代わりに

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

これを試して:

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