diff --git a/SCM/s1_go_lessie_api.groovy b/SCM/s1_go_lessie_api.groovy index c366ff4..979579e 100644 --- a/SCM/s1_go_lessie_api.groovy +++ b/SCM/s1_go_lessie_api.groovy @@ -237,12 +237,13 @@ pipeline { post { always { script { - echo "开始清理本地旧镜像,仅保留最近 2 个构建版本" def keepCount = 2 + echo "开始清理本地旧镜像,仅保留最近 ${keepCount} 个构建版本" def imagePrefix = "${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}" // 获取所有镜像(按创建时间排序,越新的越前) - def allImagesRaw = sh(script: "docker images ${imagePrefix} --format '{{.ID}} {{.Repository}}:{{.Tag}}' | sort -rk1", returnStdout: true).trim() + // 格式:Repository:Tag ImageID CreatedAt + def allImagesRaw = sh(script: "docker images ${imagePrefix} --format '{{.Repository}}:{{.Tag}} {{.ID}} {{.CreatedAt}}' | sort -rk3", returnStdout: true).trim() if (!allImagesRaw) { echo "未找到任何镜像,无需清理" return @@ -256,13 +257,28 @@ pipeline { def oldImages = allImages.drop(keepCount) echo "发现 ${oldImages.size()} 个旧镜像需要清理" + oldImages.each { line -> + echo " ${line}" + } oldImages.each { line -> def parts = line.split(' ') - def imageId = parts[0] - def imageTag = parts[1] - echo "删除旧镜像: ${imageTag} (ID: ${imageId})" - sh "docker rmi -f \"${imageId}"\ || true" + def imageTag = parts[0] + def imageId = parts.size() > 1 ? parts[1] : "" + + // 对于标签为的无效镜像,使用镜像ID删除 + if (imageTag.contains("") && imageId) { + echo "删除无效镜像: ${imageId}" + sh(returnStatus: true, script: "docker rmi -f ${imageId} || true") + } else if (imageId) { + // 对于有标签的有效镜像,优先使用镜像ID删除 + echo "删除旧镜像: ${imageTag} (${imageId})" + sh(returnStatus: true, script: "docker rmi -f ${imageId} || true") + } else { + // 兜底方案,使用标签删除 + echo "删除旧镜像: ${imageTag}" + sh(returnStatus: true, script: "docker rmi -f ${imageTag} || true") + } } echo "清理完成,当前镜像状态:" diff --git a/SCM/s1_python_lessie_agents.groovy b/SCM/s1_python_lessie_agents.groovy index b8a114b..0393d77 100644 --- a/SCM/s1_python_lessie_agents.groovy +++ b/SCM/s1_python_lessie_agents.groovy @@ -217,12 +217,13 @@ pipeline { post { always { script { - echo "开始清理本地旧镜像,仅保留最近 2 个构建版本" def keepCount = 2 + echo "开始清理本地旧镜像,仅保留最近 ${keepCount} 个构建版本" def imagePrefix = "${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}" // 获取所有镜像(按创建时间排序,越新的越前) - def allImagesRaw = sh(script: "docker images ${imagePrefix} --format '{{.Repository}}:{{.Tag}} {{.CreatedAt}}' | sort -rk2", returnStdout: true).trim() + // 格式:Repository:Tag ImageID CreatedAt + def allImagesRaw = sh(script: "docker images ${imagePrefix} --format '{{.Repository}}:{{.Tag}} {{.ID}} {{.CreatedAt}}' | sort -rk3", returnStdout: true).trim() if (!allImagesRaw) { echo "未找到任何镜像,无需清理" return @@ -236,13 +237,28 @@ pipeline { def oldImages = allImages.drop(keepCount) echo "发现 ${oldImages.size()} 个旧镜像需要清理" + oldImages.each { line -> + echo " ${line}" + } oldImages.each { line -> def parts = line.split(' ') - def imageId = parts[0] - def imageTag = parts[1] - echo "删除旧镜像: ${imageTag} (ID: ${imageId})" - sh "docker rmi -f \"${imageId}"\ || true" + def imageTag = parts[0] + def imageId = parts.size() > 1 ? parts[1] : "" + + // 对于标签为的无效镜像,使用镜像ID删除 + if (imageTag.contains("") && imageId) { + echo "删除无效镜像: ${imageId}" + sh(returnStatus: true, script: "docker rmi -f ${imageId} || true") + } else if (imageId) { + // 对于有标签的有效镜像,优先使用镜像ID删除 + echo "删除旧镜像: ${imageTag} (${imageId})" + sh(returnStatus: true, script: "docker rmi -f ${imageId} || true") + } else { + // 兜底方案,使用标签删除 + echo "删除旧镜像: ${imageTag}" + sh(returnStatus: true, script: "docker rmi -f ${imageTag} || true") + } } echo "清理完成,当前镜像状态:"