Jenkins Pipeline Wipe Outワークスペース


142

私たちはJenkins 2.xを実行しており、新しいPipelineプラグインが大好きです。ただし、リポジトリに非常に多くのブランチがあるため、ディスク領域がすぐにいっぱいになります。

ビルドが成功したときにワークスペースを一掃できる、Pipelineと互換性のあるプラグインはありますか?

回答:


110

deleteDir()パイプラインJenkinsfileの最後のステップとして使用できます(作業ディレクトリを変更しなかった場合)。


7
deleteDir()に問題があります。ノードがスレーブでビルドされると、現在のディレクトリをランダムに削除できないようです。もちろん、これが発生するとビルドは失敗します。したがって、ジョブがランダムに失敗する場合は注意してください。ノードが作成を開始したときに、なぜノードがワークスペースをクリーンアップしないのか理解できません。ノードはどこでも実行できるため、とにかくワークスペース内のファイルについて想定することはできません。
ssindelar 2016

1
しかし、現在のノードのワークスペースのみを削除すると思います。一般的なケースでは、パイプラインはいくつかの異なるスレーブで実行されます。
マーカスフィリップ

21
私はこれを最初のところに置きましたcheckout scm
jpbochi 2016

2
プロジェクトが最後に到達する前に失敗した場合、または次のビルドが別のスレーブ上にある場合に備えて、これも最初に配置しました。
davegallant

2
これは、Jenkinsドキュメントの「クリーンアップと通知」セクションでワークスペースをクリーンアップするために文書化されたコマンドです。
vossad01

131

@gotgenesがJenkinsバージョンで指摘したように2.74、以下は動作しますが、いつか、誰かが上記のバージョンを編集して追加できるかどうかわからないため、

cleanWs()

、とジェンキンスバージョン2.16およびワークスペースのクリーンアップのプラグイン、私は、私の使用を持っていること

step([$class: 'WsCleanup'])

ワークスペースを削除します。

あなたは行くことによってそれを見ることができます

JENKINS_URL/job/<any Pipeline project>/pipeline-syntax

次に、サンプルステップから「ステップ:一般的なビルドステップ」を選択し、ビルドステップから「ビルドが完了したらワークスペースを削除」を選択します。


これは私にとっては
うまくいき

4
0.33に含まれているこのPRによれば、これはとしてパイプラインで呼び出されます。cleanWs
gotgenes 2017

93

上記のソリューションdeleteDir()cleanWs()ワークスペースクリーンアッププラグインを使用している場合)はどちらも機能しますが、追加のビルドステップで使用することは通常、望ましいソリューションではありません。ビルドが失敗してパイプラインが中止された場合、このクリーンアップ段階に到達しないため、ビルドが失敗してもワークスペースはクリーンアップされません。

=>ほとんどの場合、次のようなビルド後のステップの条件に置く必要がありますalways

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { 
        always { 
            cleanWs()
        }
    }
}

5
これは、私のユースケースにとって絶対に鍵となりました。ジョブからアーティファクトをアーカイブする必要があります。cleanWs()ステップとして実行すると、ポストビルドアーカイブコマンドが実行される前にアーティファクトが削除されます。 cleanWs()常にビルド後のコマンドとして実行する必要がある
Brandon

23
postセクションが1つしかない場合、安全に条件にcleanWs()入れることができますalwaysが、最も安全な場所はcleanup条件内です。post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛJun

68

実際、deleteDir関数は、現在のディレクトリとその内容を再帰的に削除します。シンボリックリンクとジャンクションはたどられませんが、削除されます。

ワークスペースの特定のディレクトリを削除するには、deleteDirステップをdirステップにラップします。

dir('directoryToDelete') {
    deleteDir()
}

10
OPは単にワークスペースを削除する方法を尋ねましたが、この回答が最も有益です。
John McGehee 2016年

21

次のようにdeleteDir()を使用しました。

  post {
        always {
            deleteDir() /* clean up our workspace */
        }
    }

ただし、その後も常に成功または失敗を実行する必要がありましたが、投稿条件を注文することはできません。現在の順序は常に、変更、中止、失敗、成功、そして不安定です。

ただし、非常に便利なポスト条件があり、クリーンアップは常に最後に実行されます。https://jenkins.io/doc/book/pipeline/syntax/を参照してください

結局、私の投稿は次のようになりました:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

