スマートフォン向けの Web アプリのデバッグは Google Chrome のデベロッパーツールでユーザーエージェントを変更して行うのが簡単

Rails アプリのスマートフォン対応に jpmobile を使ってみたけど、スマートフォンでアクセスしたかどうかを自動で判断してビューを切り替えてくれる機能は超便利。ただ、スマートフォンでの表示を確認したい場合に困った。

表示を確認するためだけにサーバーにデプロイなんてしたくないし、かといってスマートフォンエミュレータをインストールするのは面倒。Web ブラウザのユーザーエージェントを変更すれば表示できそうだけど…。

Google Chrome でユーザーエージェントを変更するための拡張を探してみたところ、なんと、デベロッパーツールでユーザーエージェントでできることが判明した。手順をメモしておく。

  1. Google Chromeデベロッパーツールを起動する
  2. デベロッパーツール右下の設定ボタンをクリックする
  3. User Agent タブを選択
  4. Override User Agent にチェックを入れる
  5. ドロップダウンリストの中から目的のブラウザのものを選択

上記の手順を行うとスマートフォン用のビューが表示された。画面の幅も変更されている。これで手軽に jpmobile での表示をチェックできそうだ。

Bitbucket が Git に対応したので Mercurial にサヨナラする

GitHub の Mercurial 版と勝手に位置付けていた Bitbucket が Git に対応しました。

私にとってこれは大きなニュース。

Google Code が Git に対応したときは「ようやくか」と思って驚かなかったんですけど、今回は驚いた。まさか Bitbucket まで対応するとは思わなかったです。エイプリルフールのネタにしたくらいでしたし。GitHub の Mercurial 版というスタンスで行くものと勝手に思い込んでいました。これで Git が使えるメジャーなホスティングサービスが増えましたね。

私は、オープンソースのアプリやライブラリは GitHub、Web サービスのソースは Bitbucket、という風にサービスを使い分けています。使い分けてる理由は当然、Bitbucket は無料でプライベートリポジトリを何個も作れるから。ツールも Git と Mercurial を併用してきました。本当はどちらか片方にしたかったんですけど、hg-git と git-hg がイマイチで断念。

そもそも、私が Mercurial を使っていたのは Bitbucket があったからで、Bitbucket が Git に対応したから Mercurial を使う理由がなくなってしまいました。心おきなく Git に一本化できます。Mercurial の使い道はソースコードのダウンロードだけになりそう。

「Git も使える」という理由で GitHub から Bitbucket に全部移行する人は少ないと思うけど、プライベートリポジトリ目当ての併用は増えそうです。私みたいな、ね。

Jenkins の WebSocketNotifier プラグインの Windows クライアントを作ってみた

ちょっと前(?)に仕事で Jenkins を導入したとき、Jenkins でビルド失敗時にチーム全員にメールを送るように設定してみました。しかし、誰もメールを見ている気配がない…。まぁ、メーラー起動するの面倒だし仕方ないかな。私もメール見てないし。


ビルド結果の通知は、メールじゃなくて他の方法がよさそうです。そこで目を付けたのが Jenkins の WebSocketNotifier プラグイン。

これでビルド結果を通知し、それをポップアップかなんかで表示すればいいかも。WebSocketNotifer プラグインに対応した Chrome エクステンションがあるみたいですけど、残念ながらうちでは Chrome が使えません。IE マンセー。そもそも、ブラウザ起動しっぱなしの人ってうちにはほとんどいないから無意味か。


仕方ないので、C# で WebSocketNotifier プラグインのクライアントを作成してみました。

最初 WPF で作ろうと思ったんですが、タスクトレイに常駐したり NotifyIcon を使うには WinForms のアセンブリが必要。なら WinForms でいいよね、ってことで久しぶりに WinForms で作成しました。WebSocketClient を一から自作するのは面倒だったので、GitHub で公開されているものを拝借しています。


