61 votes

Comment supprimer les builds 11 à 1717 dans Jenkins ?

En raison d'une mauvaise configuration, j'ai plus de 1700 échecs de construction dans une tâche Jenkins.

Comment puis-je les nettoyer efficacement ?

91voto

Daniel Beck Points 105590

Vous avez plusieurs possibilités :

  • Définir temporairement le nombre de builds à conserver dans la configuration de la tâche ( Jeter les anciennes constructions ) afin que ces builds soient supprimés lorsque le prochain build se termine. Si le prochain build est 1800, configurez-le pour garder le plus récent 85 ou plus. Marquez tous les builds plus anciens (i.e. 1 à 10) comme Gardez cette construction pour toujours avant de commencer la prochaine construction. Cette option ne parviendra pas à supprimer certains builds si vous avez un travail en aval qui empêche la suppression des builds en amont (ce n'est pas un problème dans votre situation si tous les builds ont échoué).

  • Utilisez le script Console en Gérer Jenkins . S'il s'agit d'un travail de premier niveau (pas dans un dossier), ce qui suit 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 script.

  • Supprimer les dossiers des constructions du disque (par défaut dans $JENKINS_HOME/jobs/JobName/builds/ (en utilisant l'horodatage de départ comme nom de dossier) et redémarrer Jenkins, ou bien Recharger la configuration à partir du disque . Cette option ne permettra pas aux plugins qui, par exemple, gardent l'historique SVN en ordre en déplaçant tous les changements vers le build suivant de faire leur travail.

24voto

hello_harry Points 351

Il suffit de faire un appel à l'API :

curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete

Pour obtenir l'APIToken : connectez-vous à Jenkins > Configuration > Show API Token.

17voto

Wasteland Points 127

Comme Aaron indiqué correctement, vous pouvez également utiliser le CLI de Jenkins à cette fin :

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

7voto

Aaron Digulla Points 6565

Modèle pour un script à exécuter dans la script de Jenkins. Utilisez le drapeau reallyDelete pour le tester avant de l'effacer :

// 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 = job.getBuilds(rs);
println("Found ${builds.size()} builds");
builds.each{ b-> 
  if (reallyDelete) {
    println("Deleting ${b}");
    b.delete();
  } else {
    println("Found match ${b}");
  }
}

3voto

Anyesto Points 31

J'ai été confronté à la même tâche lorsque j'ai pris en charge un serveur Jenkins, où il y a un peu plus de 150 jobs avec jusqu'à 3000 anciennes builds, j'ai donc écrit un petit bash script qui ne conserve que les 10 dernières builds :

#! /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 fortement recommandé de redémarrer Jenkins par la suite pour éviter les problèmes. Thx @Aaron Digulla

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X