Arbeitsbereich der Jenkins-Pipeline löschen


140

Wir führen Jenkins 2.x aus und lieben das neue Pipeline-Plugin. Bei so vielen Zweigen in einem Repository füllt sich der Speicherplatz jedoch schnell.

Gibt es ein Plugin, das mit Pipeline kompatibel ist und mit dem ich den Arbeitsbereich bei einem erfolgreichen Build löschen kann?

Antworten:


110

Sie können deleteDir()als letzten Schritt der Pipeline Jenkinsfile verwenden (vorausgesetzt, Sie haben das Arbeitsverzeichnis nicht geändert).


7
Ich habe Probleme mit deleteDir (). Es scheint zufällig nicht in der Lage zu sein, das aktuelle Verzeichnis zu löschen, wenn der Knoten auf einem Slave erstellt wird. In diesem Fall schlägt der Build natürlich fehl. Seien Sie sich also bewusst, wenn Ihre Jobs zufällig fehlschlagen. Ich verstehe nicht, warum der Knoten seinen Arbeitsbereich nicht einfach bereinigt, wenn der Knoten mit dem Aufbau beginnt. Da der Knoten überall ausgeführt werden kann, können Sie ohnehin keine Annahmen über die Dateien im Arbeitsbereich treffen.
ssindelar

1
Aber ich denke, wird nur den Arbeitsbereich auf dem aktuellen Knoten löschen. Im allgemeinen Fall läuft Ihre Pipeline auf mehreren verschiedenen Slaves.
Marcus Philip

21
Ich habe das gleich am Anfang gesagt checkout scm.
Jpbochi

2
Ich habe dies auch am Anfang gesetzt, falls das Projekt fehlschlägt, bevor es das Ende erreicht, oder der nächste Build auf einem anderen Slave ist.
Davegallant

2
Dies ist der Befehl, der zum Bereinigen des Arbeitsbereichs im Abschnitt " Bereinigen und Benachrichtigungen" der Jenkins-Dokumentation dokumentiert ist.
Vossad01

130

Wie @gotgenes mit Jenkins Version hervorgehoben. 2.74 , das Folgende funktioniert, nicht sicher seit wann, vielleicht ob jemand die obige Version bearbeiten und hinzufügen kann

cleanWs()

Mit Jenkins Version 2.16 und dem Workspace Cleanup Plugin , das ich habe, verwende ich

step([$class: 'WsCleanup'])

um den Arbeitsbereich zu löschen.

Sie können es anzeigen, indem Sie zu gehen

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

Wählen Sie dann im Beispielschritt "Schritt: Allgemeiner Erstellungsschritt" und im Erstellungsschritt "Arbeitsbereich löschen, wenn die Erstellung abgeschlossen ist"


Dies funktioniert für mich: Jenkins 2.7.2, Workspace Cleanup Plugin 0.30
dsh

4
Nach dieser in 0.33 enthaltenen PR wird dies in der Pipeline als bezeichnet cleanWs.
Gotgenes

92

Die genannten Lösungen deleteDir()und cleanWs()(wenn das Plugin zur Bereinigung des Arbeitsbereichs verwendet wird) funktionieren beide, aber die Empfehlung, es in einem zusätzlichen Erstellungsschritt zu verwenden, ist normalerweise nicht die gewünschte Lösung . Wenn der Build fehlschlägt und die Pipeline abgebrochen wird, wird diese Bereinigungsphase nie erreicht und daher wird der Arbeitsbereich bei fehlgeschlagenen Builds nicht bereinigt.

=> In den meisten Fällen sollten Sie es wahrscheinlich in einen Zustand nach dem Bau versetzen, wie always:

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

5
Dies war absolut wichtig für meinen Anwendungsfall. Ich muss Artefakte aus dem Job archivieren und cleanWs()als Schritt ausführen löscht sie, bevor der Befehl zum Erstellen nach dem Erstellen ausgeführt wird. cleanWs()sollte höchstwahrscheinlich immer als Post-Build-Befehl ausgeführt werden
Brandon

23
Wenn Sie nur einen postAbschnitt haben, cleanWs()können Sie sicher in den alwaysZustand versetzt werden, aber der sicherste Punkt befindet sich innerhalb des cleanupZustands:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

Tatsächlich löscht die Funktion deleteDir das aktuelle Verzeichnis und seinen Inhalt rekursiv. Symbolische Links und Kreuzungen werden nicht befolgt, sondern entfernt.

Um ein bestimmtes Verzeichnis eines Arbeitsbereichs zu löschen, schließen Sie den Schritt deleteDir in einen Verzeichnisschritt ein.

dir('directoryToDelete') {
    deleteDir()
}

10
Obwohl das OP lediglich gefragt hat, wie der Arbeitsbereich gelöscht werden soll, ist diese Antwort am informativsten.
John McGehee

21

