詹金斯:如何删除日志但保持构建?

时间:2014-01-13 08:15:51

标签: jenkins

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

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

是否有 clean 实现相同的方法?

4 个答案:

答案 0 :(得分:2)

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

https://wiki.jenkins-ci.org/display/JENKINS/Delete+log+plugin

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

答案 1 :(得分:2)

Haven还没有找到一种非常干净的方式,但是在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中的所有作业,然后根据需要循环遍历它们。根据您的备份方式,您可以在备份之前将其绑定以运行以节省空间。

答案 2 :(得分:0)

令人惊讶的是,这不是一个插件,但是使用Caleb的答案,我对其进行了扩展以适合我们的情况。这里有很多遗漏的细节,在过去的几年中,詹金斯的情况发生了变化,因此,我创建了一个新的答案。

  1. 确保在Jenkins > Global Tool Configuration > Groovy下声明了一个常规安装。

image showing groovy installation screen in Jenkins

  1. 创建一个新的Freestyle职位(我叫我们的clean-logs)。
  2. Build Triggers下,将Build Periodically设置为H H * * *以每天运行。
  3. Build > Add build step下,选择 执行系统Groovy脚本

请勿选择Execute Groovy Script。这将导致很多宣誓。

  1. 选择Groovy Command,然后将此脚本粘贴到:
import hudson.model.*;
import jenkins.model.*;
def days = 3
Jenkins.instance.getAllItems(Job.class).each{ 
  println "deleting logs for " + it.name + " - " + it.class
  it.getBuilds().byTimestamp(1, System.currentTimeMillis() - (1000L * 60 * 60 * 24 * days)).each { it.getLogFile().delete(); it.getLogFile().createNewFile() }
}

此脚本现在每天运行,并删除Jenkins中 all 项目的3天前的日志。它还会记录正在清理的项目。如果您想跳过项目,只需将其与任务名称匹配即可跳过。

最终设置如下:

image showing above specified configuration


我在尝试找出答案时遇到了麻烦。

  • 您必须指定import hudson.model.*; import jenkins.model.*;
  • 您必须使用Execute system Groovy script,而不是Execute Groovy Script

答案 3 :(得分:0)

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

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 ******************************************************************"