답변:
몇 가지 옵션이 있습니다.
다음 빌드가 완료 될 때 해당 빌드가 삭제되도록 작업 구성에서 유지하도록 빌드 수를 임시로 설정 ( 이전 빌드 무시 )하십시오. 다음 빌드가 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 기록을 순서대로 유지하는 플러그인을 허용하지 않습니다.
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
예를 들어 빌드를 기준으로 정렬하는 것도 간단합니다.
JobName/branch
API 호출 만하면됩니다.
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
APIToken을 가져 오려면 Jenkins> 구성> API 토큰 표시에 로그인하십시오.
toggleLogKeep
전에 실행하십시오 doDelete
.
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}");
}
}
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
이 목적을 달성하는 작은 파이썬 스크립트를 만들었습니다. 다음은 스크립트입니다.
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