Yasuo's Notebook

ソフトウェア開発の話題が中心の備忘録です。

TFSのビルドプロセスにOpenCoverのカバレッジ計測を組み込む(後半)

前回、TFSでビルドされたアセンブリをOpenCoverでカバレッジ計測するためのバッチファイルを作成するところまで紹介しました。
今回は、このバッチファイルをTFSのビルドの中で実行するための設定方法を紹介します。

TFSのビルド定義のプロセスのところに、ビルドプロセスを定義したxamlの設定があります。
デフォルトでは「既定テンプレート(DefaultTemplete.xaml)」になっています。
このxamlを編集することでビルドプロセスをカスタマイズすることができます。

f:id:yasuo99:20120102010603j:plain


新規作成ボタンを押すと既存のビルドプロセステンプレートを元に新しいテンプレートを作成することができます。
ここでは「OpenCoverSampleBuildTemplete.xaml」を既定テンプレートを元に作成します。

f:id:yasuo99:20120102010608j:plain

VS2010のチームエクスプローラでTFSソース管理のBuildProcessTempletesの
フォルダに作成したOpenCoverSampleBuildTemplete.xamlが表示されていることを確認します。
OpenCoverSampleBuildTemplete.xamlの最新バージョンを取得して、編集用にチェックアウトします。
ソース管理に表示されているOpenCoverSampleBuildTemplete.xamlをクリックするとビルドプロセステンプレートの編集画面が表示されます。

f:id:yasuo99:20120102011003j:plain

この編集画面では、GUIでプロセスを編集することができます。コンパイルとテストというブロックがあります。このブロックでは、文字通り、コンパイルとテストを実行していますので、このブロックの最後にカバレッジ計測のバッチファイルの実行を加えることにしましょう。

ツールボックスからInvoekeProcessを選択し、追加したい場所にドロップします。InvoekeProcessのプロパティは、以下のように設定します。

DisplayName OpenCoverの実行
FileName バッチファイルのフルパス名

f:id:yasuo99:20120102011013j:plain

これでビルド実行時にバッチファイルが実行されるようになりますが、
実はこのままではOpenCoverのカバレッジ結果がうまく出力されません。

OpenCoverのregisterオプションの説明に以下のようなことが書いてあります。

  • register[:user] - dynamically register the profiler, use "user" if current user does not have admin rights. Alternatively preregister the profiler using regsvr32.exe

バッチファイルをコマンドプロンプトから自分で実行するのとTFSが実行するのとでは、実行ユーザが異なります。
TFSの実行ユーザ(SYSTEM)の場合は「:user」を付けずに単に-registerのみとすれば、大丈夫です。

最後の仕上げは、最終的にTFSがビルド結果を配置する共有フォルダにカバレッジレポートを配置することです。
これもビルドプロセステンプレートの変更で実現することができます。
CopyDirectoryというコマンドがツールボックスにあるのでこれを使いましょう。
場所は、ビルド結果が配置されるよりも後ろで確実に実行される場所に挿入すると良いでしょう。
今回は「エージェントで実行」の末尾に追加しました。
CopyDirectoryのプロパティは以下のように設定しました。

Destination BuildDetail.DropLocation + "\coverage"
Source レポート出力先ディレクトリのフルパス(私の環境では"C:\Tools\ReportGenerator_1.2.3.0\html")

f:id:yasuo99:20120102011019j:plain

ビルドプロセステンプレートを保存したらソース管理でチェックインを忘れずにしましょう。
そのあと、ビルドキューにビルドを配置します。
うまくいくとビルド結果のディレクトリにcoverageというフォルダが生成されていて、カバレッジレポートが格納されているはずです。
TFSでフリーのカバレッジ計測ツールを連携させる例として、参考にしていただければ幸いです。