NBM2

natural born minority

Jenkinsで「パイプラインスクリプトでMSBuild実行」時の文字化けを解決できなかった話

わりかし「特殊環境らしいところで多段に要素が重なった話」なのと「自分よう備忘録」なので、箇条書きで詳しく解説しません。ごめんなさい。

これを読んで得られるもの

  • Jenkins + Slave側Windows + パイプラインスクリプト にて「文字化け」場合のハマリの回避
  • chcp 61005 で「ジョブが止まる(ステイしてエラーも終了もしない)」「期待していた挙動にならない」場合の対処

前提

Jenkinsのnodeをmaster/slaveで組んでいました。

  • Jenkins(master)
  • Jenkins(slave)
    • Windows Server Stndard 2007 SP2(日本語版)
      • VMWare vSphare上実行
    • jnlpでコネクション張る(java -jar slave.jar起動)

事象

JenkinsNodeを、普通に Master:Linux , Slave:Windows(日本語のやつ) を作って、 PipelineScript(Jenkinsfile)にて、

bat "MSBuild.exe XXX.sln"

などすると、Jenkinsのログコンソール文字化けします。

結果

これは、

プロジェクト "xxx" (規定のターゲット) のビルドが完了しました。

ビルドに成功しました。
    0 警告
    0 エラー

の表記なのですが…まあわかりませんねw

そのため、こちらのサイト の如く、Jenkinsfileで

bat 'chcp 65001'

を書いて実行したのですが、以前のハマりと同じく「ジョブが止まった状態」になりました。

やったこと

ちょっと煩雑に「いろいろやった」ので、やったことと結果を箇条書きにしていきます。

Slave側のJenkinsが載ってるWindowsでコマンドプロンプトで実行

  • コードページ932(shift_jis)の状態から
    • chcp 65001(UTF-8) -> プロンプトのウインドウの状態がリセットされ変わる(フォントなど)
    • chcp 20127(US-ASCII) -> 同上
    • chcp 932(shift_jis) -> 文字がクリアされるだけでウインドウは変わらず
    • バッチファイルにMSBuild書いて実行 -> 普通に実行可能、表示は日本語
    • バッチファイルにchcp 65001を書いて実行 -> ウインドウ状態リセット、chcp後の記述は動かず
  • chcp 65001後に実行
    • chcp 65001 -> 文字がクリアされるだけでウインドウは変わらず
    • chcp 932 -> プロンプトのウインドウの状態がリセットされ変わる(フォントなど)
    • バッチファイルにMSBuild書いて実行 -> 何も実行されない、空白の一行が出力されて終わる
      • どんなバッチファイルでも、中身がどんなことが書いてあっても無効化、何も起こらず終了する模様
    • MSBuildを、コンソールから直に実行 -> 普通に実行可能、表示は日本語
  • chcp 20127後に実行
    • バッチファイルにMSBuild書いて実行 -> 普通に実行可能、表示は英語
    • バッチファイルにchcp 65001を書いて実行 -> 普通に実行可能、表示は英語

なんとなく、65001が「ひとつだけ異端」で、そこさえ回避すれば「世の記事っぽく動く」感じがします。

chcpで使用出来る「コードページの数値」の一覧はこちら

「MasterのJenkins」からJenkinsfileの指定のジョブを「SlaveのJenkins(windows)」にて実行

問題を切り離すため、Slave:Jenkins側のslave.jarは、

REM echo off
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
set JENKINS_URL=http://[jenkinsのurl]/computer/[slave]]/slave-agent.jnlp
set JENKINS_SECRET=[それっぽいの]

REM charset (us mode)
chcp 20127

REM Connect to Jenkins server (AWS)
java -Dhttp.proxyHost=%PROXY_HOST% -Dhttp.proxyPort=%PROXY_PORT% -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -jar slave.jar -jnlpUrl %JENKINS_URL% -secret %JENKINS_SECRET%

な記述のbatファイルを実行し、固定した状態での「JenkinsからSlave実行」とします。

  • Jenkinsfileにbat "chcp 65001"記述で実行 -> ジョブがその行でステイ、エラーも終了もせず
  • Jenkinsfileにbat "chcp 20127"記述で実行 -> 止まらず次の行に行ける
    • しかし後の行にMSBuild.exe実行があっても「日本語かつ文字化け」した表示のまま
  • Jenkinsfileにbat "chcp 65001 && MSBuild.exe ..."記述で実行 -> 日本語表示(成功!)
    • しかし、 ビルドの最後でステイ、エラーも終了もせず な状態になってしまう
  • Jenkinsfileにbat "chcp 20127 && MSBuild.exe ..."記述で実行 -> 英語表示
    • ただし日本語ファイル名は文字化け
  • Jenkinsfileにbat "cmd.exe /u /c MSBuild.exe ..."記述で実行 -> 日本語結果で文字化け
    • 何も書かず bat "MSBuild.exe ..." と書いた場合と同じ

…これ以上はがんばれなかった…。(環境固有かもしれないし)

解決(…はしてないが、とりあえずこれで行くことにした方策)

とりあえず、

Jenkinsfileに bat "chcp 20127 && MSBuild.exe ..." 記述で実行

で、茶お濁して先に進むことにしました。

「結果がわからない」が問題だったので。日本語ファイル名は…まぁ「推測つくだろう」ってことで。


人によっては

  • そもそも止まらない
  • そもそも化けない

可能性があるらしい…のだけど、それすらも検証していません。


小並感

複合要素がありすぎて、「特殊な環境固有」なのか「(前提に書いた)組み合わせによるもの」なのか、わからない上に「検証のワンショット」がかなり時間を使い、「落とし所に至る」まで時間がかかりました。

もっと良い解決法があったのかもしれませんが…まあ「同じことに陥った人」はご連絡くださいまし。

参考URL

以下を参考にさせていただきました。感謝です。

感謝

Windowsまわりで、いろいろ詳しい助言をくださった @iso2022jp さん、ありがとうございました。

blog comments powered by Disqus