如何删除Jenkins日志但保留生成?

如何删除Jenkins日志但保留生成?,jenkins,Jenkins,我们有生成大量日志的构建。这需要空间,因此我们必须告诉詹金斯删除旧版本。这是一个问题,因为我们因此失去了长期统计数据 我正在考虑删除或清空每个超过一周的版本的“日志”文件,并告诉Jenkins不要删除旧版本 有没有一种干净的方法可以达到同样的效果?我看到有一个删除日志插件,但我没有亲自使用它 然而,在我的工作中,我做了类似的事情,只是创建了另一个作业,它进入Jenkins主服务器,对构建进行排序,选择需要清理的构建,并删除日志文件。使用任何脚本语言都应该非常容易 还没有找到一种真正干净的方法,

我们有生成大量日志的构建。这需要空间,因此我们必须告诉詹金斯删除旧版本。这是一个问题,因为我们因此失去了长期统计数据

我正在考虑删除或清空每个超过一周的版本的“日志”文件,并告诉Jenkins不要删除旧版本


有没有一种干净的方法可以达到同样的效果?

我看到有一个删除日志插件,但我没有亲自使用它


然而,在我的工作中,我做了类似的事情,只是创建了另一个作业,它进入Jenkins主服务器,对构建进行排序,选择需要清理的构建,并删除日志文件。使用任何脚本语言都应该非常容易

还没有找到一种真正干净的方法,但是从Jenkins内部使用groovy可以说比从Jenkins外部的文件系统中删除更干净

这个示例groovy脚本将从“test_dummy”作业的构建中删除超过180天的所有日志

import jenkins.model.*;
def days = 180
def jobName = "test_dummy"
def j = Jenkins.instance.getItemByFullName(jobName);
j.getBuilds().byTimestamp(1, System.currentTimeMillis() - (1000L * 60 * 60 * 24 * days)).each { it.getLogFile().delete(); it.getLogFile().createNewFile() }
因此,获取作业,获取时间戳范围内的所有构建,然后获取并删除所有日志文件。我还将在它们的位置创建一个空文件,尽管我确信如果我深入挖掘,我可以找到一种方法,将其截断为0


使用Jenkins getJobNames(),您可以获得Jenkins中的所有作业,然后根据需要循环执行它们。根据备份方式的不同,您可以在备份之前将其绑定到运行,以节省空间。

很惊讶这不是一个插件,但使用Caleb的回答,我扩展了它以适合我们的情况。这里有很多遗漏的细节,在过去几年里詹金斯的情况发生了变化,所以我正在创造一个新的答案

  • 确保在
    Jenkins>Global Tool Configuration>groovy
    下声明了groovy安装
  • 创建一个新的自由式作业(我称之为我们的
    cleanlogs
  • Build Triggers
    下,将
    定期构建设置为
    H***
    每天运行
  • Build>addbuildstep
    下选择executesystemgroovyscript 不要选择执行Groovy脚本。这将导致大量的咒骂

  • 选择
    Groovy命令
    ,然后将此脚本粘贴到:
  • 该脚本现在将每天运行,并删除Jenkins中所有项目的3天以前的日志。它还将记录正在清理的项目。如果要跳过项目,只需与作业名称匹配并跳过即可

    最终设置如下所示:


    我在试图弄明白这一点时遇到了难题

    • 必须指定导入hudson.model.*
      导入jenkins.model.*
    • 您必须使用
      执行系统Groovy脚本
      ,而不是
      执行Groovy脚本

    我想分享我使用的另一个脚本:

    import hudson.model.Job
    import jenkins.model.Jenkins
    
    // Delete old logs that fills up the disk on the master node.
    // Run this from the Jenkins console (Manage Jenkins, Manage Nodes, master, Script Console)
    
    //def itemNameMatcher = "/"
    //def itemNameMatcher = "Fortify_Scan/covid-portal/"
    def itemNameMatcher = "Sonar_Scan/"
    def numBuildsKeepLogs = 2
    
    def totalSize = 0
    println("************************************************** START ***************************************************************")
    Jenkins.instance.getAllItems(Job.class).each { job ->
        if ((job.fullName =~ itemNameMatcher).find()) {
            def recent = job.getBuilds().limit(numBuildsKeepLogs)
            for (build in job.getBuilds()) {
                if (!recent.contains(build)) {
                    try {
                        File logFile = build.getLogFile()
                        totalSize += logFile.length()
                        println("$logFile, ${logFile.length()}")
                        logFile.delete()
                        logFile.createNewFile()
                    }catch(e){
                        println("Unable to delete the log for $build. An exception happened: $e")
                    }
                }
            }
        }
    }
    println "Total size: ${totalSize}"
    return "************************************************* END ******************************************************************"
    
    import hudson.model.Job
    import jenkins.model.Jenkins
    
    // Delete old logs that fills up the disk on the master node.
    // Run this from the Jenkins console (Manage Jenkins, Manage Nodes, master, Script Console)
    
    //def itemNameMatcher = "/"
    //def itemNameMatcher = "Fortify_Scan/covid-portal/"
    def itemNameMatcher = "Sonar_Scan/"
    def numBuildsKeepLogs = 2
    
    def totalSize = 0
    println("************************************************** START ***************************************************************")
    Jenkins.instance.getAllItems(Job.class).each { job ->
        if ((job.fullName =~ itemNameMatcher).find()) {
            def recent = job.getBuilds().limit(numBuildsKeepLogs)
            for (build in job.getBuilds()) {
                if (!recent.contains(build)) {
                    try {
                        File logFile = build.getLogFile()
                        totalSize += logFile.length()
                        println("$logFile, ${logFile.length()}")
                        logFile.delete()
                        logFile.createNewFile()
                    }catch(e){
                        println("Unable to delete the log for $build. An exception happened: $e")
                    }
                }
            }
        }
    }
    println "Total size: ${totalSize}"
    return "************************************************* END ******************************************************************"