GREEにおけるJenkins, その6

こんにちは、エンジニアの岡崎(@watermint)です。
今回は、Jenkinsを運用に使うテクニックを紹介します。

JRubyとgemをgitで管理

GREEのシステムではいくつもの管理系のスクリプトがあるのですが最近岡崎が管理している管理系スクリプトはすべてRubyで書いています。実行はRubyのJava実装であるJRubyを使っています。また管理系スクリプトと一緒に、JRubyのランタイムやGEM(Rubyのパッケージ管理システム)レポジトリ一式もgitで管理しています。これの狙いは二つあります。

JRubyとGEMをgitで管理

どのSlaveでも動作する

Jenkins SlaveもJavaで動いています。ということは、JRubyを実行するのに必要となるJavaは既にある訳で、Slave側のソフトウエア構成を気にせず実行することが出来ます。OSを選ばないのも大きなメリットです。

バージョンが指定できる

すべてのサーバに同じバージョンのパッケージを入れるというのは油断をするとなかなか難しいものです。セットアップする時期によってはパッケージ配布サイトにつながらなかったり、パッケージが公開停止になっているケースもあります。git上にすべてのパッケージを登録しておくことによって、Jenkins側では単純にgitからパッケージをダウンロードして、パスを通すだけでいつでも検証済みバージョンのパッケージが使えるのでSlaveのセットアップにかかる手間が激減します。

Node.jsの再起動

最近GREEではいくつかのシステムにNode.jsを使っています。単体テストなどのためにJenkinsでNodeを起動している分にはさほど困らないのですが、テスト環境を最新にしておくようなジョブをJenkinsで作ろうとするとひとつ問題があります。
JenkinsからシェルなどでNodeを起動した場合、Jenkinsのジョブが完了した段階でNodeサーバも同時に終了してしまい、JenkinsからNodeが起動できないままになってしまいます。
このような場合はやや強引ですが次のような方法で回避しています。

  1. Nodeを実行するサーバ側に、名前付きパイプを作っておく
  2. Nodeを実行するサーバ側に、作成した名前付きパイプの内容を判断してNodeを起動したり、再起動するスクリプトを作って実行しておく
  3. Jenkinsからは作成した名前付きパイプに対して再起動などのコマンドを送る

具体的には下記のようなイメージです。

名前付きパイプの作成

mkfifo(1)を使います。パスは適当に読み替えてください。

mkfifo /somewhere/commands.txt

Nodeを再起動するスクリプト

これはRubyで書いてあるのと、node用に書いてありますがJava EEサーバなどでも何でもだいたい応用が利きます。このスクリプトをサーバ側で実行しておきます。

Jenkinsからコマンドを送る

あとはechoなどで名前付きパイプに書き込めばいいでしょう。

echo restart > /somewhere/commands

少し強引ですが、汎用的に使える方法なので似たようなお悩みがあればこんな感じでやってみてください。

それでは次回もご期待ください。