项目库
脚本与自动化Brightloom · 软件工程实习生 · 2024
一个在有人忘了写数据库迁移时让构建失败的 CI 检查
分享者:R. Chen · 前 Brightloom(中型 SaaS)软件工程实习生
分享者在 Brightloom 面试里讲的正是这个项目,后来拿到了转正 offer。
走进这场面试
4 个当年真实追问 · 2 个 hard · 约 12 分钟
答完每一题,才翻开当事人当年的接法。
他们当时是怎么讲的
老有人改了模型却不带上对应的迁移文件,把 staging 弄崩。我加了一个 CI 步骤,在合并之前就把它拦下来。
展开全文
在一家中型 SaaS 公司,有个反复出现的烦心事:有人在 PR 里改了数据库模型,却忘了把迁移文件一起带上,合并之后 staging 就崩了。这事发生得太频繁,以至于都有了个外号。作为实习生,我问能不能让我试着在 CI 里把它抓出来。我最初的想法很天真——就检查一下:只要有模型文件改动了,就得有个迁移文件也跟着改。但这会误报,比如改个注释、编辑一下 docstring,本不该要求迁移。所以我转而依赖 ORM 自带的工具:我加了个 CI 步骤,在一个用完即弃的数据库里跑框架自带的『检查是否缺失迁移』命令,如果它报出有待处理的 schema 变更却没有对应迁移,就让构建失败。这么做是权威的,因为它是去问框架本身,而不是从文件 diff 里瞎猜。难点在于把失败提示做得有用——一个红叉配上啥解释都没有,只会惹人烦——所以我让它把生成缺失迁移的那条确切命令直接打印出来。我特意开了个『改了模型但没带迁移』的 PR 来测试,确认它会变红;又开了个两样都带上的,确认它保持绿色。它把我们团队里『忘写迁移』导致的崩溃基本降到了零。
当年真实被问到的
你最初的做法是 diff 文件。为什么后来放弃了?它漏掉了哪些边界情况?
困难你怎么说服自己这个检查是对的、不会错误地把人拦下来?
中等第一次它拦下了某个人合理的 PR、对方还挺不爽的时候,发生了什么?
困难你实习结束后它还在流水线里吗?其他团队用起来了吗?
简单