Saluran Pipa Jenkins Menghapus Ruang Kerja


151

Kami menjalankan Jenkins 2.x dan menyukai plugin Pipeline baru. Namun, dengan begitu banyak cabang di repositori, ruang disk terisi dengan cepat.

Apakah ada plugin yang kompatibel dengan Pipeline yang dapat saya hapus dari ruang kerja pada build yang berhasil?

Jawaban:


115

Anda dapat menggunakan deleteDir()Jenkinsfile sebagai langkah terakhir pipeline (dengan asumsi Anda tidak mengubah direktori kerja).


7
Saya punya masalah dengan deleteDir (). Tampaknya secara acak tidak dapat menghapus direktori saat ini ketika node dibangun di atas budak. Build akan gagal tentu saja jika ini terjadi. Jadi waspadalah jika pekerjaan Anda gagal secara acak. Saya tidak mengerti mengapa node tidak hanya membersihkan workspace ketika node mulai membangun. Karena node dapat berjalan di mana saja, Anda tidak dapat membuat asumsi apa pun tentang file di ruang kerja.
ssindelar

1
Tapi saya pikir hanya akan menghapus ruang kerja pada node saat ini. Dalam kasus umum pipeline Anda akan berjalan pada beberapa slave yang berbeda.
Marcus Philip

22
Saya meletakkan ini di awal sebelumnya checkout scm.
jpbochi

2
Saya meletakkan ini di awal juga, jika proyek gagal sebelum mencapai akhir, atau bangunan berikutnya ada pada budak yang berbeda.
davegallant

2
Ini adalah perintah yang didokumentasikan untuk membersihkan ruang kerja di bagian "Pembersihan dan pemberitahuan" dari dokumentasi Jenkins.
vossad01

137

Seperti yang ditunjukkan @gotgenes dengan Versi Jenkins. 2.74 , di bawah ini berfungsi, tidak yakin sejak kapan, mungkin jika ada yang bisa mengedit dan menambahkan versi di atas

cleanWs()

Dengan Jenkins Versi 2.16 dan Plugin Pembersihan Ruang Kerja , yang saya miliki, saya gunakan

step([$class: 'WsCleanup'])

untuk menghapus ruang kerja.

Anda dapat melihatnya dengan pergi ke

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

Kemudian pilih "step: General Build Step" dari Sample step dan kemudian pilih "Delete workspace when build is done" dari langkah Build


Ini berfungsi untuk saya: Jenkins 2.7.2, Workspace Cleanup Plugin 0.30
dsh

4
Menurut PR ini termasuk dalam 0.33 disebut dalam pipeline as cleanWs.
gotgenes

100

Solusi yang disebutkan deleteDir()dan cleanWs()(jika menggunakan plugin pembersihan ruang kerja ) keduanya berfungsi, tetapi rekomendasi untuk menggunakannya dalam langkah pembuatan tambahan biasanya bukan solusi yang diinginkan . Jika build gagal dan pipeline dibatalkan, tahap pembersihan ini tidak akan pernah tercapai dan karena itu ruang kerja tidak dibersihkan pada build yang gagal.

=> Dalam kebanyakan kasus Anda mungkin harus meletakkannya dalam kondisi pasca-langkah seperti always:

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

6
Ini benar-benar kunci untuk kasus penggunaan saya. Saya perlu mengarsipkan artefak dari pekerjaan, dan menjalankan cleanWs()sebagai langkah menghapusnya sebelum perintah arsip post build dijalankan. cleanWs()kemungkinan besar harus selalu dijalankan sebagai perintah pembuatan pos
Brandon

27
Jika Anda hanya memiliki satu postbagian, cleanWs()dapat dengan aman dimasukkan ke dalam alwayskondisi, tetapi tempat teraman adalah di dalam cleanupkondisi:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

70

Bahkan fungsi deleteDir secara rekursif menghapus direktori saat ini dan isinya. Tautan dan persimpangan simbolis tidak akan diikuti tetapi akan dihapus.

Untuk menghapus direktori tertentu dari ruang kerja, bungkus langkah deleteDir dalam langkah dir.

dir('directoryToDelete') {
    deleteDir()
}

10
Meskipun OP hanya menanyakan cara menghapus workspace, jawaban ini adalah yang paling informatif.
John McGehee

24

