LoginSignup
6
3

More than 3 years have passed since last update.

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

Posted at

はじめに

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を使ってするべきだったのです。

修正前
キャプチャ.PNG

修正後
キャプチャ2.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
ソースはこちら
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のどっかのドキュメントには書いてあるのでしょうが、本当に必要な場所には書いていないのです(設定箇所のこと)。

以上

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3