feat(ci): ACR镜像自动清理增强版(#524) #872
Reference in New Issue
Block a user
Delete Branch "chore/ci-acr-cleanup-enhance"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
P3-2 ACR镜像自动清理增强,防止镜像越积越多占满存储。
改动内容
1. acr_cleanup.py 升级为增强版(319行新增)
清理策略:
三种执行模式:
--pr-sha <sha>— PR关闭模式,只删指定commit的pr-*镜像--dry-run— 预览模式,只看不删2. 新增 acr-cleanup.yml workflow
触发方式:
安全机制:
关联工单
#524 ACR镜像自动清理
验证方式
🗑️ 预览环境已清理
PR #872 已关闭或合并,对应的预览环境已被清理。
代码审查结果 - PR #872
⚠️ 问题(3个需要修改)
.gitea/workflows/acr-cleanup.yml 第60行:SSH连接失败被静默忽略,导致白名单丢失风险
set +e,后续SSH命令(如ssh-keyscan或docker ps)如果失败(例如网络抖动、Staging服务器宕机),脚本不会退出,而是继续执行。这会导致PROTECTED_TAGS为空,Python脚本在没有任何白名单保护的情况下运行,极有可能误删正在Staging环境运行的镜像,导致服务中断。set +e,或者在SSH命令后显式检查$?,如果获取白名单失败,应该终止Workflow或设置一个标志位阻止后续的清理步骤。scripts/ci/acr_cleanup.py 第410行:API请求失败导致全量误删PR镜像
cleanup_repo函数中,当尝试通过Gitea API获取打开的PR的Head SHA时,使用了try...except Exception: break。如果在请求过程中发生网络超时或5xx错误,循环会直接break退出,导致open_head_shas列表为空或不完整。随后的逻辑会认为所有PR镜像都不在“打开”列表中,从而将所有PR镜像标记为删除。else分支的时间保留策略。scripts/ci/acr_cleanup.py 第314行:空字符串SHA匹配逻辑导致垃圾数据无法清理
extract_sha_from_pr_tag函数仅简单切片tag[3:]。如果存在名为pr-的异常标签,提取的SHA为空字符串。在第425行的匹配逻辑中,ohs.startswith(sha)即ohs.startswith("")永远为True。这会导致名为pr-的标签被判定为“属于打开的PR”,从而永远不会被清理,造成垃圾数据残留。extract_sha_from_pr_tag中增加对提取结果的长度校验,或者在使用处判断SHA是否为空。💡 建议(3个可选)
性能优化:避免重复的Gitea API调用
main函数中调用了gitea_get_open_prs仅用于检测API连通性,而在cleanup_repo中又重新调用API获取详细信息。这导致每次清理都会对Gitea发起双倍请求(且在多仓库模式下成倍增加)。建议重构逻辑,将获取Open PR详情(包含Head SHA)的逻辑统一在main或一个独立函数中完成,并将结果直接传递给cleanup_repo。配置管理:移除硬编码的IP地址
.gitea/workflows/acr-cleanup.yml第70行,Staging服务器的IP地址47.98.113.167被硬编码。如果服务器迁移,Workflow将失效。建议将IP地址配置为Secret或Repository Variable。匹配逻辑优化:过于宽松的前缀匹配
is_in_protected_list和PR清理逻辑中,使用了tag.startswith(p) or p.startswith(tag)。这种“互为前缀即匹配”的逻辑在某些边缘情况下可能过于激进。例如,受保护列表中有一个短SHAabc,它将保护所有以abc开头的镜像(如abc123,abc999)。虽然对于SHA来说碰撞概率极低,但建议明确是“精确匹配”还是“短SHA匹配长SHA”,避免歧义。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-25 04:12:14 | 模型:
xiaoxia referenced this pull request2026-07-25 12:22:33 +08:00