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