Jenkins Multibranch Pipeline でジョブ実行後にワークスペースを削除する方法
Jenkins の Multibranch Pipeline は、ジョブ実行後にワークスペースを自動削除してくれない。そのままでは、前回のジョブ実行時の結果が残ったフォルダ内でジョブが動作してしまうのだ。
例えば、node_modules/
ディレクトリが残ったまま npm install
が実行されたりすると、本当にまっさらな状態から npm のインストール作業を行ったワケではないので、微妙に実行結果が変わってしまったりすることがある。だから、できればジョブはその都度まっさらな状態から行われるようにしたい。
なぜかジョブ設定画面で「ワークスペースの削除」を選択しても有効にならず、Declarative Pipeline 内で deleteDir()
という関数を読んでやる必要がある。
pipeline {
agent any
stages {
stage('処理あれこれ') {
steps {
echo '処理とか'
}
}
}
post {
always {
// 最後に必ずワークスペースを削除する
deleteDir()
}
}
}
また、Workspace Cleanup Plugin というプラグインを入れてあると、cleanWs()
という関数が使えるようになり、こちらでも deleteDir()
と同等のことができる。deleteDir()
と cleanWs()
とで基本的な動作には変わりなさそう (厳密には cleanWs()
だとワークスペースディレクトリを一旦リネームしてから消しているようだったが、最終的に消えることには変わりないので違いなし)。
どちらの場合も、workspace/【対象のワークスペースディレクトリ】/
は削除されるが、workspace/【対象のワークスペースディレクトリ】@tmp/
というディレクトリの方は削除されない。コチラには過去のタスク実行時の設定ファイルと見られるゴミが残っている。これを消す方法はどうもなさそう?「消せるようにして」という Issue は上がっている。
- 参考 : JENKINS-44909 Workspace Cleanup does not delete @tmp directories created by libraries - Jenkins JIRA
- 参考 : JENKINS-41805 Pipeline Job-- deletedir() delete only current directory but @script and @tmp dir still there in workspace. - Jenkins JIRA
試していないが、Tmp Cleaner Plugin というプラグインがあったりするので、他のプラグインで定期的にお掃除とかはできそう。
ひとまずはコレでワークスペースのお掃除はできたので、おけおけ。