読者です 読者をやめる 読者になる 読者になる

.NET 開発者のための Jenkins 入門

はじめに

仕事で SubversionTrac を使っていますが、残念ながら、活用できているとは言えません。継続的インテグレーション(以下CI)?何それおいしいの?って状態。そもそも CI やるために Trac とか諸々導入したはずなんですけどね…。

CI 導入しなきゃと思い続けて結構な期間が経過しました。その間、定期的にリリースビルドを行っていたんですが、コミット忘れや修正し忘れにより、何度もビルド環境がぶっ壊される…。その度に手作業で修正してたんですが、さすがに堪忍袋の緒が切れて CI 導入を開始しました。

やりたいこと

ひとまず次ができれば OK。

  • Subversion を定期的に監視して、変更があったらビルドとテストを実行。
  • 失敗したら管理者にメールを送信する。
  • ビルドぶっ壊した人にメール送る。

CI ツールは Jenkins、ソースコード管理システムは Subversion、ビルドシステムは MSBuild を選択します。

MSBuild プラグイン導入

Jenkins から MSBuild 呼び出せるようにします。MSBuild を呼び出すバッチファイルを作成して Jenkins から呼び出してもいいけど、せっかくプラグインがあるのだし、利用させてもらいましょう。MSBuild は結構使うので、毎回バッチファイル書きたくないですし。

MSBuild プラグインの入手

ビルドサーバーはネットに繋がっていないので、あらかじめ hpi ファイルを用意しておく必要があります。自分でビルドしてもいいですが、今回はネットで検索して hpi ファイル拾ってきました。

MSBuild プラグインのインストール

[Jenkins の管理] - [プラグインの管理] - [高度な設定] を開いて、[プラグインのアップロード] のフォームで hpi ファイルをアップロードします。
f:id:griefworker:20110712105327p:image
Jenkins を再起動したらプラグインが有効になります。

MSBuild プラグインの設定

[Jenkins の管理] - [システムの設定] から、利用する MSBuild を登録します。
f:id:griefworker:20110712105330p:image
これで MSBuild プラグインの導入完了。

メール設定

ビルド失敗時にメールを送信したいので、[Jenkins の管理] - [システム設定] でSMTP サーバーの指定をします。
f:id:griefworker:20110712105325p:image
Jenkins をインストールしたサーバーが SMTP サーバーを兼ねている場合は空欄でいいです。違う場合のみ指定します。

ジョブを作成

ようやくジョブを作成します。

新規ジョブの作成

Jenkins のメニューから [新規ジョブ作成] をクリックすると、作成ページが表示されます。
名前は一覧で見たときに何をするジョブかが分かる名前を付けます。今回は Sample プロジェクトの単体テストを行うので、UnitTestSample にしておきます。
MSBuild やバッチファイルを使うので、フリースタイル・プロジェクトを選択。
f:id:griefworker:20110712105329p:image

プロジェクトのオプションを設定

Workspace は結構容量を使うんですが、Jenkins をインストールしたドライブは空きが少ないので、別のドライブを使いたい。そこで、カスタム Workspace の指定します。

[カスタム Workspace の使用] にチェックを入れ、Workspace の作成先を入力。
f:id:griefworker:20110712105328p:image
空きが十分にあるなら、この作業は不要です。

ソースコード管理システムの設定

Subversion リポジトリを指定します。
f:id:griefworker:20110712105324p:image
初めてジョブを作成される場合、リポジトリにアクセスするためのユーザー名とパスワードを聞かれるので、管理者のものを入力しておきます。

ビルド・トリガの設定

1時間おきにリポジトリの変更をチェックします。
f:id:griefworker:20110712105331p:image
スケジュールの指定方法が独特cron と同じなので、右のはてなマークをクリックして、表示されるヘルプを読むべし。

ビルドの設定

あらかじめ登録しておいた MSBuild を選択し、ビルドしたいソリューションファイルのパスを指定します。
f:id:griefworker:20110712105323p:image

ビルド後に MSTest を実行したいので、[Windows バッチファイル]を追加します。
f:id:griefworker:20110712105322p:image
テキストエリアに 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 を参照。

ビルド後の設定

ビルドに失敗したとき、ビルドを壊した人と管理者にメールを送るよう設定します。
f:id:griefworker:20110712105326p:image
あ、画像のメールアドレスはダミーです。実際は社内で使うメールアドレスを入力しています。

ジョブ保存後にビルドを実行し、成功すれば CI 導入完了です。

まとめ

リポジトリからソースコードをダウンロード→ビルド→テストが完成しました。ビルドに失敗したとき、ちゃんとメールが送られてきます。これでビルドが壊されて、リリールビルド時に発狂することも少なくなりそうです。

今回はビルドとテストを行うだけでしたが、MSTest のコードカバレッジや、FxCop のコード解析の結果をレポートとして表示すると面白そうです。MSTest のコードカバレッジVisual Studio 2010 Premium 以上が必要ですけど。

Jenkins を使えばいろいろと捗りそうです。CruiseControl.NET とかでもいいですけどね。要は、さっさと CI やればよかったってことです。