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:
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.
Encontrei outra solução: Usandojenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla
Criou um Gist para listar todos os trabalhos com uma contagem de compilação pelo terminal. Torna mais fácil encontrar trabalhos que precisam de limpeza. Também pode ser usado via cron como um relatório de email.
Nick
@ Nick Confira o plug-in Groovy, especificamente o tipo de etapa de construção do sistema Groovy. Não há necessidade de sair do Jenkins para isso, basta criar um trabalho que faça isso. jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnClassificar, por exemplo, por compilações, é igualmente trivial.
Daniel Beck
Para pipelines com várias ramificações, você pode usar a sintaxe JobName/branch
waitinforatrain
17
Basta fazer uma chamada de API:
curl -X POST http://jenkinUser:[email protected]/job/theJob/[11-1717]/doDelete
Para obter o APIToken: efetue login em Jenkins> Configuração> Mostrar token da API.
Eu acho que essa é a melhor abordagem para o problema. ele pode ser executado remotamente um fornece uma ampla gama de ações via RESTO
alfredocambera
Melhor resposta, pois você não precisa procurar o jar em um sistema instalado.
Keith Tyler
Eu quis dizer "você não precisa baixar nada"
Keith Tyler
"Melhor resposta, pois você não precisa" - se o seu critério não for baixar um arquivo <1m, é melhor agradecer à CLI. Se o critério não precisar digitar URLs confusos com tokens de autenticação, lembre-se da sintaxe curl (assumindo que esteja instalada em primeiro lugar) e você prefira comandos e ajuda claros e talvez você já tenha o jar, a CLI é melhor. Se você tiver apenas a interface lá com um console de script instalado, esse será o melhor. Como sempre, depende.
precisa saber é o seguinte
para excluir, mantenha para sempre compilações, execute toggleLogKeepantes doDelete.
Fancyoung 28/04
16
Como Aaron afirmou corretamente, você também pode usar a CLI do Jenkins para esta finalidade:
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
Por que você não usou um script para o console Jenkins?
Aaron Digulla 27/03
Porque eu estou mais familiarizado com o bash. Essa é a única razão.
Anyesto
Entendido. Edite sua pergunta e adicione que o Jenkins deve ser reiniciado posteriormente para evitar problemas.
Aaron Digulla 27/03
0
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.
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:
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.fonte
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:[email protected]/job/theJob/[11-1717]/doDelete
Para obter o APIToken: efetue login em Jenkins> Configuração> Mostrar token da API.
fonte
toggleLogKeep
antesdoDelete
.Como Aaron afirmou corretamente, você também pode usar a CLI do Jenkins para esta finalidade:
fonte
Modelo para um script para ser executado no Jenkins Script-Console. Use o sinalizador
reallyDelete
para testá-lo antes de excluir:fonte
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:
É recomendável reiniciar o Jenkins posteriormente para evitar problemas. Thx @Aaron Digulla
fonte
Eu criei um pequeno script python que serviria a esse propósito. A seguir está o script:
delete_jenkins_builds.py
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
fonte