Karena kesalahan konfigurasi, saya memiliki lebih dari 1700 bangunan gagal di pekerjaan Jenkins.
Bagaimana saya bisa membersihkannya secara efisien?
Karena kesalahan konfigurasi, saya memiliki lebih dari 1700 bangunan gagal di pekerjaan Jenkins.
Bagaimana saya bisa membersihkannya secara efisien?
Jawaban:
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.
jenkins-cli.jar -s ... delete-builds envjs 11-1717
jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; return
Menyortir misalnya oleh build juga sepele.
JobName/branch
Cukup lakukan panggilan API:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
Untuk mendapatkan APIToken: login ke Jenkins> Configuration> Show API Token.
toggleLogKeep
sebelumnya doDelete
.
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
Kerangka untuk menjalankan skrip di Jenkins Script-Console. Gunakan bendera reallyDelete
untuk 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}");
}
}
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
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