A causa di un'errata configurazione, ho oltre 1700 build fallite in un lavoro Jenkins.
Come posso pulirle in modo efficiente?
A causa di un'errata configurazione, ho oltre 1700 build fallite in un lavoro Jenkins.
Come posso pulirle in modo efficiente?
Risposte:
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.
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
L'ordinamento, ad esempio per build, è altrettanto banale.
JobName/branch
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.
toggleLogKeep
prima doDelete
.
Come affermato correttamente da Aaron , puoi anche utilizzare l' interfaccia della riga di comando Jenkins per questo scopo:
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
Modello per l'esecuzione di uno script nella Jenkins Script-Console. Utilizzare il flag reallyDelete
per 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}");
}
}
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
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