Yanlış bir yapılandırma nedeniyle, bir Jenkins işinde 1700'den fazla başarısız yapıma uğradım.
Onları nasıl verimli bir şekilde temizleyebilirim?
Yanlış bir yapılandırma nedeniyle, bir Jenkins işinde 1700'den fazla başarısız yapıma uğradım.
Onları nasıl verimli bir şekilde temizleyebilirim?
Yanıtlar:
Birkaç seçeneğiniz var:
İş konfigürasyonunda tutulacak inşaat sayısını geçici olarak ayarlayın ( Eski İnşaatları Atma ), böylece bir sonraki inşaat tamamlandığında bu inşaatların silinmesi için. Bir sonraki inşa 1800 ise, onu en son 85 kadar koruyacak şekilde ayarlayın. Bir sonraki yapıya başlamadan önce tüm eski yapıları (yani 1 ila 10 arası) Bu Yapıyı Sonsuza Kadar Tut olarak işaretleyin . Bu seçenek, yukarı akış yapılarının silinmesini önleyen bir aşağı akış işiniz varsa, bazı yapıların silinmesine neden olmaz (hepsi başarısız olsa da sizin durumunuzdaki bir sorun değildir).
Kullanım Senaryo Konsolu içinde Jenkins yönetme . Bu, üst düzey bir iştir (bir klasörde değil), aşağıdakiler geçerli olacaktır:
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
Tabii ki, bu yaklaşım genellikle iyi yedekleme gerektirir. Script konsolunu kullanarak kırabileceğiniz çok şey var.
Oluşturucuların klasörlerini diskten silin (varsayılan olarak $JENKINS_HOME/jobs/JobName/builds/
, başlangıç zaman damgasını klasör adı olarak kullanarak) ve Jenkins'i veya Diski Yapılandırmayı Yeniden Başlatın . Bu seçenek, örneğin SVN geçmişini, işlerini yapmak üzere müteakip yapıya yapılan değişiklikleri taşıyarak sırayla tutan eklentilere izin vermeyecektir.
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
Örneğin yapılara göre sıralama benzer şekilde önemsizdir.
JobName/branch
Basitçe bir API araması yapın:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
APIToken'i almak için: Jenkins> Configuration> API Token'ı göster bölümüne giriş yapın.
toggleLogKeep
önce doDelete
.
Aaron'un doğru bir şekilde ifade ettiği gibi , bunun için Jenkins CLI'yı da kullanabilirsiniz :
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
Jenkins Komut Dosyası-Konsolunda çalıştırılacak bir komut dosyasının şablonu. reallyDelete
Silmeden önce sınamak için bayrağı kullanın :
// 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}");
}
}
Jenkins sunucusunu devraldığımda aynı görevle karşılaştım, burada 3000'den fazla eski yapıya sahip 150'den fazla iş vardı, bu yüzden sadece son 10 yapıyı tutan küçük bir bash betiği yazdım:
#! /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" ;
Sorunları önlemek için Jenkins'i daha sonra yeniden başlatmak şiddetle tavsiye edilir. Thx @Aaron Digulla
Bu amaca hizmet edecek küçük bir python betiği yarattım. Komut dosyası aşağıdadır:
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 - İşin yapım dizininin yolu
range (start_build_no, end_build_no) - range (11, 1718), derleme no. 11, hayır inşa etmek. 1717. Lütfen uygun şekilde ayarlayın.
shutil.rmtree (build_dir_fullpath) - aralıktaki her derleme dizinini siler.
Python Sürümü: 2.7