Devido a uma configuração incorreta, tenho mais de 1700 compilações com falha em um trabalho de Jenkins.
Como posso limpá-los com eficiência?
Devido a uma configuração incorreta, tenho mais de 1700 compilações com falha em um trabalho de Jenkins.
Como posso limpá-los com eficiência?
Respostas:
Você tem várias opções:
Defina temporariamente o número de construções a serem mantidas na configuração da tarefa ( Descartar construções antigas ) para que essas construções sejam excluídas quando a próxima construção terminar. Se a próxima compilação for 1800, defina-a para manter as 85 mais recentes. Marque todas as compilações mais antigas (ou seja, 1 a 10) como Manter esta compilação para sempre antes de iniciar a próxima compilação. Esta opção falhará ao excluir algumas construções se você tiver um trabalho a jusante que impeça a exclusão de construções a montante (não é um problema na sua situação se todas elas falharem).
Use o console de scripts em Manage Jenkins . Se for um trabalho de nível superior (não está em uma pasta), o seguinte fará o truque:
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
Obviamente, essa abordagem geralmente requer bons backups. Você pode quebrar muito usando o console de scripts.
Exclua as pastas das compilações do disco (por padrão $JENKINS_HOME/jobs/JobName/builds/
, usando o carimbo de hora de início como nome da pasta) e reinicie o Jenkins ou Recarregar configuração do disco . Esta opção não permitirá plug-ins que, por exemplo, mantêm o histórico do SVN em ordem, movendo as alterações para a compilação subsequente para realizar seu trabalho.
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
Classificar, por exemplo, por compilações, é igualmente trivial.
JobName/branch
Basta fazer uma chamada de API:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
Para obter o APIToken: efetue login em Jenkins> Configuração> Mostrar token da API.
toggleLogKeep
antes doDelete
.
Modelo para um script para ser executado no Jenkins Script-Console. Use o sinalizador reallyDelete
para testá-lo antes de excluir:
// 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}");
}
}
Eu tive a mesma tarefa quando assumi um servidor Jenkins, onde há pouco mais de 150 trabalhos com até 3000 compilações antigas, então escrevi um pequeno script bash que mantém apenas as últimas 10 compilações:
#! /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" ;
É recomendável reiniciar o Jenkins posteriormente para evitar problemas. Thx @Aaron Digulla
Eu criei um pequeno script python que serviria a esse propósito. A seguir está o 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 - Caminho do diretório de construção da tarefa
range (start_build_no, end_build_no) - range (11, 1718) procura todas as construções que vão desde a construção no. 11 para construir não. 1717. Por favor, defina-o em conformidade.
shutil.rmtree (build_dir_fullpath) - exclui cada diretório de construção que está no intervalo.
Versão Python: 2.7