« 2016年6月 | トップページ | 2016年8月 »

2016年7月

2016年7月 4日 (月)

TFS2015のビルドでSonarQube分析を実行:その2

その1の続きです。
※2016/07/03時点の情報です。最新の情報は自身で確認をお願いします。

SonarQubeのビルドタスクを設定して実行すると、こんなエラーがでることがあります。
(正常に動作する方もいらっしゃるので、何かしらの環境依存かもしれませんが、今のところ不明です)
009
「バッチ ファイル: 1から予期しない終了コードを受け取りました」とかいう意味不明な日本語訳は置いときまして、次の行がエラーの原因のようです。
「summary.md」はSonarQubeの解析結果が格納されるファイルですが、ビルドエージェントを直接確認しても格納フォルダすら作成されていません。
数日間悩みましたが、結論は、とあるスクリプトのたった1文字がおかしいことで発生する日本語版固有(2バイト文字圏なら日本語以外でも発生するかも?)の問題です。

ビルドエージェントの内部動作で、ビルドが開始されるとビルドエージェントに対して実行するビルド定義で使用するタスクのモジュール/スクリプトがダウンロードされます。
「MSBuild用のSonarQube - 分析開始」で使用されるモジュール/スクリプトは「[エージェントのベースフォルダ]\tasks\SonarQubeReBuild\[バージョン番号(ex. 1.0.44)]」に展開されるのですが、その中にある「SonarQubePreBuild.ps1」の最終行が問題です。
このファイルを日本語環境で開くと、
011
(;゚Д゚)(;゚Д゚)(;゚Д゚)
「泡rguments」って何ですか?

最初は自分か作成した環境が悪いと思ってTFSサーバを作り直したり、ネットを検索したりしましたが、文字化けということで英語環境を作成してみるとちゃんと動作します。
ちなみに、英語環境で開くとこう見えます。
010_2

試しに、日本語環境のファイルをメモ帳で(見た目上)英語環境と同じ状態に変更してみるとちゃんと動作します。
?なので、変更前後のファイルをバイナリ比較すると、1バイトだけ違ってました。
012
上が変更前、下が変更後ですが、「-」の文字コードが違います。このせいで、スクリプトに引数がちゃんと渡せなくなってました。
※ちなみに、シフトJISで0x96は定義されていません。どうやって英語の人が入力したんでしょうか・・・。

回避策ですが、
1.ビルドエージェントが固定化されている場合は、さきほどの「SonarQubePreBuild.ps1」を修正すれば動作します。
 但し、バージョンアップしたり、違うビルドエージェントや違うフォルダで実行したり、「tasks\SonarQubeReBuild」フォルダを削除した場合は、サーバが持っている間違ったスクリプトが展開されるので、またエラーになります。
2.「MSBuild用のSonarQube - 分析開始」の次に、改めてSonarQubeのタスクランナーを実行する。
 スクリプトで最終的に実行したいのはMSBuild用のSonarQubeタスクランナー「MSBuild.SonarQube.Runner.exe」なので、バッチファイルを1つ用意し、それを実行することで回避します。
<サンプル>
○バッチファイルの中身
013
○バッチスクリプト実行タスクの設定
014
バッチファイルの引数に、プロジェクトキー/プロジェクト名/プロジェクトバージョンを指定するようにしてます。
「MSBuild.SonarQube.Runner.exe」の絶対パスと接続URLは、「MSBuild用のSonarQube - 分析開始」の実行後であればビルドエージェントのOS環境変数に格納されているので、それで対応してます。
(絶対パスは「%MSBUILD_SONARQUBE_BOOTSTRAPPERPATH%」、接続URLは「%MSBUILD_SONARQUBE_HOSTURL%」)

ちなみに、VSTS+日本語のローカルビルドエージェントでは正常に動作します。


ちょっと味見程度に思ってたところに時間を取られたので、とっとと本命のJava系(多分、Gradleから)での連携を確認しないと。

TFS2015のビルドでSonarQube分析を実行:その1

今までのソースの静的解析ツールと言えば、FxCop/CheckStyle/FindBugsなどの個別ツールを使って確認する感じでしたが、TFS2015 Update1で連携できるようになった「SonarQube」なるツールがいいらしいとの噂。
なんと単純な静的解析だけでなく、解析の履歴を蓄積してどれだけ改善できたかが簡単にわかるとのこと。
個別ツールだと前回との比較が面倒(前回の解析結果との比較を人がしないといけない)なところがありますが、SonarQubeだと一目でわかるので、継続的に使用するにはすごくいいツールだと思います。
以前から触ってみたいとは思っていましたが、間でいろいろあってなかなか触ることができなかったのですが、ようやく時間が取れるようになったのでUpdate3が出てきたタイミングで今更感がありますが、お試しでASP.NETのプロジェクトで実際に使ってみようとしたらまんまとハマってしましました。
なんとなくですが、日本語でのSonarQubeのビルドタスクに関する話があまり流れていないようなので、簡単な設定手順とバグ回避策についてまとめてみます。
※2016/07/03時点の情報です。最新の情報は自身で確認をお願いします。

