[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"
                }
            }
        }
    }
}
```

すると以下のようなログができます。９行目の**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**を使ってするべきだったのです。

修正前
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/27ca1e55-bb47-15ac-9c94-95ffbbe35b96.png)


修正後
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/f92b1964-6a35-2b46-5aed-0d78443aacc0.png)


# おまけ

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

```
Warning: JENKINS-41339 probably bogus PATH=$PATH:~/.loca/bin:~/.loca/bin; perhaps you meant to use ‘PATH+EXTRA=/something/bin’?
```
以下がプラグインのソースコードでも`$PATH`しか判定してくれていませんでした。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/0e6ac23a-f20b-a2ce-cc77-5a00869e4b23.png)
ソースはこちら
[workflow-durable-task-step-plugin](https://github.com/jenkinsci/workflow-durable-task-step-plugin/blob/master/src/main/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStep.java#L61 "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プロジェクトは２つの修正をしました。
> 1) ログを出す("Warning: JENKINS-41339 probably bogus")
> 2) PATHを追加する新しい方法(PATH+EXTRA)を追加する
> です。
> この件について、Jenkinsのどっかのドキュメントには書いてあるのでしょうが、本当に必要な場所には書いていないのです（設定箇所のこと）。

以上