うまくいけば、これはいくつかのコーナーケースに役立つかもしれません


「無効な状態のクリーンアップ」というエラーが発生します
。Jenkins

18

次のパイプラインスクリプトを使用します。

pipeline {
    agent { label "master" }
    options { skipDefaultCheckout() }
    stages {
        stage('CleanWorkspace') {
            steps {
                cleanWs()
            }
        }
    }
}

次の手順を実行します:

  1. ワークスペースをクリーンアップするパイプラインジョブの最新ビルドに移動します。
  2. LHSメニューの[再生]リンクをクリックします。
  3. 上記のスクリプトをテキストボックスに貼り付け、[実行]をクリックします。

options { skipDefaultCheckout() }少し速く実行するために追加します。
AkisK

あなたの提案による回答の改善@AkisK
Andrew Grey

クリーンアップするための個別のステップは必要ありませんでしたが、パイプラインを実行する前と後ではなく、ワークスペースをクリーンアップするための唯一のオプションのようです。ありがとう
Sergey Pleshakov

11

Jenkinsでカスタムワークスペースを使用した場合、deleteDir()は@tmpフォルダーを削除しません。

したがって、ワークスペースとともに@tmpを削除するには、以下を使用します

pipeline {
    agent {
        node {
            customWorkspace "/home/jenkins/jenkins_workspace/${JOB_NAME}_${BUILD_NUMBER}"
        }
    }
    post {
        cleanup {
            /* clean up our workspace */
            deleteDir()
            /* clean up tmp directory */
            dir("${workspace}@tmp") {
                deleteDir()
            }
            /* clean up script directory */
            dir("${workspace}@script") {
                deleteDir()
            }
        }
    }
}

このスニペットは、デフォルトのワークスペースでも機能します。


1
ドッキングされたパイプラインでも動作します。とても助かります、ありがとう!
mcw

1
これはまた、唯一の私はそれが迷惑な@libsがあまりにもフォルダを殺すことができます見てきた答えである
デヴィッド・ラベンダー

4

gitプラグインの機能を使用して、クリーンなワークスペースで作業していることを確認します。「チェックアウト前にクリーンアップ」などの動作を追加できます。これは、「古いリモート追跡ブランチのプルーン」にも使用します。


4

'WipeWorkspace'拡張機能を使用しても同様に機能するようです。より長い形式が必要です:

checkout([
   $class: 'GitSCM',
   branches: scm.branches,
   extensions: scm.extensions + [[$class: 'WipeWorkspace']],
   userRemoteConfigs: scm.userRemoteConfigs
])

詳細はこちら:https : //support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

ここで利用可能なGitSCM拡張機能:https : //github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

Jenkins 2.190.1の場合、これは確実に機能します。

    post {
        always {
            cleanWs deleteDirs: true, notFailBuild: true
        }
    }

1

クリーンアップ:PipelineのpostセクションはPipelineの実行の最後に実行されることが保証されているため、通知やその他のステップを追加して、ファイナライズ、通知、またはその他のEnd-of-Pipelineタスクを実行できます。

pipeline {
    agent any
    stages {
        stage('No-op') {
            steps {
                sh 'ls'
            }
        }
    }
    post {
        cleanup {
            echo 'One way or another, I have finished'
            deleteDir() /* clean up our workspace */
        }
    }
}

異なるスレーブでステージを実行している場合、これは機能しません!
codeGeass

1

私の場合、ビルドの最初に古いファイルを消去したいのですが、ソースコードがチェックアウトされているため、問題があります。

私の解決策は、(最後のビルドから)知らないファイルをすべて削除するようにgitに要求することです。

    sh "git clean -x -f"

これにより、ビルドをクリーンに開始できます。ビルドが失敗した場合、ワークスペースはクリーンアップされないため、簡単にデバッグできます。


0

現在、Jenkins kubernetesプラグインを使用すると、deletedir()とcleanWs()の両方が正しく機能せず、ポッドワークスペースは削除されますが、マスターワークスペースは保持されます

チェックアウト詐欺の前にワークスペースをクリーンアップするステップがある場合、永続的なブランチでは問題になりません。基本的に同じワークスペースを何度も再利用します。ただし、マルチブランチパイプラインを使用する場合、マスターはワークスペース全体とgitディレクトリを保持します

これはジェンキンスの問題だと思います、ここで何か悟りはありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.