ちなみに、英語ではMSとSonarQubeの両方に設定手順があります。
(SonarQube側の方が「MSBuild」という枠でTFS2013やコマンドラインでの実行方法も併せてまとまっているので、そちらを見ていただくほうがよさそうです)
○Build Tasks for SonarQube Analysis
https://blogs.msdn.microsoft.com/visualstudioalm/2015/08/24/build-tasks-for-sonarqube-analysis/

○Analyzing with SonarQube Scanner for MSBuild
http://docs.sonarqube.org/display/SONARQUBE53/Analyzing+with+SonarQube+Scanner+for+MSBuild

あと、ビルドエージェントにJava 7u75以上と.NET Framework 4.5.2以上が必要です。

さて、TFS2015日本語版での手順です。
事前準備として、SonarQubeへの接続情報(サービスエンドポイント)を登録します。
ブラウザでチームプロジェクトに移動した状態で、画面右上にある(歯車みたいな)サーバの管理アイコンをクリックしてコントロールパネル画面を表示します。
タブの中に「サービス」があるのでクリックし、左側に表示される「新しいサービスエンドポイント」から「汎用」を選択します。
001

「新しい汎用接続の追加」という子画面が表示されるので、各項目を入力します。
002
・接続名:ビルド定義でSonarQubeの接続先を指定するときに使う名前です。適当でかまいません。
・サーバーURL:接続先SonarQubeサーバのURLを指定します。
・ユーザ名:解析結果を登録するSonarQubeのプロジェクトにログイン可能なユーザ名を指定します。
・パスワード/トークンキー:上記ユーザに対するログインパスワード、もしくはSonarQubeサーバの「MyAccount」の「Generate Tokens」で発行したトークンを入力します。


次に、普通のビルド定義に対して、先頭に「MSBuild用のSonarQube - 分析開始」を、最後に「MSBuild用のSonarQube - 分析終了」を追加します。
005

一番最後にタスクが追加されますが、タスクをドラッグすると順番は変更てきます。
006


「MSBuild用のSonarQube - 分析開始」に対して、SonarQube側の情報を設定します。
007
・SonarQubeエンドポイント:事前準備のところで指定した「接続名」を指定します。(コンボボックスから選択)
・プロジェクトキー
 SonarQubeのプロジェクト作成時に「Key」に指定した内容を設定します。
 分からないときは、SonarQubeのメニューの「設定」から、「Projects」-「Management」で表示されるプロジェクト一覧の真ん中あたりに出てくるのがキーです。(イメージだと青枠のところ)
008
・プロジェクト名
 SonarQubeのプロジェクト名を設定します。
・プロジェクト バージョン
 とりあえず、「1.0」としておきます。
・DB接続文字列/DBユーザー名/DBユーザーパスワード
 SonarQubeが5.2以上であれば、設定不要です。5.1以下の場合は、sonar.propertiesで指定した「sonar.jdbc.url」「sonar.jdbc.username」「sonar.jdbc.password」の内容を設定します。
・詳細設定
 個別にパラメータを指定する場合、「/d:[パラメータ名]=[設定内容]」と設定します。
・設定ファイル
 各種設定をまとめた「SonarQube.Analysis.xml」を使用する場合は、ここで設定します。
 ※設定時はバージョン管理に登録されている内容から選択するので、あらかじめSonarQube.Analysys.xmlはバージョン管理に登録しておく必要があります。
・品質ゲートのエラー時にビルドを失敗とする(SQ 5.3+)
 SonarQubeの品質ゲート(Quality Gate)が「Failed」となったときにTFSのビルドを失敗とする場合は、これをONにします。
 ※この項目はTFS2015 Update1/2/2.1では存在しません。

ここまで設定してビルドを実行すれば、SonarQubeの静的解析が実行されて・・・のはずだったんですが...続きは次のブログで。

2016年7月 2日 (土)

Microsoft MVP Award再受賞

なんとか今年もMVP Award(Visual Studio ALM 改め Visual Studio and Development Technologies ← 長いw)を受賞させていただけることとなりました。
「この1年は本業が多忙だったのであまり情報発信できなかったと反省しております。」と昨年度に書かせていただいたのですが、さらに輪をかけて情報発信できておらず、さすがに今年はダメかなと諦めていたような次第でして。
正直情報発信できていない分立ち遅れているなぁと多々感じており、少しでも取り戻すべく頑張りますので、今後ともよろしくお願いいたします。<(_ _)>

« 2016年6月 | トップページ | 2016年8月 »