You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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:手动在脚本控制台执行

  1. 打开Jenkins的脚本控制台:访问$JENKINS_URL/script
  2. 复制以下脚本,替换jobNamebuildNumber为你的实际值,然后执行:
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

火山引擎 最新活动