Come cancello le build dall'11 al 1717 in Jenkins?


Risposte:


74

Hai diverse opzioni:

  • Imposta temporaneamente il numero di build da conservare nella configurazione del lavoro ( Elimina vecchie build ) in modo che tali build vengano eliminate al termine della build successiva. Se la build successiva è 1800, impostala per mantenere le 85 più recenti circa. Contrassegna tutte le build precedenti (ovvero da 1 a 10) come Mantieni questa build per sempre prima di iniziare la build successiva. Questa opzione non riuscirà a eliminare alcune build se si dispone di un processo a valle che impedisce l'eliminazione delle build a monte (non è un problema nella situazione se tutte falliscono).

  • Utilizzare la Console degli script in Gestisci Jenkins . Se si tratta di un lavoro di livello superiore (non in una cartella), il trucco sarà il seguente:

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

    Naturalmente, questo approccio richiede generalmente buoni backup. Ci sono molte cose che puoi rompere usando la console degli script.

  • Elimina le cartelle delle build dal disco (per impostazione predefinita in $JENKINS_HOME/jobs/JobName/builds/, utilizzando il timestamp di inizio come nome della cartella) e riavvia Jenkins o Ricarica configurazione dal disco . Questa opzione non consentirà plug-in che, ad esempio, mantengano in ordine la cronologia SVN spostando eventuali modifiche alla build successiva per fare il loro lavoro.


10
Ho trovato un'altra soluzione: usarejenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla il

Creato un elenco per elencare tutti i lavori con un numero di build tramite il terminale. Semplifica la ricerca di lavori che devono essere ripuliti. Potrebbe essere utilizzato anche tramite cron come rapporto e-mail.
Nick,

@Nick Scopri il plug-in Groovy, in particolare il tipo di passaggio di build del sistema Groovy. Non c'è bisogno di uscire da Jenkins per questo, basta creare un lavoro che faccia questo. jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnL'ordinamento, ad esempio per build, è altrettanto banale.
Daniel Beck

Per le condutture multi-ramo è possibile utilizzare la sintassi JobName/branch
waitinforatrain

17

Basta effettuare una chiamata API:

curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete

Per ottenere l'APIToken: accedi a Jenkins> Configurazione> Mostra token API.


Penso che questo sia l'approccio migliore al problema. può essere eseguito in remoto e fornisce una vasta gamma di azioni tramite REST
alfredocambera

La migliore risposta in quanto non è necessario andare alla ricerca del vaso su un sistema installato.
Keith Tyler,

Intendevo "non devi scaricare nulla"
Keith Tyler,

"La migliore risposta poiché non è necessario" - se il tuo criterio non è quello di scaricare un file <1m di questo è meglio grazie alla CLI. Se i criteri non devono digitare URL disordinati con token di autenticazione, ricorda la sintassi curl (supponendo che sia installata in primo luogo) e preferisci comandi e aiuti chiari e forse hai già il vaso, la CLI è migliore. Se hai solo l'interfaccia che abbiamo lì con una console di scripting installata, quella è la migliore. Come al solito dipende.
user17265,

per eliminare mantieni build per sempre, esegui toggleLogKeepprima doDelete.
Fancyoung,


4

Modello per l'esecuzione di uno script nella Jenkins Script-Console. Utilizzare il flag reallyDeleteper testarlo prima di eliminare effettivamente:

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

Ho dovuto affrontare lo stesso compito quando ho assunto un server Jenkins, dove ci sono poco più di 150 lavori con un massimo di 3000 build precedenti, quindi ho scritto un piccolo script bash che mantiene solo le ultime 10 build:

#! /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" ;

Il riavvio successivo di Jenkins è altamente raccomandato per evitare problemi. Grazie @Aaron Digulla


Perché non hai usato uno script per la console Jenkins?
Aaron Digulla,

Perché ho più familiarità con bash. Questa è l'unica ragione.
Anyesto

Inteso. Modifica la tua domanda e aggiungi che Jenkins deve essere riavviato in seguito per evitare problemi.
Aaron Digulla,

0

Ho creato un piccolo script Python che avrebbe servito a questo scopo. Di seguito è riportato lo script:

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 - Percorso della directory di creazione del lavoro

  • range (start_build_no, end_build_no) - range (11, 1718) cerca tutte le build che vanno dalla build n. 11 per costruire n. 1717. Si prega di impostare di conseguenza.

  • shutil.rmtree (build_dir_fullpath): elimina ogni directory di build che si trova nell'intervallo.

Versione Python: 2.7


Non dovrai riavviare Jenkins in seguito? Cosa succede se Jenkins conserva informazioni su tali cartelle in un database?
Aaron Digulla,

Sì @AaronDigulla, un riavvio del server Jenkins sarebbe necessario per riflettere le modifiche sul portale Jenkins.
Shubham Soin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.