Jenkins Pipeline Wipe Out Workspace


142

Stiamo eseguendo Jenkins 2.x e adoriamo il nuovo plug-in Pipeline. Tuttavia, con così tanti rami in un repository, lo spazio su disco si riempie rapidamente.

Esiste un plug-in compatibile con Pipeline che posso cancellare lo spazio di lavoro su una build di successo?

Risposte:


110

È possibile utilizzare deleteDir()come ultimo passaggio della pipeline Jenkinsfile (presupponendo che non sia stata modificata la directory di lavoro).


7
Ho dei problemi con deleteDir (). Sembra che non sia in grado di eliminare casualmente la directory corrente quando il nodo viene compilato su uno slave. La compilazione fallisce ovviamente se questo accade. Quindi fai attenzione se i tuoi lavori falliscono casualmente. Non capisco perché il nodo non pulisca semplicemente l'area di lavoro quando il nodo inizia a costruire. Poiché il nodo può essere eseguito ovunque, non è possibile fare ipotesi sui file nell'area di lavoro.
ssindelar,

1
Ma penso che eliminerà solo l'area di lavoro sul nodo corrente. In generale, la pipeline funzionerà su diversi slave.
Marcus Philip,

21
L'ho messo all'inizio, proprio prima checkout scm.
jpbochi

2
Lo metto anche all'inizio, nel caso in cui il progetto fallisca prima che raggiunga la fine, o la build successiva sia su uno slave diverso.
davegallant,

2
Questo è il comando documentato per ripulire l'area di lavoro nella sezione "Pulizia e notifiche" della documentazione di Jenkins.
vossad01,

131

Come sottolineato da @gotgenes versione di Jenkins. 2.74 , il seguito funziona, non sono sicuro da quando, forse se qualcuno può modificare e aggiungere la versione sopra

cleanWs()

Con, Jenkins versione 2.16 e il plug-in di pulizia dell'area di lavoro , che ho, io uso

step([$class: 'WsCleanup'])

per eliminare l'area di lavoro.

Puoi vederlo andando a

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

Quindi selezionando "passaggio: passaggio di generazione generale" dal passaggio Esempio e quindi selezionando "Elimina area di lavoro al termine della creazione" dal passaggio di creazione


Questo funziona per me: Jenkins 2.7.2, Plugin di pulizia
dell'area di

4
Secondo questo PR , incluso in 0.33 , questo viene chiamato in pipeline come cleanWs.
gotgenes,

93