使い方は簡単。初回起動時に設定ダイアログが表示されるので、WebSocket サーバーの URL を指定するだけ。
f:id:griefworker:20110928194103p:image
WebSocketNotifier はビルドの成功・失敗関係なく通知してくるので、失敗時のみ表示するオプションをつけてみました。ちなみにこの設定ダイアログは、タスクトレイのアイコンを右クリックすると表示されるメニューから表示できます。実際の通知は下図の通り。
f:id:griefworker:20110928194148j:image
結構いい感じ。

Subversion のコミットログのメッセージを編集できるようにする手順メモ

仕事ではソースコードのバージョン管理に Subversion を使っているんですが、「コミットメッセージが編集できないぞゴルァ」というお言葉を頂いたので、編集できるように設定してみました。ちなみに、SubversionTrac Lightning でインストールしたやつです。


ログを変更しようとしたとき、下記のフックが実行されます。

<TracLightRoot>/projects/svn/<プロジェクト名>/hooks/pre-revprop-change.bat

エディタでこいつを開いてみると

rem [1] REPOS-PATH   (the path to this repository)
rem [2] REVISION     (the revision being tweaked)
rem [3] USER         (the username of the person tweaking the property)
rem [4] PROPNAME     (the property being set on the revision)
rem [STDIN] PROPVAL  ** the property value is passed via STDIN.
if "%4"=="svn:log" (
  if "%3"=="admin" (
    exit 0
  )
)
exit 1

と書いてあります。admin ユーザーだけがログを編集可能になっていました。


ログは誰でも編集可能にしたいので、admin ユーザーかどうかチェックしている箇所を削除。

rem [1] REPOS-PATH   (the path to this repository)
rem [2] REVISION     (the revision being tweaked)
rem [3] USER         (the username of the person tweaking the property)
rem [4] PROPNAME     (the property being set on the revision)
rem [STDIN] PROPVAL  ** the property value is passed via STDIN.
if "%4"=="svn:log" (
  exit 0
)
exit 1

あとは、TortoiseSVN から好きなだけコミットログを編集すればいいです。

Jenkins で Visual Studio のコード分析結果を表示する方法

はじめに

先日、Jenkins でテスト結果やコードカバレッジを表示できるようにしました。

これで終了と思いきや、「コード分析の結果も表示して」との要望が。


まぁ、Visual Studio 2010 Premium Edition のライセンスは開発者全員分無いし(というか数個だけ)、FxCop 使うために利用許可を申請するのも面倒なので、ビルドサーバーでコード分析して表示するようにしましょうかね。

Visual Studio での設定

プロジェクトをビルド時に、自動でコード解析が実行されるように設定します。

プロジェクトのプロパティを開いて、一番下のコード分析を選択。自動でコード解析するにチェックをつけます。
f:id:griefworker:20110728141658p:image
これで、ビルドしたときにコード分析が実行されるようになります。分析結果は、アセンブリ出力先と同じディレクトリに、<アセンブリ名>.CodeAnalysisLog.xml というファイル名で出力されます。

Jenkins 側の設定

コード分析結果の表示には、Violations プラグインを使います。Violations プラグインは Trac Lightning で Jenkins をインストールしたら、すでに入っていました。

コード解析結果を表示したいプロジェクトの設定を開いて、Violations の設定をします。

Visual Studio のコード分析結果は FxCop 形式なので、FxCop のところに分析結果ファイルのパスを指定します。ちなみにワークスペースからの相対パスです。
f:id:griefworker:20110728141751p:image
分析結果ファイルは複数あるので、その全てを表示するためにファイルのパターンを指定しています。

これで設定完了

ビルドを実行し成功すると、Jenkins のプロジェクトのページにコード分析のレポートが表示されるようになります。
f:id:griefworker:20110728141806p:image
テスト結果にコードカバレッジに、コード分析結果。これだけ表示すれば十分でしょ。

Jenkins で MSTest の結果とコードカバレッジを表示する方法

はじめに

