Jenkins Pipeline Wipe Out Workspace


142

Używamy Jenkinsa 2.xi uwielbiamy nową wtyczkę Pipeline. Jednak przy tak dużej liczbie gałęzi w repozytorium miejsce na dysku szybko się zapełnia.

Czy jest jakaś wtyczka zgodna z Pipeline, którą mogę wyczyścić obszar roboczy po udanej kompilacji?

Odpowiedzi:


110

Możesz użyć deleteDir()Jenkinsfile jako ostatniego kroku potoku (zakładając, że nie zmieniłeś katalogu roboczego).


7
Mam problemy z deleteDir (). Wydaje się, że losowo nie może usunąć bieżącego katalogu, gdy węzeł jest budowany na urządzeniu podrzędnym. Kompilacja oczywiście się nie powiedzie, jeśli tak się stanie. Dlatego miej świadomość, jeśli Twoja praca nie powiedzie się przypadkowo. Nie rozumiem, dlaczego węzeł nie tylko czyści obszar roboczy, gdy węzeł zaczyna budować. Ponieważ węzeł może działać w dowolnym miejscu, i tak nie można poczynić żadnych założeń dotyczących plików w obszarze roboczym.
ssindelar

1
Ale myślę, że usunie tylko obszar roboczy w bieżącym węźle. W ogólnym przypadku twój rurociąg będzie działał na kilku różnych slave'ach.
Marcus Philip

21
Umieściłem to na początku tuż przed checkout scm.
jpbochi,

2
Umieszczam to również na początku, na wypadek, gdyby projekt się nie powiódł, zanim dotrze do końca lub następna kompilacja jest na innym slave'ie.
davegallant

2
To jest udokumentowane polecenie czyszczenia obszaru roboczego w sekcji „Czyszczenie i powiadomienia” dokumentacji Jenkins.
vossad01

131

Jak @gotgenes wskazał w wersji Jenkins. 2.74 , poniżej działa, nie jestem pewien od kiedy, może jeśli ktoś może edytować i dodać powyższą wersję

cleanWs()

Dzięki, Jenkins Wersja 2.16 i Oczyszczanie Workspace Plugin , że mam, używam

step([$class: 'WsCleanup'])

aby usunąć obszar roboczy.

Możesz go wyświetlić, przechodząc do

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

Następnie wybierz „krok: Ogólny krok kompilacji” z kroku Przykład, a następnie wybierz „Usuń obszar roboczy po zakończeniu kompilacji” z kroku kompilacji


To działa dla mnie: Jenkins 2.7.2, Workspace Cleanup Plugin 0.30
dsh

4
Zgodnie z tym wymaganiem technicznym , zawartym w 0,33 , nazywa się to w rurociągu jako cleanWs.
gotgenes

93

Wymienione rozwiązania deleteDir()i cleanWs()(jeśli używasz wtyczki do czyszczenia obszaru roboczego ) działają, ale zalecenie użycia go w dodatkowym etapie kompilacji zwykle nie jest pożądanym rozwiązaniem . Jeśli kompilacja się nie powiedzie, a potok zostanie przerwany, ten etap czyszczenia nigdy nie zostanie osiągnięty, a zatem obszar roboczy nie jest czyszczony w przypadku nieudanych kompilacji.

=> W większości przypadków prawdopodobnie powinieneś umieścić go w stanie po zbudowaniu kroku, takim jak always:

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

5
To było absolutnie kluczowe dla mojego przypadku użycia. Muszę zarchiwizować artefakty z zadania, a działanie cleanWs()jako krok usuwa je przed uruchomieniem polecenia archiwum po kompilacji. cleanWs()najprawdopodobniej zawsze powinno być uruchamiane jako polecenie po kompilacji
Brandon

23
Jeśli masz tylko jedną postsekcję, cleanWs()możesz bezpiecznie wprowadzić alwaysstan, ale najbezpieczniejszym miejscem jest cleanupstan:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

W rzeczywistości funkcja deleteDir rekurencyjnie usuwa bieżący katalog i jego zawartość. Symboliczne łącza i skrzyżowania nie będą śledzone, ale zostaną usunięte.

Aby usunąć określony katalog obszaru roboczego, zawiń krok deleteDir do kroku dir.

dir('directoryToDelete') {
    deleteDir()
}

10
Chociaż PO zapytał tylko, jak usunąć obszar roboczy, ta odpowiedź jest najbardziej pouczająca.
John McGehee

