Bagaimana cara menghapus build 11 hingga 1717 di Jenkins?

51

Karena kesalahan konfigurasi, saya memiliki lebih dari 1700 bangunan gagal di pekerjaan Jenkins.

Bagaimana saya bisa membersihkannya secara efisien?

Aaron Digulla
sumber
2
Sejumlah cara untuk menghapus build melalui command line dibahas di sini: stackoverflow.com/questions/13052390/…
ThomasW

Jawaban:

74

Anda memiliki beberapa opsi:

  • Setel sementara jumlah build untuk mempertahankan konfigurasi pekerjaan ( Buang Old Builds ) sehingga build-build itu akan dihapus ketika build berikutnya selesai. Jika versi berikutnya adalah 1800, atur agar tetap menggunakan 85 atau lebih. Tandai semua build lama (mis. 1 hingga 10) sebagai Keep This Build Forever sebelum memulai build berikutnya. Opsi ini akan gagal menghapus beberapa build jika Anda memiliki pekerjaan downstream yang mencegah build upstream terhapus (bukan masalah dalam situasi Anda jika semuanya gagal).

  • Gunakan Konsol Skrip di Kelola Jenkins . Jika ini adalah pekerjaan tingkat atas (bukan di folder), berikut ini akan melakukan trik:

    Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }

    Tentu saja, pendekatan ini umumnya membutuhkan cadangan yang baik. Ada banyak hal yang dapat Anda hentikan menggunakan konsol skrip.

  • Hapus folder build dari disk (secara default di $JENKINS_HOME/jobs/JobName/builds/, menggunakan cap waktu mulai sebagai nama folder) dan restart Jenkins, atau Muat Ulang Konfigurasi Dari Disk . Opsi ini tidak akan mengizinkan plugin yang mis menjaga riwayat SVN agar tetap dengan memindahkan perubahan apa pun ke build berikutnya untuk melakukan pekerjaan mereka.

Daniel Beck
sumber
10
Saya telah menemukan solusi lain: Menggunakanjenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla
Membuat Intisari untuk mencantumkan semua pekerjaan dengan hitungan build melalui terminal. Memudahkan mencari pekerjaan yang perlu dibersihkan. Dapat digunakan melalui cron sebagai laporan email juga.
Nick
@Nick Periksa plugin Groovy, khususnya tipe langkah sistem Groovy build. Tidak perlu pergi ke luar Jenkins untuk ini, cukup buat pekerjaan yang melakukan ini. jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnMenyortir misalnya oleh build juga sepele.
Daniel Beck
Untuk jaringan pipa multi-cabang, Anda dapat menggunakan sintaks JobName/branch
waitinforatrain
17

Cukup lakukan panggilan API:

curl -X POST http://jenkinUser:[email protected]/job/theJob/[11-1717]/doDelete

Untuk mendapatkan APIToken: login ke Jenkins> Configuration> Show API Token.

hello_harry
sumber
Saya pikir ini adalah pendekatan terbaik untuk masalah ini. itu dapat dieksekusi dari jarak jauh a menyediakan berbagai tindakan melalui REST
alfredocambera
Jawaban terbaik karena Anda tidak perlu mencari toples pada sistem yang diinstal.
Keith Tyler
Maksud saya "Anda tidak perlu mengunduh apa pun"
Keith Tyler
"Jawaban terbaik karena Anda tidak perlu" - jika kriteria Anda tidak mengunduh file <1m dari ini lebih baik, terima kasih CLI. Jika kriteria tidak harus mengetikkan url berantakan dengan token autentik ingat sintaks curl (dengan asumsi itu diinstal di tempat pertama), dan Anda lebih suka perintah yang jelas dan membantu dan mungkin Anda sudah memiliki jar CLI lebih baik. Jika Anda hanya memiliki antarmuka kita di sana dengan konsol skrip terpasang, maka itu adalah yang lebih baik. Seperti biasa itu tergantung.
user17265
untuk menghapus keep build selamanya, jalankan toggleLogKeepsebelumnya doDelete.
Fancyoung
16

Seperti yang Aaron katakan dengan benar, Anda juga bisa menggunakan Jenkins CLI untuk tujuan ini:

java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
jaltek
sumber
4

Kerangka untuk menjalankan skrip di Jenkins Script-Console. Gunakan bendera reallyDeleteuntuk mengujinya sebelum benar-benar menghapus:

// Jenkins job
def jobName = 'foo'
// Range of builds to delete
def rs = Fingerprint.RangeSet.fromString("11-1717", false);
// Set to true to actually delete. Use false to test the script.
def reallyDelete = false;

// ----------------------------------
def job = Jenkins.instance.getItemByFullName(jobName);
println("Job: ${job.fullName}");

def builds = Jenkins.instance.getItemByFullName(jobName).getBuilds(rs);
println("Found ${builds.size()} builds");
builds.each{ b-> 
  if (reallyDelete) {
    println("Deleting ${b}");
    b.delete();
  } else {
    println("Found match ${b}");
  }
}
Aaron Digulla
sumber
1

Saya dihadapkan dengan tugas yang sama ketika saya mengambil alih server Jenkins, di mana ada lebih dari 150 pekerjaan dengan 3000 bangunan lama, jadi saya menulis skrip bash kecil yang hanya menyimpan 10 bangunan terakhir:

#! /bin/bash

initialPath=$(pwd);

find /var/lib/jenkins/ -type d -name builds | while read jobs
 do

    #############################################################
    ## Enter build-directory of current job and get some numbers
    #############################################################
    cd "$jobs" ;
    ls -d [[:digit:]]* &>/dev/null ;
    rc=$? ;
    if [[ $rc -eq 0 ]] ;
     then
        buildName=$(ls -d [[:digit:]]*)  ;
        latestBuild=$(echo $buildName | awk '{print $NF}') ; # highest number
        oldestBuild=$(echo $buildName | awk '{print $1}') ; # lowest number
        amountOfBuilds=$(echo $buildName | wc -w ) ;
        lastBuildToKeep=$(echo "${latestBuild} 9" | awk '{print $1 - $2}') ;

        ############################################################
        ## Skip Folder if it contains less than 10 builds
        ############################################################
        if [ ${amountOfBuilds} -le 10 ] ;
         then
            echo "Skipping $(pwd) --> less than 10 builds";
         else
            ############################################################
            ## Delete all build-directories except the last 10
            ############################################################
            for (( i=$oldestBuild; i<$lastBuildToKeep; i++))
             do
                echo "Deleting $(pwd)/${i} ..."
                rm -r "$i" ;
            done ;
        fi ;
     else
        echo "Skipping $(pwd) --> Zero builds";
    fi ;
done ;

############################################################
## go back to $initialPath
############################################################
cd "$initialPath" ;

Restart Jenkins sesudahnya sangat disarankan untuk menghindari masalah. Thx @Aaron Digulla

Anyesto
sumber
Mengapa Anda tidak menggunakan skrip untuk konsol Jenkins?
Aaron Digulla
Karena saya lebih akrab dengan bash. Itulah satu-satunya alasan.
Anyesto
Dimengerti. Harap edit pertanyaan Anda dan tambahkan bahwa Jenkins harus direstart setelahnya untuk menghindari masalah.
Aaron Digulla
0

Saya telah membuat skrip python kecil yang akan melayani tujuan ini. Berikut ini skripnya:

delete_jenkins_builds.py

from os import listdir, path
import shutil


job_build_fullpath = '/var/lib/jenkins/jobs/My-Jenkins-Project/builds'
print listdir(job_build_fullpath)

for build_dir in listdir(job_build_fullpath):
        if build_dir.isdigit() and int(build_dir) in range(11, 1718):
                build_dir_fullpath = path.join(job_build_fullpath, build_dir)
                print "Deleting: " + build_dir_fullpath
                shutil.rmtree(build_dir_fullpath)
  • job_build_fullpath - Path dari direktori build Job

  • range (start_build_no, end_build_no) - range (11, 1718) mencari semua build mulai dari build no. 11 untuk membangun no. 1717. Silakan atur sesuai.

  • shutil.rmtree (build_dir_fullpath) - menghapus setiap direktori build yang ada dalam jangkauan.

Versi Python: 2.7

Shubham Soin
sumber
Tidakkah Anda harus me-restart Jenkins sesudahnya? Bagaimana jika Jenkins menyimpan informasi tentang folder-folder itu dalam database?
Aaron Digulla
Ya @AaronDigulla, restart server Jenkins akan diperlukan untuk mencerminkan perubahan pada portal Jenkins.
Shubham Soin