Lazuli

らずり

PHP meets Jenkins!

f:id:app2641:20130115094304p:plain

はじめに

Jenkins。最近よく聞くよね。
継続的インテグレーションツールなんて呼ばれていて。
Jenkinsってなんだろうなー何ができるかなーなどと思いながらphpでも使えるのかなど色々調べてみた。

Jenkinsで出来ることはたくさんあるため、今回はphp開発する上でどんな風にJenkinsが利用出来るかについて簡単に書いてみたい。

継続的インテグレーションとは

とりあえず、わけわかんない。インテグレーションってなにってなる。日常で使わない単語だし。
継続的インテグレーション - Wikipediaとか見るとXPのプラクティスだとかビルドやテストを継続的に行うことだとか書いてあってそれでもなんだかよくわからん感じ。

個人的にはJenkinsをある程度使ってみて、大変大雑把に言うとcronの超絶バージョンアップ版みたいな感じが合ってると思う。あるアクションを監視して、あらかじめ設定しておいた処理を自動で走らせるのが主な使用方法になっている(もちろんそれだけじゃないよ)。監視も様々な指定方法があり、走らせる処理も様々なものを組み合わせて使える。プラグインによってあれやこれやの拡張させることも出来る。
例えば、バージョン管理システムリポジトリを監視して、変更があったらソースをチェックアウト → 結合テストを走らせる → 成功したらコンパイル → 成果物を所定の場所に保存させる。などなど。

監視もブランチを指定したりできるし、テストからカバレッジを取得したりもできるし、開発者はコミットするだけであとの作業はJenkinsが肩代わりしてやってくれるという寸法。まあ使い方は他にも色々あるだろうけど主な使い方はこのような流れになる。基本的に前段階の処理でなんらかのエラーで失敗した場合は後続の処理は実行されないため、エラーのまま処理が進むという心配をすることもない。

PHPでも使えるの?

Jenkinsに関する本とかブログ読むとJavaの情報が多い。PHPの情報もあるにはあるけど、どんなことに使えるのかいまいち分からないものもあったり。結論から言うとPHPでもJenkinsは充分有用。

先ほどの例にあったように、リポジトリを監視してテストを走らせて、ってやるだけでも充分開発の手間が省ける。テスト書いてないっていうプロジェクトでも重複コードを見つけたり、不要な変数を宣言してないかとか人間の目では見つけにくいものを見つけてくれてJenkinsは文字通り執事的な役割を担ってくれる。テスト結果やカバレッジの結果はグラフとしてJenkinsが記録していってくれるため、日々Jenkinsに処理をさせていれば、プロジェクトの進捗や問題点の見える化が可能になる
重複コードが複数あるからひとつのメソッドにまとめてしまおうとかそういうアプローチが出来るということ。

ジョブとビルド。Jenkinsの設置場所

Jenkinsにはジョブやビルドなんて言葉が出てくる。
まず、ジョブはJenkinsに登録させるアクション群のことを指す。一番最初に例にあげた、
バージョン管理システムリポジトリを監視して、変更があったらソースをチェックアウト → 結合テストを走らせる → 成功したらコンパイル → 成果物を所定の場所に保存させる」
という行為をひとつのジョブとしてJenkinsに登録をする。ジョブは他のジョブと連携させて動かすことも可能で、分割したジョブを連携させてひとつのジョブとして登録したように振る舞わせることも出来る。

次にビルド。組み込み系だと聞き慣れた単語かもしれないけど貧弱プログラマの俺なんかだとなんだそれって感じ。ビルドはあくまでJenkins的に言うとジョブを実行させることだと思ってもらえればいいんじゃないかな。Jenkinsにはビルド実行というボタンがあって、それを押すと設定していたジョブが起動させることが出来る。また、手動じゃなくても、リポジトリを監視してる中でソースの変更を感知してジョブが動き出すこともビルドということになる。ここらへんの用語は言葉の意味が途中までよく分からず使っていたから結構難儀した印象。使ってみて分かる感じかもしれない。

そして最後に、Jenkinsの設置場所について。
ネット上に出ているJenkins関係のエントリはだいたいローカル環境で起動させて使う感じで使用方法を説明していることが多いけど、実際に実務として使う場合には別途Jenkins用のサーバを立てるのがベストだと思う。社内サーバで問題ない。そもそもJenkinsの目的はローカルで行うにはリソースを喰うコンパイルなどを別サーバで自動でやろうというところから始まっている。Jenkins用のサーバを立ててリポジトリを監視させるのがいい。githubのプライベートリポジトリもJenkins用のgithub鍵を作ってやれば監視することが可能だ。

で、つまり継続的インテグレーションとは

簡単にまとめると継続的インテグレーションとは、常にプロジェクトのソース変更を監視して、テストからカバレッジを計測したり重複コードがないかなどデータ取りをして効果的に集計処理を行い、目に見える形でプロジェクトを清潔に保つことを言っているんだと思う。また、Jenkinsでは一日の開発が終わったらリポジトリを更新してビルドを行うことが推奨されている。日々ビルドを繰り返してプロジェクトを管理することが出来るツール、それが Jenkinsということになる。

Jenkinsは一度や二度ビルドしただけでは効果は感じにくいんじゃないかな。繰り返しビルドを行なっていくことでその便利さに気がつけるはず。
今回の説明はここまで。Jenkinsがどんなものかっていうのを書いたけどまた機会があったら実際の使い方とか書いてみたい。