web-dev-qa-db-ja.com

jenkinsパイプラインジョブでbashスクリプトに変数を渡す

私は次のようなsetup.shというbashスクリプトで環境を構成するJenkinsパイプラインジョブを持っています。

#!/bin/bash
export Arch=$1
echo "architecture = " ${Arch}

Jenkinsパイプラインスクリプトで、setup.shスクリプトを次のように呼び出します。

def lib_Arch='linux-ubuntu-14.04-x86_64-gcc4.8.4'
sh ". /opt/setup.sh ${lib_Arch}"

残念ながら[〜#〜] no [〜#〜]変数がsetup.shスクリプトに渡され、エコー$ {Arch}が空の文字列を返すようです!私は代わりにやろうとしました:sh "source /opt/setup.sh $ {lib_Arch}"で、これも "source not found"メッセージで失敗します。また、スクリプトの最初の行を次のように変更してみました

#!/bin/sh

しかし、それは助けにはなりません。では、Jenkinsパイプラインスクリプトでbashスクリプトにパラメーターを渡すにはどうすればよいですか?ご協力いただきありがとうございます。

更新:このスレッドでBert Jan Schrijveが回避策を提案しました(以下を参照):

sh "bash -c \" source /opt/setup.sh ${lib_Arch}\"" 
8
Nabil Ghodbane

以下の例は機能します:

void updateApplicationVersionMaven(String version) {
    sh "mvn -B versions:set -DnewVersion=$version"
}

完全なパイプラインスクリプト(Jenkins 2.7.3でテスト済み):

node {
    stage('test') {
        def testVar='foo'
        sh "echo $testVar"    
    }
}

編集(コメント後):ああ、もう少しテストして、問題を再現できました。これは、「。/opt/setup.sh」を使用してスクリプトを調達しているためです。これはシェル環境に影響を及ぼし、この場合はJenkins変数インジェクションを壊します。面白い。

EDIT2(コメント後):これは、使用されているデフォルトのシェル(JenkinsまたはOSのいずれか)の問題だと思います。コメントから問題を再現でき、bashをシェルとして明示的に使用することで問題を回避できました。

def testVar='foo3'
sh "bash -c \". /var/jenkins_home/test.sh $testVar && echo \$Arch\""

最後のエコーは、引数としてスクリプトに渡され、その後スクリプトによって環境変数として設定されたtestVarの内容をエコーするようになりました。

4

トリプルアポストロフィを含む複数行のシェルスクリプトを使用している場合は、次の構文を使用する必要があります。

sh '''
 echo '''+varToPrint+'''
 other commands...
'''

https://medium.com/devopslinks/a-hacky-hackers-guide-to-hacking-together-jenkins-scripted-pipelines-part-3-aca73bd33eaa から)

2
Tony

同じ問題があり、投稿された解決策は私にとってはうまくいきませんでした。環境変数を使用してトリックを行いました:

env.someVar='someVal'
sh "echo  ${env.someVar}"
1
Frankenstein

EnvでreturnStdoutを使用することは、valをやり取りするもう1つの方法です。例は、uuidgenからの一意のIDがステージ全体で共通の外部リソースとして使用されることを示しています。

node {
    stage('stage 1') {
        env.UNIQUE = sh(returnStdout: true, script: 'uuidgen').trim()
        sh 'echo "started `date`" > /tmp/$UNIQUE'
    }
    stage('stage 2'){
        sh 'echo "done `date`" >> /tmp/$UNIQUE'
        println sh(returnStdout: true, script: 'cat /tmp/$UNIQUE').trim()
    }
}

これにより、完了した日付を示す一意のファイルに日付が出力されます。 uuidgenは、実行するたびに異なる文字列を生成します。

+ echo 'done Tue Oct 22 10:12:20 CDT 2019'
[Pipeline] sh
+ cat /tmp/d7bdb6a5-badb-474d-95dd-cf831ea88a2a
[Pipeline] echo
started Tue Oct 22 10:12:20 CDT 2019
done Tue Oct 22 10:12:20 CDT 2019
1
Peter Moore

私は別の方法で解決しました:

  1. 必要な変数を含むファイルを作成します
  2. 同じコマンドで、sourceとコマンド自体の両方を実行します。

例:

sh 'echo -n Host_IP= > Host_ip.var'
sh '/sbin/ip route|awk \'/default/ { print $3 }\' >> Host_ip.var'
sh 'source Host_ip.var && echo your ip: $Host_IP'

ファイルは、

REMOTE=172.16.0.1

出力は

your ip: 172.16.0.1

注:最後のshコマンドで一重引用符(')、ダブル(")、それ以外の場合、パイプラインは上記の変数を置き換えようとします

1
alvaro g

1.スクリプトで中括弧を削除してみてください。

export Arch=$1
echo "architecture = " $Arch

2.ジェンキンスシェルで:

def lib_Arch='linux-ubuntu-14.04-x86_64-gcc4.8.4'
sh ". /opt/setup.sh" $lib_Arch
0
humblebee