約束の地

キャロ組

Jenkinsfile で daemon系(バックグラウンド動作系)の処理が継続できない場合

状況

Jenkinsfile 内のシェルコマンドで、デーモン的なコマンド(バックグラウンドで動作させるようなコマンド)を実行しようとしても実行されない*1

結論

JENKINS_NODE_COOKIE=dontKillMe を daemon コマンドの前に付与する。以下、unicorn-D オプションで起動する場合を例にします。

node {
    stage('deploy') {
        sh('JENKINS_NODE_COOKIE=dontKillMe bundle exec unicorn -D')
    }
}

補足

検索すると引っかかることが多いのですが、以下のように BUILD_ID=dontKillMe を付与しても動作しません。ただ、これは node { ... } の記述法で記述しているからでしょう*2

node {
    stage('deploy') {
        sh('BUILD_ID=dontKillMe bundle exec unicorn -D')
    }
}

さらに補足

node { ... } の記述法で……」という話が出ましたのですこし付記します。現在では node { ... } ではなく pipeline { ... } を用いることが推奨されています*3。詳しくは以下のページをご覧ください。

参考(感謝!)

*1:実行はされているが Jenkinsfile の処理を抜けたら終了してしまう

*2:確証が持てるほどまで深く確認していません……すいません

*3:scripted pipeline ではなく declarative pipeline を推奨

Powered by はてなブログ