torutkのブログ

ソフトウェア・エンジニアのブログ

JenkinsのビルドでWindowsバッチコマンドの実行に記述した内容が壊れる問題

Jenkinsでビルドする際、ビルドの種類に「Windowsバッチコマンド」を選択して、テキスト欄にバッチで実行するコマンドをずらずらと記述しました。最初はうまくいっているように見えましたが、日本語のファイル名を指定したあたりから実行がエラーとなり、コンソールを見るとファイル名が切れて(頭の方が)います。

例)Jenkinsのプロジェクトの設定でWindowsバッチコマンドに記述

REM 日本語表示
構成管理.bat
echo Hello, Jenkins!

このビルドを実行すると、コンソール出力に次のように表れます。

X:\jenkins\.jenkins\jobs\Windowsバッチコマンド日本語の検証\workspace>齦\示
指定されたパスが見つかりません。

X:\jenkins\.jenkins\jobs\Windowsバッチコマンド日本語の検証\workspace>管理.bat
'管理.bat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

X:\jenkins\.jenkins\jobs\Windowsバッチコマンド日本語の検証\workspace>echo Hello, Jenkins! 
Hello, Jenkins!

X:\jenkins\.jenkins\jobs\Windowsバッチコマンド日本語の検証\workspace>exit 9009 
Build step 'Windowsバッチコマンドの実行' marked build as failure
Finished: FAILURE

最初は、LinuxマシンでJenkinsのマスターを、WindowsマシンでJenkinsのスレーブを実行する構成だったので、LinuxWindowsとの間でエンコーディングに関する問題ではないかと探っていきましたがさっぱり原因がわかりませんでした。
Windows単独でJenkinsを動かしても現象は変わらず起きたので、Linux-Windows間の受け渡しではなく、Jenkins自身のWindowsバッチコマンドの問題のようです。Jenkinsは本日時点の最新版1.578を動かしました。

さらに調べていくと、この問題の原因を解明して紹介しているブログがありました。
http://d.hatena.ne.jp/miau/20100929/1285768041

このブログにあるように、Windowsでバッチファイルの改行コードをLFにすると、いろいろ弊害が起きます。

ところで、この問題が2010年ごろに既に明らかになっているのに、まだ解決されていません。まずはJenkinsのバグレポートとして挙がっているのかを調べてみました。すると、次のチケットが既にバグとして登録されていました。2010年に登録で、Unresolvedです。
https://issues.jenkins-ci.org/browse/JENKINS-7478

当座の回避策は、バッチファイルに記述してJenkinsからはバッチファイルを呼び出すだけにしておくことかと思います。

なお、このバグですが、上述チケットを見るとつい最近修正パッチが挙がっているので(Pull Request)、そう遠くなく解決されるのでかないかと期待します。