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から)での連携を確認しないと。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください