Jenkins Boru Hattı Silme Çalışma Alanı


142

Jenkins 2.x kullanıyoruz ve yeni Pipeline eklentisine bayılıyoruz. Bununla birlikte, bir depoda çok fazla dal olduğunda, disk alanı hızlı bir şekilde dolar.

Başarılı bir derlemede çalışma alanını silebildiğim Pipeline ile uyumlu herhangi bir eklenti var mı?

Yanıtlar:


110

Sen kullanabilirsiniz deleteDir()boru hattının son adımı Jenkinsfile (eğer çalışma dizinini değişmedi varsayarak) olarak.


7
DeleteDir () ile ilgili sorun yaşıyorum. Düğüm bir slave üzerine kurulduğunda mevcut dizini rastgele silemiyor gibi görünüyor. Bu olursa tabii ki yapı başarısız olur. İşlerinizin rastgele başarısız olup olmadığını unutmayın. Düğüm niçin inşa etmeye başladığında niçin sadece çalışma alanını temizlemediğini anlamıyorum. Düğüm herhangi bir yerde çalışabildiğinden, çalışma alanındaki dosyalar hakkında herhangi bir varsayımda bulunamazsınız.
ssindelar

1
Ama sadece geçerli düğümdeki çalışma alanını sileceğini düşünüyorum. Genel durumda boru hattınız birkaç farklı köle üzerinde çalışır.
Marcus Philip

21
Bunu daha önce başlamıştım checkout scm.
jpbochi

2
Projenin sona ulaşmadan önce başarısız olması veya bir sonraki derlemenin farklı bir köle üzerinde olması durumunda bunu en başa koydum.
davegallant

2
Bu, Jenkins belgelerinin "Temizleme ve bildirimler" bölümündeki çalışma alanını temizlemek için belgelenen komuttur .
vossad01

131

@Gotgenes gibi Jenkins Sürümü ile dikkat çekti . 2.74 , aşağıda çalışır, ne zamandan beri emin değilim, belki bazıları yukarıdaki sürümü düzenleyip ekleyebilirse

cleanWs()

İle Jenkins Sürüm 2.16 ve Çalışma Alanı Temizleme Eklentisi , ben sahip olduklarım, kullanım

step([$class: 'WsCleanup'])

çalışma alanını silmek için.

Adresine giderek

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

Ardından, Örnek adımdan "adım: Genel Derleme Adımı" nı seçin ve Derleme adımından "Derleme tamamlandığında çalışma alanını sil" i seçin


Bu benim için çalışıyor: Jenkins 2.7.2, Çalışma Alanı Temizleme Eklentisi 0.30
dsh

4
Bu PK'ya göre , 0.33 , bu şekilde boru hattı denir cleanWs.
Eylül'de gotgenes

93

Bahsedilen çözümler deleteDir()ve cleanWs()( çalışma alanı temizleme eklentisi kullanılıyorsa ) her ikisi de çalışır, ancak ekstra bir oluşturma adımında kullanılması önerisi genellikle istenen çözüm değildir . Derleme başarısız olursa ve boru hattı iptal edilirse, bu temizleme aşamasına hiçbir zaman ulaşılmaz ve bu nedenle çalışma alanı başarısız derlemelerde temizlenmez.

=> Çoğu durumda, muhtemelen aşağıdaki gibi yerleşik bir adım durumuna getirmelisiniz always:

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

5
Bu benim kullanım durumum için kesinlikle önemliydi. İşten eserler arşivlemek gerekir ve cleanWs()bir adım olarak çalışan post build arşiv komutu çalıştırmadan önce onları siler. cleanWs()büyük olasılıkla her zaman bir post-build komutu olarak çalıştırılmalıdır
Brandon

23
Sadece bir postbölümünüz varsa, cleanWs()güvenli bir şekilde duruma sokulabilir always, ancak en güvenli nokta cleanupkoşulun içindedir :post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

Aslında deleteDir işlevi geçerli dizini ve içeriğini özyinelemeli olarak siler. Sembolik bağlantılar ve kavşaklar izlenmeyecek, ancak kaldırılacaktır.

Çalışma alanının belirli bir dizinini silmek için dir adımında deleteDir adımını sarın.

dir('directoryToDelete') {
    deleteDir()
}

10
OP sadece çalışma alanının nasıl silineceğini sorsa da, bu cevap en bilgilendiricidir.
John McGehee

21

