はじめに
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つの修正をしました。
- ログを出す("Warning: JENKINS-41339 probably bogus")
- PATHを追加する新しい方法(PATH+EXTRA)を追加する
です。
この件について、Jenkinsのどっかのドキュメントには書いてあるのでしょうが、本当に必要な場所には書いていないのです(設定箇所のこと)。
以上