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?

qmo
quelle

Antworten:

110

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

Krzysztof Krasoń
quelle
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"

cursed_axes
quelle
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()
        }
    }
}
MattDiMu
quelle
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()
}
Sebastien
quelle
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

user3586383
quelle
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
Andrew Gray
quelle
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.

Pankaj Shinde
quelle
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'.

NICHT verspätet
quelle
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

blindsnowmobile
quelle
2

Für Jenkins 2.190.1 funktioniert dies mit Sicherheit:

    post {
        always {
            cleanWs deleteDirs: true, notFailBuild: true
        }
    }
MAZux
quelle
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 */
        }
    }
}
YourAboutMeIsBlank
quelle
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.

djhaskin987
quelle
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?

Joel Almeida
quelle