如何删除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命令
,然后将此脚本粘贴到:我在试图弄明白这一点时遇到了难题
- 必须指定导入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 ******************************************************************"