Aufgrund einer Fehlkonfiguration habe ich über 1700 fehlgeschlagene Builds in einem Jenkins-Job.
Wie kann ich sie effizient reinigen?
Aufgrund einer Fehlkonfiguration habe ich über 1700 fehlgeschlagene Builds in einem Jenkins-Job.
Wie kann ich sie effizient reinigen?
Antworten:
Sie haben mehrere Möglichkeiten:
Legen Sie vorübergehend die Anzahl der Builds fest, die in der Auftragskonfiguration beibehalten werden sollen ( Alte Builds verwerfen ), damit diese Builds nach Abschluss des nächsten Builds gelöscht werden. Wenn der nächste Build 1800 ist, stellen Sie ihn so ein, dass die letzten 85 oder so erhalten bleiben. Markieren Sie alle älteren Builds (dh 1 bis 10) als Keep This Build Forever, bevor Sie mit dem nächsten Build beginnen. Diese Option löscht einige Builds nicht, wenn Sie einen Downstream-Job haben, der das Löschen von Upstream-Builds verhindert (in Ihrer Situation kein Problem, wenn alle fehlgeschlagen sind).
Verwenden Sie die Skriptkonsole in Jenkins verwalten . Wenn es sich um einen Job der obersten Ebene handelt (nicht in einem Ordner), reicht Folgendes aus:
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
Natürlich erfordert dieser Ansatz im Allgemeinen gute Backups. Es gibt eine Menge, die Sie mit der Skriptkonsole unterbrechen können.
Löschen Sie die Build-Ordner von der Festplatte (standardmäßig in $JENKINS_HOME/jobs/JobName/builds/
, wobei der Startzeitstempel als Ordnername verwendet wird) und starten Sie Jenkins neu oder laden Sie die Konfiguration von der Festplatte neu . Diese Option lässt keine Plugins zu, die z. B. den SVN-Verlauf beibehalten, indem sie Änderungen in den nachfolgenden Build verschieben, um ihren Job zu erledigen.
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
Sortierung zB nach Builds ist ähnlich trivial.
JobName/branch
Machen Sie einfach einen API-Aufruf:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
So rufen Sie den APIToken ab: Melden Sie sich bei Jenkins> Konfiguration> API-Token anzeigen an.
toggleLogKeep
vorher ausführen doDelete
.
Wie Aaron richtig sagte, können Sie auch die Jenkins-CLI für diesen Zweck verwenden:
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
Vorlage für ein Skript zur Ausführung in der Jenkins Script-Console. Verwenden Sie das Flag reallyDelete
, um es zu testen, bevor Sie es tatsächlich löschen:
// 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}");
}
}
Die gleiche Aufgabe wurde mir gestellt, als ich einen Jenkins-Server übernahm, auf dem es etwas mehr als 150 Jobs mit bis zu 3000 alten Builds gibt. Deshalb habe ich ein kleines Bash-Skript geschrieben, das nur die letzten 10 Builds enthält:
#! /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" ;
Es wird dringend empfohlen, Jenkins danach neu zu starten, um Probleme zu vermeiden. Vielen Dank an Aaron Digulla
Ich habe ein kleines Python-Skript erstellt, das diesem Zweck dienen würde. Es folgt das Skript:
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 - Pfad des Build-Verzeichnisses des Jobs
range (start_build_no, end_build_no) - range (11, 1718) sucht nach allen Builds ab Build-Nr. 11 zu bauen nr. 1717. Bitte stellen Sie es entsprechend ein.
shutil.rmtree (build_dir_fullpath) - löscht jedes Build-Verzeichnis, das sich im Bereich befindet.
Python-Version: 2.7