Jenkins'deki 11'den 1717'ye kadar olan yapıları nasıl silebilirim?


51

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:


74

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.


10
Başka bir çözüm buldum: Kullanmajenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla

Terminal üzerinden inşa sayımı olan tüm işleri listelemek için bir Gist yaptı. Temizlenmesi gereken işleri bulmayı kolaylaştırır. Bir e-posta raporu olarak cron üzerinden de kullanılabilir.
Nick,

@Nick Groovy eklentisini, özellikle sistemi Groovy yapı adım türünü inceleyin. Bunun için Jenkins dışına çıkmanıza gerek yok, sadece bunu yapan bir iş yaratın. 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.
Daniel Beck

Çok dallı boru hatları için sözdizimini kullanabilirsiniz JobName/branch
waitinforatrain

17

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.


Bunun soruna en iyi yaklaşım olduğunu düşünüyorum. uzaktan çalıştırılabilir ve REST yoluyla çok çeşitli eylemler sağlar
alfredocambera

En iyi cevap, kurulu bir sistemde kavanozun aranmasına gerek olmadığından.
Keith Tyler,

"Hiçbir şey indirmenize gerek yok" demek istedim
Keith Tyler

"Yapmanız gerekmediğinden en iyi cevap" - ölçütleriniz <1m dosyasını indirmek değilse, CLI'ye teşekkür etmek daha iyidir. Kriterler, kimlik belirteçleri olan karışık URL'leri yazmak zorunda değilse, kıvrılma sözdizimini hatırlayın (ilk etapta kurulduğunu varsayarak), ve açık komutları ve yardımları tercih edersiniz ve belki de zaten CLI'nin daha iyi bir kavanozuna sahip olursunuz. Biz sadece orada bir betik konsolu kurulu arayüzümüz varsa, o zaman bu daha iyidir. Her zamanki gibi değişir.
kullanıcı17265

Silme boğaz tokluğuna sonsuza kadar çalıştırmak yapýlar toggleLogKeepönce doDelete.
Fancyoung

16

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

4

Jenkins Komut Dosyası-Konsolunda çalıştırılacak bir komut dosyasının şablonu. reallyDeleteSilmeden ö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}");
  }
}

1

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


Jenkins konsolu için neden bir senaryo kullanmadınız?
Aaron Digulla

Çünkü bash ile daha tanıdık. Tek sebep bu.
27'de Anyesto

Anladım. Lütfen sorunuzu düzenleyin ve sorunlardan kaçınmak için Jenkins'in daha sonra yeniden başlatılması gerektiğini ekleyin.
Aaron Digulla

0

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


Daha sonra Jenkins'i yeniden başlatmanız gerekmeyecek mi? Jenkins, bu klasörler hakkındaki bilgileri veritabanında tutarsa?
Aaron Digulla

Evet @AaronDigulla, Jenkins sunucusundaki değişiklikleri yansıtmak için Jenkins sunucusunun yeniden başlatılması gerekir.
Shubham Soin,
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.