2017年2月17日金曜日

[Jenkins][Cppcheck] ソースファイルの文字化けを解消する

Windows 上で Jenkins を実行していると、エンコードが MS932 になっていることがほとんどだと思います。


この状態で Cppcheck Result から UTF-8 のソースコードを表示すると、日本語が文字化けしてしまいます。


この問題について質問を受け、対策を考えてみたのでまとめておきます。

Jenkins の文字コードを変更する方法
まず真っ先に出て来る方法は、エンコードを UTF-8 にする方法です。


対応はとても簡単です。
-Dfile.encoding=UTF-8 を Jenkins 起動引数に追加するだけで OK です。
java -Dfile.encoding=UTF-8 -jar jenkins.war --sessionTimeout=1440
サービスにインストールしている場合は、Jenkins.xml の <arguments> に追加してください。

Jenkins を再起動して見てみるとこのように日本語が正しく表示されるようになります。


問題点
ただし、この方法には問題点もあります。
Windows バッチ処理は通常 cp932 (sjis)なので、システムを UTF-8 にしてしまうと、バッチ出力が今度は文字化けしてしまいます。
そこで、バッチ処理の最初に「chcp 65001」する必要が出てきます。
chcp 65001 ナシとアリ、それぞれの結果が以下になります。




ただ、毎度毎度 chcp するのも面倒ですよね。
なので、別の方法も考えてみます。

Warnings Plugin を使って集計する
Cppcheck Plugin ではなく Warnings Plugin を使う方法です。
Warnings Plugin では設定にエンコーディング指定がありますので、こちらを設定すればシステムのエンコーディングと異なっていても大丈です。


Cppcheck の結果を Warnings Plugin で集計は3つのステップで対応します。

Cppcheck の出力カスタマイズ
Warnings Plugin で Cppcheck の結果を集計するために、まず Cppcheck の出力をカスタマイズします。
(デフォルトだと出力されない情報もあるので)
今回は以下のようにしてみました。
--template="{file}:{line}: {severity}: {id}: {message}"
(.+?):(\d+): (information|portability|performance|style|warning|.*error): (.+?): (.*)$


Warnings Plugin にパーサーを追加
続いて、Cppcheck の出力をパースするルールを追加します。
「Jenkins の管理」「システムの設定」の「コンパイラの警告」を開きます。


名前などはご自由に。
「マッピングスクリプト」に以下のようなスクリプトを設定してください。
import hudson.plugins.warnings.parser.Warning
import hudson.plugins.analysis.util.model.Priority

String fileName = matcher.group(1);
int lineNumber = Integer.parseInt(matcher.group(2));
String category = matcher.group(3);
String id = matcher.group(4);
String message = matcher.group(5);
Priority priority;

if (category.contains("error")) {
    priority = Priority.HIGH;
} else if (category.contains("information")) {
    priority = Priority.LOW;
}
else {
    priority = Priority.NORMAL;
}

return new Warning(fileName, lineNumber, id, category, message, priority);

ジョブの設定
最後にジョブの設定をします。
ビルド後の処理から「コンパイラの警告の集計」を追加。
パーサーには上で追加したパーサーを選択してください。


そして、「高度な設定」を開いて「デフォルトのエンコーディング」を設定してください。


設定は以上です。

結果

文字化けしてませんね^^

根本的解決を目指す
Cppcheck Plugin が Warnings Plugin のようにエンコード指定に対応できればいいわけです。
というわけで、やってみようと思っていたのですが…全然手が回らず…今回はここまでです。


今後の展開にご期待ください!!




0 件のコメント:

コメントを投稿