Le soluzioni menzionate deleteDir()e cleanWs()(se si utilizza il plug-in di pulizia dell'area di lavoro ) funzionano entrambe, ma la raccomandazione di utilizzarlo in un passaggio di build aggiuntivo non è in genere la soluzione desiderata . Se la compilazione fallisce e la pipeline viene interrotta, questa fase di cleanup non viene mai raggiunta e quindi lo spazio di lavoro non viene ripulito su build fallite.

=> Nella maggior parte dei casi dovresti probabilmente metterlo in una condizione post-build come always:

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

5
Questo è stato assolutamente fondamentale per il mio caso d'uso. Ho bisogno di archiviare gli artefatti dal lavoro e l'esecuzione cleanWs()come un passo li elimina prima che venga eseguito il comando post build archive. cleanWs()molto probabilmente dovrebbe essere sempre eseguito come comando post build
Brandon

23
Se hai solo una postsezione, cleanWs()puoi tranquillamente metterlo nella alwayscondizione, ma il punto più sicuro è all'interno della cleanupcondizione:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

Infatti, la funzione deleteDir elimina in modo ricorsivo la directory corrente e il suo contenuto. Collegamenti simbolici e incroci non verranno seguiti ma verranno rimossi.

Per eliminare una directory specifica di un'area di lavoro, avvolgere il passaggio deleteDir in un passaggio dir.

dir('directoryToDelete') {
    deleteDir()
}

10
Sebbene l'OP abbia semplicemente chiesto come eliminare l'area di lavoro, questa risposta è la più informativa.
John McGehee,

21

Ho usato deleteDir () come segue:

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

Tuttavia, ho dovuto eseguire anche un Esito positivo o negativo DOPO sempre, ma non è possibile ordinare le condizioni postali. L'ordine corrente è sempre, modificato, interrotto, errore, successo e quindi instabile.

Tuttavia, esiste una condizione post molto utile, la pulizia che viene eseguita per ultima, vedi https://jenkins.io/doc/book/pipeline/syntax/

Quindi alla fine il mio post era il seguente:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Speriamo che questo possa essere utile per alcuni casi d'angolo


Viene visualizzato un messaggio di errore "Pulizia condizione non valida", stiamo utilizzando Jenkins versione 2.89
Aravind Murthy,

19

Utilizzando il seguente script della pipeline:

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

Segui questi passi:

  1. Passare all'ultima build del processo della pipeline di cui si desidera pulire l'area di lavoro.
  2. Fare clic sul collegamento Replay nel menu LHS.
  3. Incolla lo script sopra nella casella di testo e fai clic su Esegui

Aggiungi options { skipDefaultCheckout() }per un'esecuzione leggermente più veloce.
AkisK

Risposta migliorata con il tuo suggerimento @ AkisK
Andrew Gray

Sembra che questa sia l'unica opzione che funziona per ripulire l'area di lavoro PRIMA e NON DOPO l'esecuzione di una pipeline, anche se non volevo avere un passaggio separato per ripulire. Grazie
Sergey Pleshakov,

11

Se hai utilizzato lo spazio di lavoro personalizzato in Jenkins, deleteDir () non eliminerà la cartella @tmp.

Quindi, per eliminare @tmp insieme all'area di lavoro, utilizzare quanto segue

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()
            }
        }
    }
}

Questo frammento funzionerà anche per lo spazio di lavoro predefinito.


1
Funziona anche con una pipeline ancorata. Molto utile, grazie!
Mc

1
Questa è anche l'unica risposta che ho visto che può uccidere anche la fastidiosa cartella @libs
David Lavender,

4

Ci assicuriamo di lavorare con uno spazio di lavoro pulito utilizzando una funzionalità del plugin git. Puoi aggiungere altri comportamenti come "Pulisci prima del checkout". Lo usiamo anche per "Elimina rami di monitoraggio remoto non aggiornati".


4

Anche l'utilizzo dell'estensione "WipeWorkspace" sembra funzionare. Richiede la forma più lunga:

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

Maggiori dettagli qui: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Estensioni GitSCM disponibili qui: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

Per Jenkins 2.190.1 questo funziona sicuramente:

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

1

Pulizia : poiché la sezione post di una pipeline è garantita alla fine dell'esecuzione di una pipeline, possiamo aggiungere alcune notifiche o altri passaggi per eseguire operazioni di finalizzazione, notifica o altre attività di fine 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 */
        }
    }
}

Questo non funziona quando si hanno fasi in esecuzione su diversi slave!
codeGeass

1

Nel mio caso, desidero cancellare i vecchi file all'inizio della compilazione, ma questo è problematico poiché il codice sorgente è stato estratto.

La mia soluzione è chiedere a git di ripulire tutti i file (dall'ultima build) di cui non è a conoscenza:

    sh "git clean -x -f"

In questo modo posso avviare la compilazione in modo pulito e, se non riesce, l'area di lavoro non viene ripulita e quindi facilmente eseguibile il debug.


0

Attualmente sia deleteir () che cleanWs () non funzionano correttamente quando si utilizza il plugin kubernetes Jenkins, l'area di lavoro del pod viene eliminata ma l'area di lavoro principale persiste

non dovrebbe essere un problema per i rami persistenti, quando hai un passaggio per pulire l'area di lavoro prima del checkout della truffa. Fondamentalmente riutilizzerà più volte lo stesso spazio di lavoro: ma quando si utilizzano pipeline multibranch il master mantiene l'intero spazio di lavoro e la directory git

Credo che questo dovrebbe essere un problema con Jenkins, qualche illuminazione qui?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.