Jenkins에서 빌드 11에서 1717을 어떻게 삭제합니까?


답변:


74

몇 가지 옵션이 있습니다.

  • 다음 빌드가 완료 될 때 해당 빌드가 삭제되도록 작업 구성에서 유지하도록 빌드 수를 임시로 설정 ( 이전 빌드 무시 )하십시오. 다음 빌드가 1800이면 최신 85 정도를 유지하도록 설정하십시오. 다음 빌드를 시작하기 전에 모든 이전 빌드 (예 : 1-10)를 이 빌드를 영원히 유지 로 표시 하십시오 . 이 옵션은 업스트림 빌드가 삭제되지 않도록하는 다운 스트림 작업이있는 경우 일부 빌드를 삭제하지 못합니다 (모두 실패한 경우에는 문제가되지 않음).

  • Jenkins 관리 에서 스크립트 콘솔 을 사용하십시오 . 폴더가 아닌 최상위 작업 인 경우 다음이 트릭을 수행합니다.

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

    물론이 방법은 일반적으로 백업이 필요합니다. 스크립트 콘솔을 사용하면 많은 것을 깨뜨릴 수 있습니다.

  • 디스크에서 빌드 폴더를 삭제하고 (기본적으로 $JENKINS_HOME/jobs/JobName/builds/시작 타임 스탬프를 폴더 이름으로 사용) Jenkins 또는 디스크에서 구성 다시로드를 다시 시작하십시오 . 이 옵션은 변경 사항을 후속 빌드로 이동하여 작업을 수행하여 SVN 기록을 순서대로 유지하는 플러그인을 허용하지 않습니다.


10
다른 해결책을 찾았습니다 : Usingjenkins-cli.jar -s ... delete-builds envjs 11-1717
Aaron Digulla

터미널을 통해 빌드 수와 함께 모든 작업을 나열하도록 요점을 만들었습니다. 정리가 필요한 작업을 쉽게 찾을 수 있습니다. cron을 통해 이메일 보고서로도 사용될 수 있습니다.
Nick

@Nick Groovy 플러그인, 특히 시스템 Groovy 빌드 단계 유형을 확인하십시오. 이를 위해 Jenkins 외부로 갈 필요가 없습니다.이 작업을 수행하십시오. jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; return예를 들어 빌드를 기준으로 정렬하는 것도 간단합니다.
Daniel Beck

여러 가지 파이프 라인을 위해 당신은 구문을 사용할 수 있습니다 JobName/branch
waitinforatrain

17

API 호출 만하면됩니다.

curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete

APIToken을 가져 오려면 Jenkins> 구성> API 토큰 표시에 로그인하십시오.


이것이 이것이 문제에 대한 최선의 접근법이라고 생각합니다. 원격으로 실행할 수 있으며 REST를 통해 광범위한 작업을 제공합니다.
alfredocambera

설치된 시스템에서 jar를 검색 할 필요가 없으므로 최상의 답변입니다.
Keith Tyler

"아무것도 다운로드 할 필요가 없습니다"
Keith Tyler

"필요하지 않기 때문에 최고의 답변"-기준보다 <1m 파일을 다운로드하지 않으면 CLI를 사용하는 것이 좋습니다. 기준이 인증 토큰으로 지저분한 URL을 입력하지 않아도되는 경우 curl 구문을 기억하십시오 (처음에 설치되었다고 가정). 명확한 명령과 도움을 원할 수도 있고 이미 항아리가있는 경우 CLI가 더 좋습니다. 우리가 스크립팅 콘솔이 설치된 인터페이스를 가지고 있다면 그 것이 더 좋습니다. 평소와 같이 다릅니다.
user17265

delete keep forever 빌드는 toggleLogKeep전에 실행하십시오 doDelete.
Fancyoung

16

으로 아론이 언급 제대로 당신은 또한 사용할 수 있습니다 젠킨스 CLI를 이 목적을 위해 :

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

4

Jenkins Script-Console에서 실행할 스크립트 템플릿. reallyDelete실제로 삭제하기 전에 플래그 를 사용하여 테스트하십시오.

// 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}");
  }
}

1

Jenkins 서버를 인수 할 때 동일한 작업에 직면했습니다. 여기서 3000 개의 오래된 빌드로 150 개가 넘는 작업이 있으므로 마지막 10 빌드 만 유지하는 작은 bash 스크립트를 작성했습니다.

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

문제를 방지하려면 나중에 Jenkins를 다시 시작하는 것이 좋습니다. Thx @Aaron Digulla


Jenkins 콘솔에 스크립트를 사용하지 않은 이유는 무엇입니까?
Aaron Digulla

bash에 더 익숙하기 때문입니다. 그게 유일한 이유야
Anyesto

이해했다. 질문을 편집하고 문제를 피하려면 나중에 Jenkins를 다시 시작해야한다고 추가하십시오.
Aaron Digulla

0

이 목적을 달성하는 작은 파이썬 스크립트를 만들었습니다. 다음은 스크립트입니다.

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-작업 빌드 디렉토리의 경로

  • range (start_build_no, end_build_no)-range (11, 1718)는 빌드 번호에서 모든 빌드를 찾습니다. 11 번 건설하십시오. 1717. 적절히 설정하십시오.

  • shutil.rmtree (build_dir_fullpath)-범위 내에있는 각 빌드 디렉토리를 삭제합니다.

파이썬 버전 : 2.7


나중에 Jenkins를 다시 시작하지 않아도 되나요? Jenkins가 해당 폴더에 대한 정보를 데이터베이스에 보관하면 어떻게됩니까?
Aaron Digulla

예. @AaronDigulla, Jenkins 서버를 다시 시작해야 Jenkins 포털의 변경 사항이 반영됩니다.
Shubham Soin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.