こんにちは、テクマトリックスの長久保です。
今回はタイトルの通り、Jenkinsのジョブが実行できなくてハマったので備忘録として残しておきます。

発生した環境

環境情報としては以下になります。

Jenkinsのバージョン2.346.2
file.encodingMS932
java.version11.0.6
os.nameWindows 10
sun.jnu.encodingMS932
user.countryJP


ビルド用エージェントとして、同一筐体上に構成。エージェントはwebsocketを利用してコントローラーと接続しています。

Jenkinsのジョブタイプは「パイプライン」のジョブタイプで作成しました。

batが実行できないジョブ

発生した問題

ジョブを作成し、意気揚々と実行しようとしたら「batステップを実行すると、実行中のまま処理が完了しない」という問題にあたりました。以下に該当部分を抜粋します。

    stages {
      stage('ビルド') {
        agent {
          node {
            label 'build-test'
          }
        }
        steps {
          bat "build.bat ${pipelineParams.buildBatArgument}"
        }

batのステップで停止してしまいます(いつまで待っても処理が完了しない)。

この実行コマンドでそのままログも出力せず実行中のままになります。err.logやout.log、そのほかlogsフォルダ内も探ってもそれらしいログは見当たりませんでした。
しばらく放置して待ってみたのですが処理は完了しません。実行しようとしているbatファイルはテキストファイルを出力するのみのシンプルなバッチであり、通常であれば1秒とかからないはずです。

18分ほど放置しても終わらないので強制終了させました。

調査

結論が気になる方は結論までスキップしてください(勘の良い方は「発生した環境」の情報でピンと来ているかもしれません)。

暗中模索

エージェント構成が問題なのかと、Jenkinsコントローラー上のエグゼキューター上で実行
→解決せず。

共有ライブラリを使っているのが原因なのかと、Pipelineのみで実行
→解決せず。

SCMが問題なのでは?とSubversionやGiteaで試す
→解決せず。

プラグインが問題なのでは?とバージョンを上げる。
→解決せず。

と様々切り分けていきましたが、最終的にエージェントを利用しないJenkinsコントローラー上のエグゼキューターで、以下の様なシンプルなパイプラインを作成しても実行できませんでした。

今までと同じようにbatの箇所で止まってしまい、batの実行が完了しません。
stepをbatステップではなく、echo ‘実行’とすると問題無く実行できるので、Jenkinsの環境自体は問題ありません。

原因のアタリがつく

stepに書いたbatステップを実行する際に、batファイルを一時的に作成して実行しているのでは?という推測です。

ワークスペースを確認しに行くとありました。

jenkins-main.batの方は、echo 実行

jenkins-wrap.batはjenkins-main.batを呼び出し、結果をJenkinsに返す為に作成されたバッチ(ラップバッチ?)です。

それぞれを実行してみます。

原因がわかりました。

結論

結論としては文字化けでした。

このラッパー用のバッチがUTF-8で作成されており、Jenkins側(Windows側)がMS932なので文字化けを起こして実行できておらず、戻り値も戻ってこないという事が原因だったようです。
ジョブの名称を半角文字列で実行すれば問題無く実行できました。

バッチ作成時の文字コードは次の箇所でハードコーディングされています。

https://github.com/jenkinsci/durable-task-plugin/blob/master/src/main/java/org/jenkinsci/plugins/durabletask/WindowsBatchScript.java#L153-L154

久しぶりに文字コードではまりました。
一旦は半角のジョブ名で実行したほうが無難かと思います。

補足:Multibranch Pipelineでは?

Multibranch Pipelineで実行していた時は上記の様な事にハマった記憶はありませんでした。Multibranch Pipelineの場合、基盤側でいい感じに全角文字列を除く処理をしてくれています。

このように全角交じりのジョブ名で作成し、masterブランチのジョブを実行すると、ワークスペースのフォルダ名から全角文字列が削除され、【workspace\Multi_master】になります。

このようなすべて全角文字のジョブ名を作成し、masterブランチのジョブを実行すると【workspace\_master】というフォルダが作成されます。testブランチのジョブを実行すると【workspace\_test】というフォルダが作成されます。

また、全角文字列を削除した結果、フォルダ名が重複してしまう場合、【workspace\_master_2】の様にインクリメントされていきます。

基本はジョブ名に半角文字列を使うで良いかと思いますが、どうしても全角文字を使いたい場合は「パイプライン」のジョブタイプではなく「Multibranch Pipeline」のジョブタイプで作成すると良いかと思います。

By nagakubo

主にCI環境構築をメインで担当しています。 Certified CloudBees Jenkins Engineer (CCJE)