きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Jenkinsのパイプラインで起動したシェルを永続化する(ProcessTreeKiller回避)

Jenkinsのパイプラインから起動することで、常に最新の資材が展開されているnodeサーバを建てようとしました。

しかし、Jenkinsサーバでコマンドを打つとnodeサーバが起動するものの、Jenkinsのパイプラインからコマンドを実行すると起動しません。Jenkins上では正常終了しているのにもかかわらず、です。

この記事では、Jenkinsのパイプラインからnodeサーバ等を永続化する方法を記事にします。

原因

JenkinsのProcessTreeKillerが原因です。

一時的にはnodeサーバが起動しても、Jenkinsがジョブ終了時に特定の環境変数を持っているプロセスを全部終了させてしまいます。

資料

Jenkins公式:ProcessTreeKiller。 wiki.jenkins.io

パイプラインでの回避方法

パイプラインではJENKINS_NODE_COOKIEにdontkillMeを設定すると、永続化したいジョブは削除されません。

次の例は、Jenkinsでhonkitを永続化する例です。

pipline{
    stage("Serve"){
        steps {
            sh '''
                export JENKINS_NODE_COOKIE=dontkillMe
                sh /opt/honkit/serve.sh
            '''
        }
    }
}

パイプライン以外で起動する時は、BUILD_IDを設定すると永続化できるようです。

BUILD_ID=dontKillMe /usr/apache/bin/httpd

Jenkins起動時にProcessTreeKillerを無効化する

Jenkins起動時のJVMパラメータでProcessTreeの設定を無効化できるそうです。

java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
// バージョン1.404以降はこちら。ただ、どちらでも設定可能なようです。
java -Dhudson.util.ProcessTreeKiller.disable=true -jar jenkins.war

検証したけど出来なかった方法

次のコマンドではうまくいかなかったので、忘れないようにメモ。

ずーっとnohupとJenkinsで調べてたので、ProcessTreeKillerに気付くのが遅れました。

  • &
  • nohup

終わりに

数年前と比べると優秀なSaaSのCIサービスが出てきているので、Jenkinsはあまり使わないかもしれないです。

ただ、すでにJenkinsで構築している現場やオンプレミス環境の現場では、別のCIツールに切り替えるメリットもありませんし、5年先でもまだ使ってそうな予感はするのでブログに残しました。

この記事もまた検索されると信じて、ログを残していきたいです。

参考

敬称略。

inosy22:Linuxコマンド(Bash)でバックグラウンド実行する方法のまとめメモ qiita.com