cat case/PM-2019-0052.md

TravisCI 2019 自动化的按年龄清理 GCE 镜像 job 误删稳态基础镜像

P2 · 镜像清理脚本只取到部分有效镜像清单(查询受限),误删仍在使用的稳态基础镜像,大量客户构建失败

summary

Travis CI 的自动化镜像清理 job 在按年龄清理 GCE 镜像时,因查询只返回了部分「有效镜像」清单(如受查询条数上限或仅保留最近 tag/提交),误删了仍在客户构建中使用的稳态基础镜像,导致大量构建失败。

timeline

清理脚本从数据库/目录取到不完整的有效镜像集合后,删除了集合之外(但实际在用)的镜像;客户 CI 随即因找不到镜像而失败;Travis 工程团队花了一周多滚动到新镜像并修复衍生问题。

root_cause

清理脚本对「哪些镜像仍在使用」的判断存在缺陷(查询受限/保留规则过窄),在自动化执行时把在用资源当作孤儿删除——典型的自动化 + 清单不完整的人的失误。

amplifiers

自动化清理本为防磁盘耗尽,却因清单不准变成破坏性操作;缺失的镜像无法简单恢复,只能前进到未经充分测试的新镜像,引发二次问题。

mitigation

Travis 修复查询(保留所有 tag 与近期提交对应的镜像),并改为前向滚动而非回退,长期强化镜像目录的准确性。

lessons

自动化删除必须先以高置信度确认资源确为孤儿;清理清单的查询必须完整且无隐式上限;删除类操作要可审计、可暂停。

checklist

清理前用完整且多重来源校验在用集合;删除操作 dry-run + 审批/限速;保留近期 N 个版本以便回滚而非硬删。