Como faço para excluir as versões 11 a 1717 no Jenkins?

51

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?

Aaron Digulla
fonte
2
Uma série de maneiras de apagar constrói via linha de comando são discutidos aqui: stackoverflow.com/questions/13052390/...
Thomasw

Respostas:

74

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.

Daniel Beck
fonte
10
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.

hello_harry
fonte
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:

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

Modelo para um script para ser executado no Jenkins Script-Console. Use o sinalizador reallyDeletepara 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}");
  }
}
Aaron Digulla
fonte
1

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

Anyesto
fonte
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.

Versão Python: 2.7

Shubham Soin
fonte
Você não precisará reiniciar o Jenkins depois? E se Jenkins mantiver informações sobre essas pastas em um banco de dados?
Aaron Digulla
Sim @AaronDigulla, seria necessário reiniciar o servidor Jenkins para refletir as alterações no portal Jenkins.
Shubham Soin