我们有可以生成大量日志的构建。这需要空间,因此我们必须告诉jenkins删除旧版本。这是一个问题,因为我们失去了长期统计数据。
我正在考虑删除或清空每个版本超过一周的“日志”文件,并告诉jenkins不要删除旧版本。
是否有 clean 实现相同的方法?
答案 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的答案,我对其进行了扩展以适合我们的情况。这里有很多遗漏的细节,在过去的几年中,詹金斯的情况发生了变化,因此,我创建了一个新的答案。
Jenkins > Global Tool Configuration > Groovy
下声明了一个常规安装。clean-logs
)。Build Triggers
下,将Build Periodically
设置为H H * * *
以每天运行。Build > Add build step
下,选择 执行系统Groovy脚本 。 请勿选择Execute Groovy Script
。这将导致很多宣誓。
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天前的日志。它还会记录正在清理的项目。如果您想跳过项目,只需将其与任务名称匹配即可跳过。
最终设置如下:
我在尝试找出答案时遇到了麻烦。
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 ******************************************************************"