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:
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.
J'ai trouvé une autre solution: Utiliserjenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla
Fait un Gist pour lister tous les travaux avec un nombre de build via le terminal. Il est plus facile de trouver des emplois qui doivent être nettoyés. Peut aussi être utilisé via cron comme rapport par email.
Nick
@Nick Découvrez le plug-in Groovy, en particulier le type d'étape de construction Groovy du système. Pas besoin d'aller à l'extérieur de Jenkins pour cela, créez simplement un travail qui le fasse. jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnLe tri, par exemple par construction, est également trivial.
Daniel Beck
Pour les pipelines multi-branches, vous pouvez utiliser la syntaxe JobName/branch
waitinforatrain Le
17
Faites simplement un appel API:
curl -X POST http://jenkinUser:[email protected]/job/theJob/[11-1717]/doDelete
Pour obtenir l'APIToken: connectez-vous à Jenkins> Configuration> Afficher le jeton de l'API.
Je pense que c'est la meilleure approche au problème. il peut être exécuté à distance a fournit un large éventail d’actions via REST
alfredocambera
Meilleure réponse puisque vous n'avez pas à chercher le pot sur un système installé.
Keith Tyler
Je voulais dire "vous n'avez rien à télécharger"
Keith Tyler
"Meilleure réponse puisque vous n'avez pas à le faire" - si vos critères ne sont pas de télécharger un fichier de moins d'un mètre, cela est préférable, merci CLI. Si le critère ne nécessite pas de taper des URL en désordre avec des jetons d'authentification, souvenez-vous de la syntaxe curl (en supposant qu'elle soit installée en premier lieu), et si vous préférez des commandes claires et des aides et peut-être que vous avez déjà le pot que la CLI est meilleure. Si vous n’avez que l’interface we avec une console de script installée, celle-ci est la meilleure. Comme d'habitude cela dépend.
user17265
pour supprimer, gardez toujours les constructions, exécutez toggleLogKeepavant doDelete.
Fancyoung
16
Comme Aaron l’ a bien dit, vous pouvez également utiliser la CLI Jenkins à cette fin:
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
Pourquoi n'avez-vous pas utilisé de script pour la console Jenkins?
Aaron Digulla
Parce que je suis plus familier avec bash. C'est la seule raison.
Anyesto
Compris. Veuillez modifier votre question et ajouter que Jenkins doit être redémarré ultérieurement pour éviter les problèmes.
Aaron Digulla
0
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.
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:
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.la source
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:[email protected]/job/theJob/[11-1717]/doDelete
Pour obtenir l'APIToken: connectez-vous à Jenkins> Configuration> Afficher le jeton de l'API.
la source
toggleLogKeep
avantdoDelete
.Comme Aaron l’ a bien dit, vous pouvez également utiliser la CLI Jenkins à cette fin:
la source
Modèle de script à exécuter dans la console de script Jenkins. Utilisez le drapeau
reallyDelete
pour le tester avant de supprimer:la source
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:
Il est vivement recommandé de redémarrer Jenkins par la suite pour éviter les problèmes. Merci @Aaron Digulla
la source
J'ai créé un petit script python qui servirait cet objectif. Voici le script:
delete_jenkins_builds.py
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
la source