¿Cómo elimino las compilaciones 11 a 1717 en Jenkins?

51

Debido a una configuración incorrecta, tengo más de 1700 compilaciones fallidas en un trabajo de Jenkins.

¿Cómo puedo limpiarlos eficientemente?

Aaron Digulla
fuente
2
Aquí se analizan varias formas de eliminar compilaciones a través de la línea de comandos: stackoverflow.com/questions/13052390/…
ThomasW

Respuestas:

74

Tienes varias opciones:

  • Establezca temporalmente el número de compilaciones para mantener en la configuración del trabajo ( Descartar compilaciones antiguas ) para que esas compilaciones se eliminen cuando finalice la próxima compilación. Si la próxima compilación es 1800, configúrela para mantener la 85 más reciente más o menos. Marque todas las compilaciones anteriores (es decir, de 1 a 10) como Mantener esta compilación para siempre antes de comenzar la próxima compilación. Esta opción no eliminará algunas compilaciones si tiene un trabajo en sentido descendente que evita que se eliminen las compilaciones en sentido ascendente (aunque no es un problema en su situación si todas fallaron).

  • Use la consola de script en Manage Jenkins . Si es un trabajo de nivel superior (no en una carpeta), lo siguiente hará el truco:

    Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }

    Por supuesto, este enfoque generalmente requiere buenas copias de seguridad. Hay muchas cosas que puedes romper usando la consola de script.

  • Elimine las carpetas de compilaciones del disco (de forma predeterminada $JENKINS_HOME/jobs/JobName/builds/, utilizando la marca de tiempo de inicio como nombre de la carpeta) y reinicie Jenkins o Vuelva a cargar la configuración desde el disco . Esta opción no permitirá complementos que, por ejemplo, mantengan el historial SVN en orden moviendo cualquier cambio a la compilación posterior para hacer su trabajo.

Daniel Beck
fuente
10
He encontrado otra solución: Usarjenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla
Hice un Gist para enumerar todos los trabajos con un recuento de compilación a través del terminal. Facilita la búsqueda de trabajos que necesitan limpieza. También podría usarse a través de cron como un informe de correo electrónico.
Nick
@Nick Consulte el complemento Groovy, específicamente el tipo de paso de compilación Groovy del sistema. No es necesario salir de Jenkins para esto, solo crea un trabajo que haga esto. jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnOrdenar por ejemplo, por compilaciones es igualmente trivial.
Daniel Beck
Para tuberías de varias sucursales, puede usar la sintaxis JobName/branch
waitinforatrain
17

Simplemente haga una llamada API:

curl -X POST http://jenkinUser:[email protected]/job/theJob/[11-1717]/doDelete

Para obtener APIToken: inicie sesión en Jenkins> Configuración> Mostrar token de API.

Hola Harry
fuente
Creo que este es el mejor enfoque para el problema. se puede ejecutar de forma remota y proporciona una amplia gama de acciones a través de REST
alfredocambera
La mejor respuesta ya que no tienes que buscar el jar en un sistema instalado.
Keith Tyler
Quise decir "no tienes que descargar nada"
Keith Tyler
"La mejor respuesta ya que no tiene que hacerlo": si su criterio no es descargar un archivo <1m, entonces esto es mejor, gracias a CLI. Si el criterio no es tener que escribir URL desordenadas con tokens de autenticación, recuerde la sintaxis de curl (suponiendo que esté instalada en primer lugar), y prefiere comandos y ayuda claros y tal vez ya tenga el jar, la CLI es mejor. Si solo tiene la interfaz allí con una consola de secuencias de comandos instalada, entonces esa es la mejor. Como de costumbre depende.
user17265
para eliminar mantener siempre compilaciones, ejecutar toggleLogKeepantes doDelete.
Fancyoung
16

Como Aaron dijo correctamente, también puede usar la CLI de Jenkins para este propósito:

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

Plantilla para ejecutar un script en Jenkins Script-Console. Use la bandera reallyDeletepara probarlo antes de eliminar realmente:

// 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
fuente
1

Me enfrenté a la misma tarea cuando me hice cargo de un servidor Jenkins, donde hay más de 150 trabajos con hasta 3000 compilaciones antiguas, así que escribí un pequeño script bash que solo mantiene las últimas 10 compilaciones:

#! /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" ;

Reiniciar Jenkins después es muy recomendable para evitar problemas. Gracias @Aaron Digulla

Anyesto
fuente
¿Por qué no usaste un script para la consola de Jenkins?
Aaron Digulla
Porque estoy más familiarizado con bash. Esa es la única razón.
Anyesto
Entendido. Edite su pregunta y agregue que Jenkins debe reiniciarse después para evitar problemas.
Aaron Digulla
0

He creado un pequeño script de Python que serviría para este propósito. El siguiente es el guión:

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 - Ruta del directorio de compilación del trabajo

  • range (start_build_no, end_build_no) - range (11, 1718) busca todas las compilaciones que van desde la compilación no. 11 para construir no. 1717. Por favor configúrelo en consecuencia.

  • shutil.rmtree (build_dir_fullpath): elimina cada directorio de compilación que se encuentre en el rango.

Versión de Python: 2.7

Shubham Soin
fuente
¿No tendrás que reiniciar Jenkins después? ¿Qué pasa si Jenkins guarda información sobre esas carpetas en una base de datos?
Aaron Digulla
Sí @AaronDigulla, sería necesario reiniciar el servidor Jenkins para reflejar los cambios en el portal Jenkins.
Shubham Soin