从 Terraform Monorepo 迁移到 Multi-Repo 而不失去理智(和睡眠)
发布: (2025年12月12日 GMT+8 04:55)
3 min read
原文: Dev.to
Source: Dev.to
问题
| 指标 | 单仓库 | 多仓库 |
|---|---|---|
| 平均计划时间 | 68 分钟 | 1.8 分钟(提升 97 %) |
| 每周失败运行次数 | 27 | 0.8(降低 97 %) |
| PR 合并时间 | 4.2 小时 | 18 分钟(提升 93 %) |
| 最大状态文件 | 1.9 GB | 38 MB |
| 工程师满意度 | 4.8/10 | 9.6/10 |
单仓库:180 k 行代码,2 800 个资源,状态文件 1.9 GB。
多仓库:每个团队一个仓库。
示例:提取 team‑alpha 状态
terraform state mv -state-out=team-alpha.tfstate \
module.vpc module.team_alpha_vpc
terraform state mv -state-out=team-alpha.tfstate \
aws_eks_cluster.alpha null
对所有 42 个团队重复(通过脚本自动化)。
创建新仓库
自动化脚本为每个仓库创建:
- 正确的
.terraform-version约束 - 指向专用 S3 + DynamoDB 表的后端配置
README.md、CODEOWNERS与 pre‑commit 钩子
升级工具链
| 从 | 到 |
|---|---|
| Terraform 1.5 + Terraform Cloud | OpenTofu 1.8 + Atlantis 4.0 |
Atlantis 配置(YAML)
repos:
- id: /meenanukala/*
apply_requirements: [approved, mergeable]
workflow: tofu
workflows:
tofu:
plan:
steps:
- init
- plan:
extra_args: ["-lock-timeout=5m"]
apply:
steps:
- apply
强制质量门
- 每个 PR 都运行 Infracost + tfsec
- 阻止提交状态文件的自定义 pre‑commit 钩子
- 使用 Dependabot 更新提供商
- 每周自动漂移检测
结果
| 指标 | 之前 | 之后 |
|---|---|---|
| 平均计划时间 | 68 分钟 | 1.8 分钟 |
| 每周失败运行次数 | 27 | 0.8 |
| PR 合并时间 | 4.2 小时 | 18 分钟 |
| 最大状态文件 | 1.9 GB | 38 MB |
| 工程师满意度 | 4.8/10 | 9.6/10 |
资源
- 迁移手册 & 脚本 –
- 包含状态拆分脚本(处理嵌套模块)
- 仓库创建模板
- Atlantis + OpenTofu 配置
- 完整迁移手册(PDF)
单仓库在 2018 年还算合理。到 2025 年它们已经成为带利息的技术债务。如果你的 Terraform 计划时间比喝杯咖啡还长,是时候切换了。Fork 上面的仓库并按照手册操作。
— Meena Nukala,资深 DevOps 工程师(英国)