A cause d'une mauvaise configuration, j'ai plus de 1700 builds échoués dans un job de Jenkins.
Comment puis-je les nettoyer efficacement?
A cause d'une mauvaise configuration, j'ai plus de 1700 builds échoués dans un job de Jenkins.
Comment puis-je les nettoyer efficacement?
Réponses:
Vous avez plusieurs options:
Définissez temporairement le nombre de constructions à conserver dans la configuration du travail ( Supprimer les anciennes constructions ) afin qu'elles soient supprimées à la fin de la prochaine construction. Si la prochaine version est 1800, configurez-la pour conserver les 85 ou plus récentes. Marquez toutes les versions plus anciennes (1 à 10) comme Conserver cette version pour toujours avant de commencer la prochaine. Cette option échouera à la suppression de certaines générations si vous avez un travail en aval qui empêche la suppression des générations en amont (ce qui ne pose pas de problème si toutes les tâches échouent).
Utilisez la console de script dans Manage Jenkins . S'il s'agit d'un travail de niveau supérieur (pas dans un dossier), voici ce qui fera l'affaire:
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
Bien sûr, cette approche nécessite généralement de bonnes sauvegardes. Il y a beaucoup de choses que vous pouvez casser en utilisant la console de script.
Supprimez les dossiers des versions du disque (par défaut $JENKINS_HOME/jobs/JobName/builds/
, en utilisant l’horodatage de début comme nom de dossier) et redémarrez Jenkins ou Reload Configuration From Disk . Cette option n'autorise pas les plug-ins qui, par exemple, conservent l'historique SVN en déplaçant les modifications apportées à la construction suivante pour qu'elles remplissent leur tâche.
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
Le tri, par exemple par construction, est également trivial.
JobName/branch
Faites simplement un appel API:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
Pour obtenir l'APIToken: connectez-vous à Jenkins> Configuration> Afficher le jeton de l'API.
toggleLogKeep
avant doDelete
.
Comme Aaron l’ a bien dit, vous pouvez également utiliser la CLI Jenkins à cette fin:
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
Modèle de script à exécuter dans la console de script Jenkins. Utilisez le drapeau reallyDelete
pour le tester avant de supprimer:
// 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}");
}
}
J'étais confronté à la même tâche lorsque j'ai repris un serveur Jenkins, où il y a un peu plus de 150 emplois avec jusqu'à 3 000 anciennes versions, alors j'ai écrit un petit script bash qui ne conserve que les 10 dernières versions:
#! /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 est vivement recommandé de redémarrer Jenkins par la suite pour éviter les problèmes. Merci @Aaron Digulla
J'ai créé un petit script python qui servirait cet objectif. Voici le 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 - Chemin du répertoire de construction du travail
range (start_build_no, end_build_no) - range (11, 1718) recherche toutes les versions allant de la version no. 11 pour construire non. 1717. Veuillez le régler en conséquence.
shutil.rmtree (build_dir_fullpath) - supprime chaque répertoire de construction qui se trouve dans la plage.
Version Python: 2.7