如何在Jenkins中删除构建11到1717?


Answers:


72

你有几个选择:

  • 临时设置要保留在作业配置中的构建数(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历史记录的顺序。


10
我找到了另一种解决方案:使用jenkins-cli.jar -s ... delete-builds envjs 11-1717
亚伦Digulla

制作要点通过终端列出所有具有构建计数的作业。使找到需要清理的工作变得更容易。可以通过cron用作电子邮件报告。
尼克

@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令牌。


我认为这是解决问题的最佳方法。它可以远程执行a通过REST提供广泛的行动
alfredocambera 2015年

最好的答案,因为您不必在已安装的系统上搜索jar。
Keith Tyler

我的意思是“你不必下载任何东西”
Keith Tyler

“最好的答案,因为你不必” - 如果你的标准是不下载<1m文件比这更好谢谢CLI。如果标准不必输入带有auth令牌的凌乱网址,请记住curl语法(假设它首先安装),并且您更喜欢清除命令和帮助,也许您已经拥有了更好的CLI。如果你只有安装了脚本控制台的界面,那么那个更好。像往常一样取决于。
user17265年

for delete keep forever build,toggleLogKeep之前运行doDelete
Fancyoung

16

正如Aaron所说,你也可以使用Jenkins CLI来达到这个目的:

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

4

用于在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}");
  }
}

1

当我接管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


为什么不为Jenkins控制台使用脚本?
Aaron Digulla

因为我对bash比较熟悉。这是唯一的原因。
Anyesto

了解。请编辑您的问题并添加之后必须重新启动Jenkins以避免出现问题。
Aaron Digulla

0

我已经创建了一个小的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


之后你不必重启詹金斯吗?如果Jenkins在数据库中保存有关这些文件夹的信息怎么办?
Aaron Digulla 2017年

是的@AaronDigulla,需要重新启动Jenkins服务器以反映Jenkins门户网站上的更改。
Shubham Soin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.