[Jenkins]パイプラインジョブがshでハングする問題


はじめに

Jenkins Pipelineでshがハングする問題です。
この問題の解消に丸二日かかりました。なかなかエラー文言でググっても解消方法が見つからず、遠回りしたので残しておきたいと思います。

Jenkinsのバージョンは2.204.6
サーバーはUbuntu18.04.4 LTS (Bionic Beaver)

TLDR

Jenkinsの環境変数設定ではPATHでなくPATH+EXTRAを使おう

問題

パイプラインのスクリプトは以下のようになります。

pipeline {

    agent any

    stages {
        stage("Test") {
            steps {
                script {
                    sh "touch test.txt"
                }
            }
        }
    }
}

すると以下のようなログができます。9行目のshのところで処理が止まり、ハングします。

[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/test-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
process apparently never started in /var/lib/jenkins/workspace/test-pipeline@tmp/durable-e010c819
(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code -2
Finished: FAILURE

ハングしているときに、ジョブのThread Dumpを見てみますと、以下のようなログが出ています。

Thread #6
    at DSL.sh(awaiting process completion in /var/lib/jenkins/workspace/test-pipeline@tmp/durable-e010c819; recurrence period: 9543ms; check task scheduled; cancelled? false done? false)
    at WorkflowScript.run(WorkflowScript:9)
    at DSL.script(Native Method)

上記ログに記載されている箇所にいってみてみると、script.shというファイルが配置されていまして、その中にはtouch test.txtとだけ書かれていました。
このディレクトリにはtest.txtファイルはなかったので、このscript.shが実行されていないということになります。確かにログの通りでした。
これはworkflow-durable-task-step-pluginの問題のようでした。

解決法

今回の私のケースでは環境変数の設定の仕方が問題でした。Jenkinsのグローバル設定で、環境変数を以下のように設定していました。変数の設定の仕方をPATH+EXTRAを使ってするべきだったのです。

修正前

修正後

おまけ

なぜここまで気付かなかったかといいますと、
環境変数の値の設定を$PATHでなく${PATH}という形で記載していたためでした。
もし$PATHで記載していれば、コンソールログには以下のようにまさしく答えが出てきます。

Warning: JENKINS-41339 probably bogus PATH=$PATH:~/.loca/bin:~/.loca/bin; perhaps you meant to use ‘PATH+EXTRA=/something/bin’?

以下がプラグインのソースコードでも$PATHしか判定してくれていませんでした。

ソースはこちら
workflow-durable-task-step-plugin

手がかりを探しまくっていた際に、パスの誤りでハングするという記事を見かけたので、パスを設定している箇所を修正しまくっていた際に、環境変数の設定を削除してためしたら、問題が解消されました。
そこでJenkinsでのPATHについて調べてみたら、PATH+EXTRAという話を見つけたという次第です。

参考

以下の中に本件の解説が載っていたので、一部を抜粋した訳文を紹介します。
https://stackoverflow.com/questions/43987005/jenkins-does-not-recognize-command-sh/48634476#48634476

$PATHをJenkinsの環境変数に設定した場合でも、フリースタイルプロジェクトではちゃんと動きます。しかしパイプラインプロジェクトではなんらかの理由により、$PATHが正しく解釈されず、あなたが定義したPATHの値に置き換えられてしまうのです。
このバグを修正する代わりに、Jenkinsプロジェクトは2つの修正をしました。
1) ログを出す("Warning: JENKINS-41339 probably bogus")
2) PATHを追加する新しい方法(PATH+EXTRA)を追加する
です。
この件について、Jenkinsのどっかのドキュメントには書いてあるのでしょうが、本当に必要な場所には書いていないのです(設定箇所のこと)。

以上