はじめに
仕事で Subversion と Trac を使っていますが、残念ながら、活用できているとは言えません。継続的インテグレーション(以下CI)?何それおいしいの?って状態。そもそも CI やるために Trac とか諸々導入したはずなんですけどね…。
CI 導入しなきゃと思い続けて結構な期間が経過しました。その間、定期的にリリースビルドを行っていたんですが、コミット忘れや修正し忘れにより、何度もビルド環境がぶっ壊される…。その度に手作業で修正してたんですが、さすがに堪忍袋の緒が切れて CI 導入を開始しました。
やりたいこと
ひとまず次ができれば OK。
- Subversion を定期的に監視して、変更があったらビルドとテストを実行。
- 失敗したら管理者にメールを送信する。
- ビルドぶっ壊した人にメール送る。
CI ツールは Jenkins、ソースコード管理システムは Subversion、ビルドシステムは MSBuild を選択します。
Jenkins の導入
Jenkins と Subversion は Trac Lightning でインストール。Trac 月から Trac Lightning へのアップグレードになったので、かなり苦労しました。興味がある方は下記の記事を読んでください。
MSBuild プラグイン導入
Jenkins から MSBuild 呼び出せるようにします。MSBuild を呼び出すバッチファイルを作成して Jenkins から呼び出してもいいけど、せっかくプラグインがあるのだし、利用させてもらいましょう。MSBuild は結構使うので、毎回バッチファイル書きたくないですし。
MSBuild プラグインの入手
ビルドサーバーはネットに繋がっていないので、あらかじめ hpi ファイルを用意しておく必要があります。自分でビルドしてもいいですが、今回はネットで検索して hpi ファイル拾ってきました。
メール設定
ビルド失敗時にメールを送信したいので、[Jenkins の管理] - [システム設定] でSMTP サーバーの指定をします。
Jenkins をインストールしたサーバーが SMTP サーバーを兼ねている場合は空欄でいいです。違う場合のみ指定します。
ジョブを作成
ようやくジョブを作成します。
新規ジョブの作成
Jenkins のメニューから [新規ジョブ作成] をクリックすると、作成ページが表示されます。
名前は一覧で見たときに何をするジョブかが分かる名前を付けます。今回は Sample プロジェクトの単体テストを行うので、UnitTestSample にしておきます。
MSBuild やバッチファイルを使うので、フリースタイル・プロジェクトを選択。
プロジェクトのオプションを設定
Workspace は結構容量を使うんですが、Jenkins をインストールしたドライブは空きが少ないので、別のドライブを使いたい。そこで、カスタム Workspace の指定します。
[カスタム Workspace の使用] にチェックを入れ、Workspace の作成先を入力。
空きが十分にあるなら、この作業は不要です。
ソースコード管理システムの設定
Subversion リポジトリを指定します。
初めてジョブを作成される場合、リポジトリにアクセスするためのユーザー名とパスワードを聞かれるので、管理者のものを入力しておきます。
ビルドの設定
あらかじめ登録しておいた MSBuild を選択し、ビルドしたいソリューションファイルのパスを指定します。
ビルド後に MSTest を実行したいので、[Windows バッチファイル]を追加します。
テキストエリアに MSTest を呼び出す下記のコマンドを入力。
rmdir /S /Q TestResults mkdir TestResults "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe" /testcontainer:"SampleTest.dll" /resultsfile:TestResults\TestResults.trx
上記でやっていることは、MSTest にテストプロジェクトの dll を引数として渡しているだけです。
MSTest の使い方は MSDN を参照。
まとめ
リポジトリからソースコードをダウンロード→ビルド→テストが完成しました。ビルドに失敗したとき、ちゃんとメールが送られてきます。これでビルドが壊されて、リリールビルド時に発狂することも少なくなりそうです。
今回はビルドとテストを行うだけでしたが、MSTest のコードカバレッジや、FxCop のコード解析の結果をレポートとして表示すると面白そうです。MSTest のコードカバレッジは Visual Studio 2010 Premium 以上が必要ですけど。
Jenkins を使えばいろいろと捗りそうです。CruiseControl.NET とかでもいいですけどね。要は、さっさと CI やればよかったってことです。