Ut Video Codec Suite は git でソース管理して Visual Studio でビルドするわけですが、Windows 上の Jenkins 経由でビルドしようとするといろいろ文字化けします。

変更履歴が化ける

たとえば「変更履歴」のところでこんな表示になります。

Jenkins で「変更履歴」の文字化け

本来は「Inno Setup をアップデートした。」と表示されるはずです。

これは Windows 上で Jenkins を動かしている Java の(デフォルトの)文字コードが ShiftJIS (正確には MS932)になっているため、git コマンドが UTF-8 で出力して来た commit log 等を誤変換してしまうからのようです。ノードの「システム情報」-「システムプロパティ」で以下のようになっているはずです。

Jenkins のノードで file.encoding が MS932 になっている

とりあえず簡便には、システム環境変数で JAVA_TOOL_OPTIONS-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 に設定し、Jenkins のサービスを再起動すると化けなくなります。

Jenkins のノードで file.encoding を UTF-8 に変更

ただ、副作用として、そのマシン上で走るあらゆる Java が影響を受ける(たぶん)ため、他の目的に Java を使っているマシンの場合は注意が必要です。

このオプションを指定できそうなところは他に ノードの設定の「起動方法」-「高度な設定」-「JVMオプション」や「ノードプロパティ」-「環境変数」がありますが、試した限りではどちらも効かないようです(file.encoding が MS932 のまま)。こちらの方法ならあらゆる Java が影響を受けるということは無いのですが。

なお、Java の文字コードが UTF-8 でないと文字化けする、という現象自体は Windows に限ったことではないはずですが、今時 Unix で UTF-8 以外を使う人なんていないでしょうから結果的に問題ないでしょう。Mac ではデフォルトの文字コードが ShiftJIS らしいので、もしかしたら Mac だとこの問題が発生するかもしれません。

MSBuild の出力が化ける

さて、こうすると今度は MSBuild の出力が化けるようになります。

Jenkins で MSBuild の出力の文字化け

MSbuild を「Windows バッチコマンドの実行」から実行するようにして、「コマンド」に以下のように書くと対処できます。

chcp 65001
"C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe" utvideo.sln /p:Platform=Win32

chcp コマンドでコンソールのコードページを UTF-8 に変更してから MSBuild を実行します。

ところで、「Windows バッチコマンドの実行」でのエラー検出は、実際には上の「コマンド」を

chcp 65001
"C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe" utvideo.sln /p:Platform=Win32
exit %ERRORLEVEL%

という内容のバッチファイルに変換(末尾にエラー状態を cmd.exe の親に返すようにする)して実行するだけなので、複数の MSBuild を行おうとして「コマンド」に以下のように書いてしまうと、最後の MSBuild のエラー状態しか返らなくなってしまいます。

chcp 65001
"C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe" utvideo.sln /p:Platform=Win32
"C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe" utvideo.sln /p:Platform=x64

結果として「コマンド」の中で毎コマンドの後ろに IF ERRORLEVEL 1 EXIT %ERRORLEVEL% と書くか、複数の「Windows バッチコマンドの実行」として書くかする必要があります。後者の場合、chcp コマンドの効果は1つの「Windows バッチコマンドの実行」が終了すると消えてしまうので、全ての「Windows バッチコマンドの実行」の先頭で書いておく必要があります。

chcp 65001
"C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe" utvideo.sln /p:Platform=Win32
chcp 65001
"C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe" utvideo.sln /p:Platform=x64

ちなみに、Jenkins には MSBuild Plugin というものがあり、複数の MSBuild を簡単に扱うことができる&いちいち長ったらしいパスを書かなくて良くて便利なのですが、これで MSBuild を実行すると上のようなコードページの変更ができず、化けることを回避できないのでダメです。

英語版の Visual Studio をインストールしてその MSBuild を使うとメッセージが全部英語になり、文字化けとは無縁になれそうに思えますが、今度はソースコードに日本語が混じっている状態をうまく扱えなくなる可能性があり、これはこれであまり幸せではありません。(この方法を取る際に OS が英語版である必要があるかどうかは未調査)

なお、上の手法は MSBuild について書いていますが、コマンドラインから起動できる任意のコマンドについて適用できる手法なので、他のツールの場合でも応用できるはずです。

追記:変更履歴のファイル名が化ける(未解決)

別のところでいろいろ試していたらこんなことに。

Jenkins で変更したファイルが文字化け

「新しいテキスト ドキュメント.txt」なんですが、ファイル名の表示が化けています。Java の文字コードを MS932 に戻しても、ファイル名の表示が化けるのは変わらず。Jenkins が絡むところで日本語なファイル名は使わない予定なので個人的には問題ないんですが、うーん。

しかし、アホくさいなぁ…なんで21世紀にもなって文字コードで苦労せなあかんのや。

Trackback

only 1 comment untill now

  1. Windows 上で Jenkins のジョブを走らせるといろいろ文字化けする(その2)

    前の記事で、システム環境変数で JAVA_TOOL_OPTIONS を -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 に設定するととりあえず回避できる、と書きました。しかし、よくよく考えてみると、Jenkins slave をイ…

Add your comment now