Comment supprimer les versions 11 à 1717 de Jenkins?


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.


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:jenkinAPIToken@yourJenkinsURl.com/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:

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

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}");
  }
}

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


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.