web-dev-qa-db-ja.com

Jenkinsからバックグラウンドでシェルスクリプトを起動するクリーンな方法

Jenkinsからスクリプトを起動し、ビルドをハングさせず、プロセスを実行したままにする適切な方法は何ですか?私はそれを動作させることができないようです。スクリプトが実行されないか、ビルドがハングします。

ビルドの「シェルの実行」ステップbash relaunch.sh &またはrelaunch.sh > output.log &またはNohup bash relaunch.sh &を配置しても、何も起こりません。ビルドは終了しますが、プロセスは実行されません。ジェンキンスが エラーパイプを閉じる を待っていることに関連していると思います。

here のようにNohup bash relaunch.sh 2>&1 > output.logを実行すると、出力は適切にリダイレクトされますが、ビルドがハング(終了しない)し、ビルドを強制終了するとプロセスが停止します。

提案されたexport BUILD_ID=dontKillMeの追加 herehere 、および here 、「シェルの実行」ステップまたはスクリプト自体のいずれかどちらも助けません。ビルドを停止すると、ビルドがハングし、プロセスが停止します。言うまでもなく、Linuxに関する私の知識は非常に限られています。

人々はどのようにしてこれをきれいに行うのでしょうか?

21
garci560

これを実現する便利な方法は、環境変数BUILD_IDの下で変更することです。実行シェルJenkins'sProcessTreeKiller を探しています。

することにより、

BUILD_ID=dontKillMe Nohup bash relaunch.sh &

Jenkinsは、バックグラウンドジョブがビルドによって生成されないと想定し、ジョブの終了後にそれらを強制終了しません。

Joshua のおかげで、JENKINS_NODE_COOKIE

JENKINS_NODE_COOKIE=dontKillMe
26
Inian

私はまったく同じ問題を抱えていました。 Jenkins execute Shellボックスに以下を配置することでこれを修正しました。

BUILD_ID=dontKillMe ./grid.sh

&スクリプトファイル内。スクリプトは次のようになります。

#!/bin/bash
Java -jar Selenium-server-standalone-3.0.1.jar -role hub &

これが誰かの助けになることを願っています!

9
user2671131

興味深いソリューション。誰かがスクリーンを試しましたか?

実行方法は次のとおりです(ModelSim-ASEを使用したRTLシミュレーションの場合)。

screen -S $testname -d -m -L bash -c 'cd build_sim ; make; make sim'
echo Waiting for simulator ...

次に、screenlog.0を見て、シミュレーターが待機状態になるのを待ちます。

until ((`fgrep -c 'Ready for simulation' screenlog.0`)) ;do
    sleep 1
done

次に、シミュレーションを必要とする他のジョブの実行が完了すると(またはJenkinsが失敗を検出すると)、ポストで次を実行します。

screen -S $testname -X kill

唯一の注意点は、ジョブがクリーンアップされる前にJenkinsが何らかの理由で死亡した場合、理論的には、何かが起こるのを待っている間にシミュレーターがリソースを噛み砕くことができるということです。

少し分解するには:画面では、「-S」はセッションにタイトルを割り当てます(またはそのタイトルで実行中のセッションをアドレス指定します)、「-d」は切り離されて実行され、「-m」は最初にフォークを生成します( Jenkins用心深い目)、および-Lはロギングをオンにします(これは、シミュレーターで何かが壊れた場合にも便利です-出力にログファイルアーティファクトがあります)。残りは、スクリーンセッション内の単純なbashです。

1
GrueMaster