Answers:
你有几个选择:
临时设置要保留在作业配置中的构建数(Discard Old Builds),以便在下一个构建完成时删除这些构建。如果下一个版本是1800,请将其设置为保持最近的85左右。在开始下一个构建之前,将所有较旧的构建(即1到10)标记为Keep This Build Forever。如果您有一个下游作业阻止上游构建被删除,则此选项将无法删除某些构建(如果所有这些构建都失败,则不会出现问题)。
使用脚本控制台的管理詹金斯。如果它是顶级作业(不在文件夹中),则以下操作将起作用:
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
。
正如Aaron所说,你也可以使用Jenkins CLI来达到这个目的:
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
用于在Jenkins脚本控制台中运行的脚本的模板。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服务器时,我面临同样的任务,那里只有超过150个旧版本的作业,所以我编写了一个小的bash脚本,只保留了最后10个版本:
#! /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
我已经创建了一个小的python脚本来实现这个目的。以下是脚本:
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 - Job的构建目录的路径
range(start_build_no,end_build_no) - range(11,1718)查找build no的所有构建版本。11建立没有。1717.请相应地设置。
shutil.rmtree(build_dir_fullpath) - 删除范围内的每个构建目录。
Python版本:2.7