如何通过Curl删除Jenkins主构建日志及Slave节点构建日志?
解决Jenkins主节点与Slave节点构建日志同时删除的问题
我之前也碰到过一模一样的情况——用doDelete的API只能删掉主节点的构建记录,Slave上的日志文件会老老实实留在本地。这是因为Jenkins的doDelete默认只处理当前节点(主节点)的构建数据,Slave节点的构建日志是存在Slave本地磁盘的,得单独清理才行。
下面给你两种可行的解决方案:
方案一:扩展curl命令逐个清理Slave节点
如果你的Slave数量不多,且清楚每个Slave的名称,直接给每个Slave的构建记录调用doDeleteAPI就行:
# 先删除主节点的构建日志 curl -kg -X POST -u $USER:$PASSWD $JENKINS_URL/job/$JOB_NAME/$build_number/doDelete # 替换成你的第一个Slave名称,删除该节点上的对应日志 curl -kg -X POST -u $USER:$PASSWD $JENKINS_URL/computer/[你的Slave1名称]/job/$JOB_NAME/$build_number/doDelete # 替换成你的第二个Slave名称,删除该节点上的对应日志 curl -kg -X POST -u $USER:$PASSWD $JENKINS_URL/computer/[你的Slave2名称]/job/$JOB_NAME/$build_number/doDelete
这个方法简单直接,适合Slave数量固定且较少的场景。
方案二:用Groovy脚本批量清理(推荐)
如果Slave数量较多,或者需要自动化批量处理,用Jenkins的Groovy脚本控制台会高效很多。脚本可以自动遍历所有Slave节点,一键删除对应构建的日志:
方法1:手动在脚本控制台执行
- 打开Jenkins的脚本控制台:访问
$JENKINS_URL/script - 复制以下脚本,替换
jobName和buildNumber为你的实际值,然后执行:
def jobName = "你的任务名称" def buildNumber = 123 // 替换成要删除的构建号 def job = Jenkins.instance.getItem(jobName) def build = job.getBuildByNumber(buildNumber) // 删除主节点的构建记录 if (build != null) { build.delete() println "Deleted build $buildNumber on master" } // 遍历所有Slave节点,清理对应构建 Jenkins.instance.slaves.each { slave -> def slaveComputer = slave.getComputer() def slaveJob = slaveComputer.getItem(jobName) if (slaveJob != null) { def slaveBuild = slaveJob.getBuildByNumber(buildNumber) if (slaveBuild != null) { slaveBuild.delete() println "Deleted build $buildNumber on slave: ${slave.name}" } else { println "Build $buildNumber not found on slave: ${slave.name}" } } else { println "Job $jobName not found on slave: ${slave.name}" } } println "Cleanup completed!"
方法2:用curl调用脚本控制台API
如果需要自动化执行,也可以用curl直接调用脚本控制台:
curl -kg -X POST -u $USER:$PASSWD \ -d "script=def jobName=\"$JOB_NAME\"; def buildNumber=$build_number; def job = Jenkins.instance.getItem(jobName); def build = job.getBuildByNumber(buildNumber); if (build != null) { build.delete(); println \"Deleted build $build_number on master\"; }; Jenkins.instance.slaves.each { slave -> def slaveComputer = slave.getComputer(); def slaveJob = slaveComputer.getItem(jobName); if (slaveJob != null) { def slaveBuild = slaveJob.getBuildByNumber(buildNumber); if (slaveBuild != null) { slaveBuild.delete(); println \"Deleted build $build_number on slave: \${slave.name}\"; } else { println \"Build $build_number not found on slave: \${slave.name}\"; } } else { println \"Job $JOB_NAME not found on slave: \${slave.name}\"; } }; println \"Cleanup completed!\"" \ $JENKINS_URL/script
注意事项
- 执行Groovy脚本需要你拥有Jenkins的管理员权限,或者至少具备对应任务和节点的删除权限
- 如果Slave节点处于离线状态,脚本无法清理其本地日志,等Slave上线后重新执行即可
- 部分Jenkins版本可能需要调整脚本中的API,比如将
getItem替换为getItemByFullName(如果出现任务找不到的错误)
内容的提问来源于stack exchange,提问作者unrue