Jenkins で .NET ソリューションのビルドとテストが出来るようになりました。これだけでも便利ですけど、欲を言えばテスト結果を Jenkins 上に表示したい。あと、コードカバレッジのレポートも表示できると、いろいろ捗りそうです。

ということで、テスト結果とコードカバレッジを Jenkins で表示することに挑戦しました。ちなみに Visual Studio 2010 のコードカバレッジ機能は Premium 以上のエディションで利用できます。

今回の作業は、次の記事を参考にしました。

そのままでは上手く動かないので、やったことをまとめておきます。

Visual Studio ソリューションの設定

テストプロジェクトが既に作成されていることを前提に進めていきます。

コードカバレッジの有効化

まず、テストプロジェクトを含むソリューションを開き、拡張子が .testsettings ファイルを開きます。ここでは Local.testsettings を選択。ソリューションに無い場合は、[追加] - [新しい項目(W)...] から [テストの設定] を選んで、ファイルを追加して下さい。
f:id:griefworker:20110726203055p:image

[テストの設定] ダイアログが表示されるので、[データと診断] を選択し、右下のリストに表示されている [コードカバレッジ] にチェックをつけます。
f:id:griefworker:20110726203056p:image

コードカバレッジを診断するアセンブリの指定

次に、リストの上にある [構成] ボタンをクリックすると、[コードカバレッジの詳細」ダイアログが表示されます。
f:id:griefworker:20110726205320p:image
カバレッジを測定するアセンブリにチェックをつけて、OK をクリック。[テストの設定]ダイアログに戻ったら、いったん、[適用] ボタンをクリックして設定を保存しておくといいです。

テスト結果出力先の固定

MSTest を実行して生成されるファイルやフォルダは、初期設定のままだと、名前にタイムスタンプがついてしまいます。タイムスタンプがついていると Jenkins で設定するのが面倒になるので、名前を固定しておきます。

[全般] を表示し、[ユーザー定義されたスキーム] を選択します。テスト結果が出力されるフォルダの名前を固定するために、下図のように入力。
f:id:griefworker:20110727161151p:image

これで Visual Studio での設定は終了

テストを実行すればコードカバレッジも測定されます。設定した後、ちゃんとコードカバレッジが出力されるかを試しておくといいです。

コードカバレッジのデータは

<ソリューションディレクトリ>/TestResults/TestResult/In/<コンピュータ名>/data.coverage

に出力されます。


Jenkins にプラグインを導入

MSTest の結果を Jenkins に表示するために、MSTest プラグインを導入します。

コードカバレッジは Emma 形式に変換して表示するので、Emma プラグインが必要です。Trac Lightning で Jenkins をインストールしたので、最初から入っていました。

Jenkins の設定

ここから Jenkins の設定です。ビルドを行うための新規ジョブを作成します。

Subversion リポジトリを指定

Subversion リポジトリからソースコードをチェックアウトし、テストや診断を実行します。
f:id:griefworker:20110726220209p:image

MSBuild でテストプロジェクトを含むソリューションをビルド

MSBuild でソリューションをビルドします。
f:id:griefworker:20110726220210p:image
MSBuild の設定方法は、次の記事を参考にしてください。

MSTest を実行

ビルドに [Windowsバッチコマンドの実行] を追加し、次のコマンドを記述します。

::過去の結果があれば削除
rmdir /S /Q TestResults
mkdir TestResults

::テスト実行
"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe" /testsettings:Local.testsettings /resultsfile:TestResults\TestResult.trx /testcontainer:"Sample.Test\bin\Debug\Sample.Test.dll"

テスト対象の DLL が増えてきたら、MSBuild 用ビルドファイルを作成した方がいいかも。

出力されたカバレッジデータを XML に変換

まず、ソリューションフォルダ直下に GenerateCoverage.build というビルドファイルを作成します。中身は下記の通り。

<Project ToolsVersion="3.5" DefaultTargets="Coverage" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!--Jenkins ジョブのワークスペースディレクトリ-->
    <WorkspacePath>F:\Sample</WorkspacePath>

    <!--カスタムタスクのアセンブリのパス-->
    <TaskAssemblyPath>$(WorkspacePath)\CI.MSBuild.Tasks\CI.MSBuild.Tasks.dll</TaskAssemblyPath>

    <!--変換対象のファイル-->
    <CoverageFilePath>$(WorkspacePath)\TestResults\TestResult\In\$(ComputerName)\data.coverage</CoverageFilePath>

    <!--出力先-->
    <OutputDirPath>$(WorkspacePath)\TestResults\TestResult\Out</OutputDirPath>
  </PropertyGroup>

  <UsingTask TaskName="ConvertVSCoverageToXml"
             AssemblyFile="$(TaskAssemblyPath)" />

  <Target Name="Coverage">
    <Message Text="Processing code coverage results..." />
    <ConvertVSCoverageToXml CoverageFiles="$(CoverageFilePath)"
                            SymbolsDirectory="$(OutputDirPath)" />
  </Target>
</Project>

このビルドファイルで使っているカスタムタスクは、下記 URL から入手できます。

このビルドファイルを MSBuild で実行するように、Jenkins にビルド項目を追加します。
f:id:griefworker:20110727140507p:image

さらに Emma 形式に変換

Emma プラグインで読み込めるように、XSL 変換するビルドファイルを作成します。

<Project ToolsVersion="3.5" DefaultTargets="Convert" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!--MSXSL のパス-->
    <MsXslPath>"C:\Program Files\MSXsl\msxsl.exe"</MsXslPath>

    <!--Jenkins ジョブのワークスペースディレクトリ-->
    <WorkspacePath>F:\Sample</WorkspacePath>

    <!--変換意使う XSL ファイルのパス-->
    <XslFilePath>$(WorkspacePath)\MSTestCoverageToEmma.xsl</XslFilePath>

    <!--カバレッジデータ(XML)のパス-->
    <CoverageFilePath>$(WorkspacePath)\TestResults\TestResult\In\$(ComputerName)\data.xml</CoverageFilePath>

    <!--Emma に変換したカバレッジデータの出力先-->
    <OutputFilePath>$(WorkspacePath)\coverage.xml</OutputFilePath>
  </PropertyGroup>

  <Target Name="Convert">
    <Exec Command="$(MsXslPath) $(CoverageFilePath) $(XslFilePath) -o $(OutputFilePath)" />
  </Target>
</Project>

上記の内容を ConvertToEmma.build という名前で、ソリューションフォルダ直下に保存。

使用している XSL ファイルは下記 URL から入手できます。

実行には MSXML と MSXSL が必要です。MSXML はすでにインストールされていたので、MSXSL をダウンロードして適当な場所にインストールします。

このビルドファイルも、MSBuild で実行するよう、Jenkins に追加します。
f:id:griefworker:20110726221101p:image

Jenkis でコードカバレッジを表示

まず、[Emmaカバレッジレポートの記録] にチェックを付け、先ほどのビルドファイルで出力される XML ファイルのパスを指定します。
f:id:griefworker:20110726222000p:image

次に、[Publish MSTest test result reposrt] にチェックを付け、MSTest で出力される拡張子 TRX のファイルを指定します。
f:id:griefworker:20110726222001p:image

これで完了

Jenkins のジョブを実行し、成功すれば、テスト結果とコードカバレッジが表示されるはずです。
f:id:griefworker:20110726222002p:image

まとめ

テストやコードカバレッジ診断の結果を Jenkins 上に表示することで、いつでもブラウザで最新のレポートが見れるようになりました。このレポートを見ればテスト漏れは一目瞭然。品質向上に役立こと間違いなしです。

あ、テストの目的が「コードカバレッジを100%にすること」にすり替わってしまわないよう、くれぐれも注意を。

.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 やればよかったってことです。