Saya menggunakan deleteDir () sebagai berikut:

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

Namun, saya kemudian harus juga menjalankan Sukses atau Gagal SETELAH selalu tetapi Anda tidak dapat memesan kondisi posting. Urutan saat ini selalu, diubah, dibatalkan, gagal, sukses, dan kemudian tidak stabil.

Namun, ada kondisi posting yang sangat berguna, pembersihan yang selalu berjalan terakhir, lihat https://jenkins.io/doc/book/pipeline/syntax/

Jadi pada akhirnya postingan saya adalah sebagai berikut:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Semoga ini dapat membantu untuk beberapa kasus sudut


Kami mendapatkan kesalahan "pembersihan kondisi tidak valid", kami menggunakan Jenkins versi 2.89
Aravind Murthy

21

Menggunakan skrip pipeline berikut:

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

Ikuti langkah ini:

  1. Arahkan ke build terbaru dari pekerjaan pipeline yang ingin Anda bersihkan ruang kerjanya.
  2. Klik tautan Putar Ulang di menu Kiri.
  3. Tempel skrip di atas pada kotak teks dan klik Jalankan

1
Tambahkan options { skipDefaultCheckout() }agar eksekusi lebih cepat.
AkisK

Jawaban yang ditingkatkan dengan saran Anda @AkisK
Andrew Grey

Sepertinya ini adalah satu-satunya opsi yang berfungsi untuk membersihkan ruang kerja SEBELUM dan BUKAN SETELAH menjalankan pipa, meskipun saya tidak ingin memiliki langkah terpisah untuk hanya membersihkan. Terima kasih
Sergey Pleshakov

13

Jika Anda telah menggunakan ruang kerja khusus di Jenkins maka deleteDir () tidak akan menghapus folder @tmp.

Jadi untuk menghapus @tmp beserta workspace gunakan berikut ini

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

Potongan ini juga akan berfungsi untuk ruang kerja default.


1
Juga bekerja dengan pipeline docker. Sangat membantu, terima kasih!
mcw

1
Ini juga satu-satunya jawaban yang pernah saya lihat yang juga dapat membunuh folder @libs yang mengganggu
David Lavender

4

Kami memastikan kami bekerja dengan ruang kerja yang bersih dengan menggunakan fitur plugin git. Anda dapat menambahkan perilaku tambahan seperti 'Bersihkan sebelum pembayaran'. Kami menggunakan ini juga untuk 'Pangkas cabang pelacak jarak jauh yang basi'.


4

Menggunakan ekstensi 'WipeWorkspace' tampaknya berfungsi juga. Ini membutuhkan bentuk yang lebih panjang:

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

Detail lebih lanjut di sini: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Ekstensi GitSCM tersedia di sini: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


3

Untuk Jenkins 2.190.1 ini pasti berfungsi:

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

1

Pembersihan : Karena bagian posting Pipeline dijamin berjalan di akhir eksekusi Pipeline, kita dapat menambahkan beberapa notifikasi atau langkah lain untuk melakukan finalisasi, notifikasi, atau tugas akhir Pipeline lainnya.

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

Ini tidak berfungsi saat memiliki tahapan yang dijalankan pada budak yang berbeda!
codeGeass

1

Dalam kasus saya, saya ingin menghapus file lama di awal pembuatan, tetapi ini bermasalah karena kode sumber telah diperiksa.

Solusi saya adalah meminta git untuk membersihkan file apa pun (dari build terakhir) yang tidak diketahui:

    sh "git clean -x -f"

Dengan cara itu saya bisa mulai membangun dengan bersih, dan jika gagal, ruang kerja tidak dibersihkan dan karenanya mudah di-debug.


0

Saat ini, deleteir () dan cleanWs () tidak berfungsi dengan baik saat menggunakan plugin Jenkins kubernetes, ruang kerja pod dihapus tetapi ruang kerja master tetap ada

seharusnya tidak menjadi masalah untuk cabang yang persisten, ketika Anda memiliki langkah untuk membersihkan ruang kerja sebelum checkout scam. Ini pada dasarnya akan menggunakan kembali ruang kerja yang sama berulang kali: tetapi ketika menggunakan pipa multibranch, master menyimpan seluruh ruang kerja dan direktori git

Saya percaya ini seharusnya menjadi masalah dengan Jenkins, pencerahan apa pun di sini?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.