summary
Travis CI 的自动化镜像清理 job 在按年龄清理 GCE 镜像时,因查询只返回了部分「有效镜像」清单(如受查询条数上限或仅保留最近 tag/提交),误删了仍在客户构建中使用的稳态基础镜像,导致大量构建失败。
timeline
清理脚本从数据库/目录取到不完整的有效镜像集合后,删除了集合之外(但实际在用)的镜像;客户 CI 随即因找不到镜像而失败;Travis 工程团队花了一周多滚动到新镜像并修复衍生问题。
root_cause
清理脚本对「哪些镜像仍在使用」的判断存在缺陷(查询受限/保留规则过窄),在自动化执行时把在用资源当作孤儿删除——典型的自动化 + 清单不完整的人的失误。
amplifiers
自动化清理本为防磁盘耗尽,却因清单不准变成破坏性操作;缺失的镜像无法简单恢复,只能前进到未经充分测试的新镜像,引发二次问题。
mitigation
Travis 修复查询(保留所有 tag 与近期提交对应的镜像),并改为前向滚动而非回退,长期强化镜像目录的准确性。
lessons
自动化删除必须先以高置信度确认资源确为孤儿;清理清单的查询必须完整且无隐式上限;删除类操作要可审计、可暂停。
checklist
清理前用完整且多重来源校验在用集合;删除操作 dry-run + 审批/限速;保留近期 N 个版本以便回滚而非硬删。