2014年5月27日火曜日

Jenkinsでnohupなジョブを作成する方法

所謂、並列処理をJenkinsで行う場合の設定例です
自分の場合は負荷テスト用のジョブを作成したかったのでそれをケースとして紹介します

また今回はシェルスクリプトを使ったテストを想定して並列テストを実施しました

■単一のジョブによる並列処理の実装
まずは非同期処理を実行することができるシェルスクリプトのジョブの設定から
for j in `seq 1 400`
do
  echo "nohup process ${j}"
  nohup sh sampleMulti.sh &
done

sleep 60;
これは400回ループをしsampleMulti.shをバックグラウンド実行させるジョブです
sampleMulti.shの処理にもよりますが最大で400プロセスが同時にバックグランドで動作します

ポイントは最後に「sleep 60;」を入れている部分

基本的にJenkinsは1つのジョブに対して1つのスレッドが動作します
なので1つのジョブ内でマルチプロセスな処理を実行させることはできないのですが
上記のように強制的にマルチプロセスを立ち上げると裏側では複数のシェルプロセスがちゃんと立ち上がります

なんですが、実はsleepを入れないでしまうとジョブを実行しているメインスレッドがforループを抜けたあとに即終了してしまいます
当たり前ですが、子プロセス(ループ内のシェルプロセス)を生成する親プロセス(ジョブ自信のスレッド)が
終了してしまうといくら実行中の子プロセスが存在していても子プロセスを強制的にkillしてしまいます

なので子プロセスの400のシェルがすべて完了するまで親プロセスのジョブは処理を待つ必要があります
普通マルチスレッドプログラミングをするときには「wait」みたいな関数が用意されており子プロセスの終了を
待ってから親プロセスを終了しますが、今回はその辺の実装を全部スルーして「子プロセスは60秒経てばすべて終了する」
という(良くなく)保証を基にジョブの設定をしています

sleepではなくwaitコマンドを使うことでシェルスクロプトでもマルチスレッドプログラム的なことをできそうなので
ちゃんと実装したい場合には軽く調べれば実装できると思います

■複数のジョブによる並列処理の実装
「sh sampleMulti.sh」を10並列、同時実行するジョブの設定を考えます

単純に「sh sampleMulti.sh」を実行するジョブを10個作成します
10個のジョブを(ほぼ)同時に実行するために「Build Pipeline Plugin」をインストールします

そして同時実行をトリガーにするためのジョブを1つ作成し、そのジョブの「ビルド後の処理の追加」で「他のプロジェクトのビルド」を設定します
設定するジョブは同時並行するジョブ10個を追加します
ジョブはカンマ区切りで指定できます
同一名称のジョブを指定しても1つのジョブとして扱われるので並列実行するジョブ名はすべて別名にしてください

最後に新規ビューで「Build Pipeline View」を作成し、トリガー用として作成したジョブを指定してビューを作成すればOKです
最終的なイメージは以下のようになります





これでトリガー用のジョブをキックすればそのあとで10個のジョブが同時並行されます

ちょっと説明が文字ばかりになってしまいわかりづらい点が多かったかもしれません。。すいません。。
どちらも長所短所がありそうですが、個人的には単一のジョブで実施するほうがいいかなと思います
理由としては単純にジョブの数が少なくて済むからです(後者は並列実行される数だけジョブを作成する必要があるのでダッシュボードがカオスになりそうだからです)

他にもやりかたはあるかと思いますので参考程度に見ていただければ幸いです

0 件のコメント:

コメントを投稿