Aşağıdaki gibi deleteDir () kullandım:

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

Ancak, daha sonra da her zaman SONRA bir Başarı veya Başarısızlık yürütmek zorunda kaldım, ancak posta koşullarını sipariş edemezsiniz. Geçerli sipariş her zaman değiştirilir, iptal edilir, başarısızlık, başarı ve daha sonra kararsızdır.

Ancak, çok yararlı bir sonrası durum vardır temizleme her zaman son çalışır bkz https://jenkins.io/doc/book/pipeline/syntax/

Sonunda görevim şöyle oldu:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Umarım bu bazı köşe vakaları için yararlı olabilir


"Geçersiz durum temizliği" hatası alıyoruz, Jenkins sürüm 2.89 kullanıyoruz
Aravind Murthy

19

Aşağıdaki ardışık düzen komut dosyasını kullanarak:

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

Bu adımları takip et:

  1. Çalışma alanını temizlemek istediğiniz boru hattı işinin en son derlemesine gidin.
  2. LHS menüsündeki Tekrarla bağlantısını tıklayın.
  3. Yukarıdaki komut dosyasını metin kutusuna yapıştırın ve Çalıştır'ı tıklayın.

options { skipDefaultCheckout() }Biraz daha hızlı yürütme için ekleyin .
AkisK

@AkisK
Andrew Gray

Sadece temizlik için ayrı bir adım olmasını istemememe rağmen, bir boru hattını yürütmeden ÖNCE ve SONRA çalışma alanını temizlemek için çalışan tek seçenek bu gibi görünüyor. Teşekkür ederim
Sergey Pleshakov

11

Jenkins'te özel çalışma alanı kullandıysanız deleteDir (), @tmp klasörünü silmez.

Çalışma alanı ile birlikte @tmp silmek için aşağıdaki kullanın

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

Bu snippet, varsayılan çalışma alanı için de çalışır.


1
Ayrıca, yerleştirilmiş bir boru hattı ile çalışır. Çok faydalı, teşekkürler!
mcw

1
Bu aynı zamanda can sıkıcı @ libs klasörünü de öldürebildiğimi gördüğüm tek cevap
David Lavender

4

Git eklentisinin bir özelliğini kullanarak temiz bir çalışma alanı ile çalıştığımızdan emin oluruz. 'Ödeme yapmadan önce temizle' gibi ek davranışlar ekleyebilirsiniz. Bunu 'eskiyen uzaktan izleme dallarını budamak' için de kullanıyoruz.


4

'WipeWorkspace' uzantısının kullanılması da işe yarıyor gibi görünüyor. Daha uzun bir form gerektirir:

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

Daha fazla ayrıntı burada: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Kullanılabilir GitSCM uzantılarını burada bulabilirsiniz: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

Jenkins 2.190.1 için bu kesinlikle işe yarıyor:

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

1

Temizleme : Bir Boru Hattı'nın yayın bölümünün bir Boru Hattı yürütme işleminin sonunda çalışması garanti edildiğinden, kesinleştirme, bildirim veya Boru Hattı sonu diğer görevleri gerçekleştirmek için bazı bildirimler veya başka adımlar ekleyebiliriz.

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

Farklı köleler üzerinde aşamalar olduğunda bu işe yaramaz!
codeGeass

1

Benim durumumda, yapının başlangıcında eski dosyaları temizlemek istiyorum , ancak kaynak kodu teslim alındığı için bu sorunlu.

Benim çözümüm git hakkında bilmediği dosyaları (son derleme) temizlemek için sormaktır:

    sh "git clean -x -f"

Bu şekilde temizlemeye başlayabilirim ve başarısız olursa, çalışma alanı temizlenmez ve bu nedenle kolayca hata ayıklanabilir.


0

Jenkins kubernetes eklentisi kullanılırken şu anda hem deletedir () hem de cleanWs () düzgün çalışmıyor, bölme çalışma alanı siliniyor ancak ana çalışma alanı devam ediyor

ödeme aldatmaca önce çalışma alanını temizlemek için bir adım varsa, kalıcı dalları için bir sorun olmamalıdır. Temel olarak aynı çalışma alanını tekrar tekrar kullanacaktır: ancak çok şubeli boru hatlarını kullanırken master tüm çalışma alanını ve git dizinini tutar

Bunun Jenkins'le ilgili bir sorun olması gerektiğine inanıyorum, burada aydınlanma var mı?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.