Ich habe deleteDir () wie folgt verwendet:

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

Allerdings musste ich dann immer NUR immer einen Erfolg oder Misserfolg ausführen, aber Sie können die Post-Bedingungen nicht bestellen. Die aktuelle Reihenfolge ist immer geändert, abgebrochen, fehlgeschlagen, erfolgreich und dann instabil.

Es gibt jedoch eine sehr nützliche Nachbedingung, die Bereinigung, die immer zuletzt ausgeführt wird (siehe https://jenkins.io/doc/book/pipeline/syntax/).

Am Ende war mein Beitrag also wie folgt:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Hoffentlich kann dies für einige Eckfälle hilfreich sein


Wir erhalten eine Fehlermeldung "Ungültige Zustandsbereinigung", wir verwenden Jenkins Version 2.89
Aravind Murthy

18

Verwenden des folgenden Pipeline-Skripts:

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

Folge diesen Schritten:

  1. Navigieren Sie zum neuesten Build des Pipeline-Jobs, von dem Sie den Arbeitsbereich bereinigen möchten.
  2. Klicken Sie im LHS-Menü auf den Link Wiedergabe.
  3. Fügen Sie das obige Skript in das Textfeld ein und klicken Sie auf Ausführen

Fügen Sie options { skipDefaultCheckout() }ein wenig schnellere Ausführung.
AkisK

Verbesserte Antwort mit Ihrem Vorschlag @AkisK
Andrew Gray

Dies scheint die einzige Option zu sein, die zum Bereinigen des Arbeitsbereichs VOR und NICHT NACH dem Ausführen einer Pipeline geeignet ist, obwohl ich keinen separaten Schritt zum einfachen Bereinigen haben wollte. Vielen Dank
Sergey Pleshakov

11

Wenn Sie in Jenkins einen benutzerdefinierten Arbeitsbereich verwendet haben, löscht deleteDir () den Ordner @tmp nicht.

Um @tmp zusammen mit dem Arbeitsbereich zu löschen, verwenden Sie Folgendes

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

Dieses Snippet funktioniert auch für den Standardarbeitsbereich.


1
Funktioniert auch mit einer Docker-Pipeline. Sehr hilfreich, danke!
mcw

1
Dies ist auch die einzige Antwort, die ich gesehen habe, die auch den nervigen @ libs-Ordner töten kann
David Lavender

4

Wir stellen sicher, dass wir mit einem sauberen Arbeitsbereich arbeiten, indem wir eine Funktion des Git-Plugins verwenden. Sie können zusätzliche Verhaltensweisen wie "Vor dem Auschecken bereinigen" hinzufügen. Wir verwenden dies auch für 'Prune veraltete Remote-Tracking-Zweige'.


4

Die Verwendung der Erweiterung 'WipeWorkspace' scheint ebenfalls zu funktionieren. Es erfordert die längere Form:

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

Weitere Details finden Sie hier: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Verfügbare GitSCM-Erweiterungen finden Sie hier: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

Für Jenkins 2.190.1 funktioniert dies mit Sicherheit:

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

1

Bereinigen : Da der Post-Abschnitt einer Pipeline am Ende der Ausführung einer Pipeline garantiert ausgeführt wird, können wir einige Benachrichtigungen oder andere Schritte hinzufügen, um Finalisierungs-, Benachrichtigungs- oder andere Aufgaben am Ende der Pipeline auszuführen.

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 */
        }
    }
}

Dies funktioniert nicht, wenn Stufen auf verschiedenen Slaves ausgeführt werden!
CodeGeass

1

In meinem Fall möchte ich alte Dateien zu Beginn des Builds löschen, dies ist jedoch problematisch, da der Quellcode ausgecheckt wurde.

Meine Lösung besteht darin, git zu bitten, alle Dateien (aus dem letzten Build) zu bereinigen, von denen es nichts weiß:

    sh "git clean -x -f"

Auf diese Weise kann ich den Build-Out bereinigen. Wenn dies fehlschlägt, wird der Arbeitsbereich nicht bereinigt und ist daher leicht zu debuggen.


0

Derzeit funktionieren sowohl deletedir () als auch cleanWs () nicht ordnungsgemäß, wenn das Jenkins-Kubernetes-Plugin verwendet wird. Der Pod-Arbeitsbereich wird gelöscht, der Master-Arbeitsbereich bleibt jedoch bestehen

Dies sollte für dauerhafte Zweige kein Problem sein, wenn Sie den Arbeitsbereich vor dem Auschecken betrügen müssen. Grundsätzlich wird derselbe Arbeitsbereich immer wieder verwendet. Bei Verwendung von Multibranch-Pipelines behält der Master jedoch den gesamten Arbeitsbereich und das Git-Verzeichnis bei

Ich glaube, das sollte ein Problem mit Jenkins sein, irgendeine Erleuchtung hier?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.