natural born minority
色々書きますけど、結論的には「JenkinsとWindowsでハマる」です。(slave nodeとか構成関係ないです)
ま、自分用なので読みにくくとも「やったこと順」で書きますかね。
Jenkinsのnodeをmaster/slaveで組んでいました。
Jenkinsのパイプラインスクリプト(Jenkinsfileに書くアレ)でWindows対象の bat
構文を使った時、「無言で永久に止まる」という問題に当たりました。
スクリプト自体は「指定したノードでechoするだけ」の簡単なワンライナー。
実行するも「ログにも何も出ず」「ただ止まってるだけ」なので、何が起こってるかわかりません。
これ…「めちゃめちゃ待ったら終わったり」しない?止めて良いのかな?
WindowsのSlave側を確認します。
masterのJenkinsの方で「Widndowsのslaveで使うのは C:\jenkins_node
というフォルダ」と設定してあるので、そこがどうなってるのか眺めます。
bat
ステートメントの詳しい仕様は知らないのですが、「ジョブ名のフォルダ」も出来ているし、「実行すべきコマンド」もbatファイルで放り込めてるように思えます。…なぜ止まるんだ。
とりあえず
とかを切り分けに行きます。
Slaveのマシンに同一VerのJenkinsを入れ、「同じ構文のPipelineスクリプトのジョブ」を作成し、実行しました。
一緒だ…。
これにより「構成は関係ない」で、「Windows + Jenkins + パイプラインスクリプト(bat)の問題」に絞れました。
ローカルに入れたJenkinsは「デフォルト(特に何も設定しない)なら、 [ユーザのカレントフォルダ]\.jenkins
にデータを貯め」ます。
上の検証から「問題はローカルJenkinsでも起こる」と考え、このフォルダを見ていきます。
パイプラインスクリプトかつbat
で在る限りは、workspace
とかに同じようにバッチを作って…
ましたね。ではコレを叩いてみます。
jenkins-main.bat
というバッチは成功しますが…
(おそらくそれを呼び出すラッパーバッチであろう) jenkins-wrap.bat
というバッチが失敗します。
おそらく、 コレ ですね!
バッチの内容は正しいのですが「そんなpathない」と言ってます。
「日本語が問題かなー?」と決め打って、元のSlave/Master構成で、「アルファベットだけのジョブ名」に変えると…
すんなり通った!
これについて「日本語LanguaePack入れてないとか”ロケール変更を怠った”から」かなーと思ったのですが、
Language Pack 入れたとしても UTF-8/ANSI (Windows-31J) 変換地獄見るので日本語やめたほうがいいっす(笑)@kazuhito_m @kyon_mm
— kes/0.9 (H. Ushito) (@iso2022jp) 2016年12月1日
と識者の方に聞いたので「ジョブ名に日本語は避ける」が定石かもしれません。
JenkinsのSlaveを立てるとき「あまり手を入れずに、通信の仕込みだけして…」という状況になりやすいし、そうしたいことがほとんどなのではないかと。
そういう時に、こういう「得体のしれないハマり」をしたくないものです。
消極的ではありますが、「他種OSのSlave抱えるMaster構成時にはジョブに日本語使わないのが無難」かな?という教訓を得ました。
blog comments powered by Disqus