Comment supprimer les versions 11 à 1717 de Jenkins?

51

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?

Aaron Digulla
la source
3
Un certain nombre de façons de supprimer les versions via la ligne de commande sont décrites ici: stackoverflow.com/questions/13052390/…
ThomasW

Réponses:

75

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.

Daniel Beck
la source
10
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.

salut_harry
la source
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:

java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
Jaltek
la source
4

Modèle de script à exécuter dans la console de script Jenkins. Utilisez le drapeau reallyDeletepour 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}");
  }
}
Aaron Digulla
la source
1

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

Anyesto
la source
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.

Version Python: 2.7

Shubham Soin
la source
Ne devrez-vous pas redémarrer Jenkins après? Que se passe-t-il si Jenkins conserve des informations sur ces dossiers dans une base de données?
Aaron Digulla
Oui @AaronDigulla, un redémarrage du serveur Jenkins serait nécessaire pour refléter les modifications apportées sur le portail Jenkins.
Shubham Soin