21

Użyłem deleteDir () w następujący sposób:

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

Jednak musiałem wtedy również uruchamiać Sukces lub Niepowodzenie PO zawsze, ale nie możesz zamówić warunków wysyłki. Bieżąca kolejność jest zawsze zmieniona, przerwana, niepowodzenie, sukces, a następnie niestabilna.

Istnieje jednak bardzo przydatny warunek postu, czyszczenie, które zawsze działa jako ostatnie, zobacz https://jenkins.io/doc/book/pipeline/syntax/

Ostatecznie mój post wyglądał następująco:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Miejmy nadzieję, że może to być pomocne w niektórych przypadkach narożnych


Otrzymujemy błąd „czyszczenie nieprawidłowego stanu”, używamy Jenkinsa w wersji 2.89
Aravind Murthy

19

Przy użyciu następującego skryptu potoku:

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

Wykonaj następujące kroki:

  1. Przejdź do najnowszej kompilacji zadania potoku, z którego chcesz wyczyścić obszar roboczy.
  2. Kliknij łącze Odtwórz w menu LHS.
  3. Wklej powyższy skrypt w polu tekstowym i kliknij Uruchom

Dodaj, options { skipDefaultCheckout() }aby przyspieszyć wykonanie.
AkisK

Ulepszona odpowiedź z Twoją sugestią @AkisK
Andrew Gray

Wygląda na to, że jest to jedyna opcja, która działa w celu wyczyszczenia obszaru roboczego PRZED i NIE PO wykonaniu potoku, mimo że nie chciałem mieć oddzielnego kroku tylko do czyszczenia. Dziękuję
Sergey Pleshakov

11

Jeśli użyłeś niestandardowego obszaru roboczego w Jenkins, funkcja deleteDir () nie usunie folderu @tmp.

Aby usunąć @tmp wraz z użyciem obszaru roboczego, wykonaj następujące czynności

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

Ten fragment będzie działał również dla domyślnego obszaru roboczego.


1
Działa również z dokeryzowanym potokiem. Bardzo pomocne, dzięki!
mcw

1
Jest to również jedyna odpowiedź, jaką widziałem, która może również zabić irytujący folder @libs
David Lavender

4

Upewniamy się, że pracujemy z czystym obszarem roboczym, korzystając z funkcji wtyczki git. Możesz dodać dodatkowe zachowania, takie jak „Wyczyść przed zakupem”. Używamy tego również do „Przycinania starych gałęzi zdalnego śledzenia”.


4

Wydaje się, że działa również rozszerzenie „WipeWorkspace”. Wymaga dłuższej formy:

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

Więcej szczegółów tutaj: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Dostępne rozszerzenia GitSCM tutaj: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

W przypadku Jenkins 2.190.1 to na pewno działa:

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

1

Oczyszczanie : Ponieważ sekcja postu potoku ma gwarancję uruchomienia pod koniec wykonywania potoku, możemy dodać pewne powiadomienia lub inne kroki w celu wykonania finalizacji, powiadomienia lub innych zadań końca potoku.

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

To nie działa, gdy etapy działają na różnych niewolnikach!
codeGeass

1

W moim przypadku chcę wyczyścić stare pliki na początku kompilacji, ale jest to problematyczne, ponieważ kod źródłowy został pobrany.

Moim rozwiązaniem jest poproszenie gita o wyczyszczenie wszystkich plików (z ostatniej kompilacji), o których nie wie:

    sh "git clean -x -f"

W ten sposób mogę rozpocząć kompilację w sposób czysty, a jeśli się nie powiedzie, obszar roboczy nie zostanie wyczyszczony, a zatem można go łatwo debugować.


0

Obecnie zarówno deleteir (), jak i cleanWs () nie działają poprawnie podczas korzystania z wtyczki Jenkins kubernetes, obszar roboczy pod jest usuwany, ale główny obszar roboczy pozostaje

nie powinno to stanowić problemu dla trwałych oddziałów, gdy masz krok do wyczyszczenia obszaru roboczego przed oszustwem przy kasie. Zasadniczo będzie ponownie używać tego samego obszaru roboczego: ale podczas korzystania z potoków wielobranżowych master zachowuje cały obszar roboczy i katalog git

Uważam, że to powinien być problem z Jenkinsem, jakieś oświecenie tutaj?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.