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:
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.
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.
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:
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
¿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.
Respuestas:
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:
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.fuente
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
Ordenar por ejemplo, por compilaciones es igualmente trivial.JobName/branch
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.
fuente
toggleLogKeep
antesdoDelete
.Como Aaron dijo correctamente, también puede usar la CLI de Jenkins para este propósito:
fuente
Plantilla para ejecutar un script en Jenkins Script-Console. Use la bandera
reallyDelete
para probarlo antes de eliminar realmente:fuente
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:
Reiniciar Jenkins después es muy recomendable para evitar problemas. Gracias @Aaron Digulla
fuente
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
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
fuente