2015-09-17 8 views
5

Jenkins verを使用して、マスター/スレーブ構成で2台のRHELマシンをセットアップしました。 1.609.2スレーブのSetupPluginを使ってスレーブのPATHに追加するには?

スレーブはSSHスレーブプラグイン1.10を介して起動されています。

私はSlave Setup Plugin v1.9を使用して、スレーブマシンがビルドを実行するために必要なツールをインストールしようとしています。特に私はsqlplusをインストールしています。ここで

私はSQLPLUSをインストールしてみてくださいするために実行していますスクリプトです:

if command -v sqlplus >/dev/null; then 
    echo "sqlplus already setup. Nothing to do." 
else 
    #Create directory for sqlplus and unzip it there. 
    mkdir /jenkins/tools/sqlplus 
    tar -xvf sqlplussetup/instantclient-basiclite-linux.x64-12.1.0.2.0.tar.gz -C /jenkins/tools/sqlplus || { echo 'unzip failed' ; exit 1; } 
    tar -xvf sqlplussetup/instantclient-sqlplus-linux.x64-12.1.0.2.0.tar.gz -C /jenkins/tools/sqlplus || { echo 'unzip failed' ; exit 1; } 

    cd /jenkins/tools/sqlplus/instantclient_12_1 

    #Create links for the Oracle libs 
    ln -s libclntsh.so.12.1 libclntsh.so || { echo 'Could not create link' ; exit 1; } 
    ln -s libocci.so.12.1 libocci.so || { echo 'Could not create link' ; exit 1; } 

    #Add two lines to .bashrc only if they don't already exist. Export LD_LIBRARY_PATH and add sqlplus to PATH. 
    grep -q -F 'export LD_LIBRARY_PATH=/jenkins/tools/sqlplus/instantclient_12_1:$LD_LIBRARY_PATH' /home/jenkins/.bashrc || echo 'export LD_LIBRARY_PATH=/jenkins/tools/sqlplus/instantclient_12_1:$LD_LIBRARY_PATH' >> /home/jenkins/.bashrc 
    grep -q -F 'export PATH=$PATH:/jenkins/tools/sqlplus/instantclient_12_1' /home/jenkins/.bashrc || echo 'export PATH=$PATH:/jenkins/tools/sqlplus/instantclient_12_1' >> /home/jenkins/.bashrc 

    #Export variables so they can be used right away 
    export LD_LIBRARY_PATH=/jenkins/tools/sqlplus/instantclient_12_1:$LD_LIBRARY_PATH 
    export PATH=$PATH:/jenkins/tools/sqlplus/instantclient_12_1 

    echo "sqlplus has been setup." 
fi 

このスクリプトは正常に実行され、すべてが私がビルドを実行してsqlplusコマンドを実行しようとするまで動作しているように見えます。 sqlplusは認識されたコマンドではないため、ビルドに失敗します。

私の主な質問はこれです スレーブを起動するときに環境変数を自動的に追加する適切な方法は何ですか?

私は自動の方法を探しています。スレーブの設定画面に入り、チェックボックスにチェックを入れ、環境変数を指定したくありません。これは、私が達成しようとしていることに対して逆効果的です。スレーブは、いったん接続するとすぐに使用できるスレーブです。


私のスクリプトがうまくいかない理由はかなりわかります。ジェンキンスは、スレーブを起動しているとき、それは最初のSSH接続を行い、それがhudson8035138410767957141.shの内容は上から私のスクリプトでコマンド

/bin/sh -xe /jenkins/tmp/hudson8035138410767957141.sh 

を使用して、私のセットアップスクリプトを実行します。だから明らかに、exportisn't going to work。私は.bashrcファイルへのエクスポートを追加することがこれを回避することを望んでいたが、うまくいきませんでした。 I これは、このスクリプトはssh接続が確立された後に実行され、したがって.bashrcがすでに読み込まれているためです。

問題この制限を回避する方法はありません。

+0

実際のジョブを実行する前に変数を設定するにはhttps://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Pluginを使用します。インストールに関するいくつかの規則に従えば、これが役に立ちます。 – Jayan

答えて

1

Bashは、--loginオプションが明示的に設定されていない非中核シェルの起動ファイル(.bashrc.profileなど)を読み込みません。そのため、エクスポートが機能しません。

ので、解決策「」上で明示的なシェバングをあなたは上記の示唆bashrcにマジックを保つために、そして

#!/bin/bash --login 

<your script here> 

にビルドステップで最初の行を変更することにより、--loginオプションを追加することです最初の行は、デフォルトの-xオプション(上記のコンソールスニペットを参照)から得られる過剰なデバッグ出力も防ぎます。

代替ソリューション「B」は、名前が$BASH_ENV(その変数が定義されていてファイルが存在する場合)で指定されたスクリプトをソースとして使用します。その変数をスレーブプロパティでグローバルに定義する(たとえば、/jenkins/tools/setup.shに設定)、スレーブ設定中に必要に応じてエクスポートを追加する。すべてのbashシェルビルドステップで設定が読み込まれます。

ソリューション "B"では、--loginオプションを使用する必要はなく、.bashrcを台無しにする必要はありません。しかし、 "BASH_ENV"機能は、bashが "bashモード"で動作しているときのみ有効です。 Jenkinsがshでシェルを起動すると、bashはその機能を持たない歴史的なshをエミュレートしようとします。

#!/bin/bash 

<your script here> 

しかし、あなたは、生産のセットアップに通常あまりだトレース出力を取り除くために、とにかく必要があるだろうこと:だから、またBのために、あなたはシェバングを必要としています。

+0

私はあなたの解決策 "B"が好きです。私が正しく理解していれば、 '$ BASH_ENV'スクリプトの中で' PATH'と 'LD_LIBRARY_PATH'を' export 'したら、それらはビルドステップ全体に残っていますか?残念ながら、私はもはやこれを必要とするプロジェクトに取り組んでいないので、実際にテストすることはできません。 – FGreg

+0

はい。 '$ BASH_ENV'のコマンド/エクスポートは、bashの起動時に読み込まれ、シェルセッション全体で持続されます。対話型ログインシェルの' .bashrc 'などに追加する文とまったく同じです。 –

関連する問題