Architecture Decision Record

Active theme: Light

← 决策记录示例

单体仓库与多仓库

目录:

摘要

问题

我们的项目涉及开发三大类软件:

  • 前端图形界面(GUI)
  • 中间件服务
  • 后端服务器

在开发时,我们的源代码管理(SCM)版本控制系统(VCS)是 git。

我们需要选择如何使用 git 来组织我们的代码。

最高层的选择是组织成“monorepo(单体仓库)”、“polyrepo(多仓库)”或“混合”:

  • Monorepo 意味着我们把所有部分放进一个大仓库
  • Polyrepo 意味着我们把每个部分放进各自的仓库
  • 混合意味着 monorepo 与 polyrepo 的某种组合

更多信息请参见 https://github.com/joelparkerhenderson/monorepo-vs-polyrepo

决策

当组织/团队/项目相对较小,且快速迭代的优先级高于维持稳定性时,选择 monorepo。

当组织/团队/项目相对较大,且维持稳定性的优先级高于快速迭代时,选择 polyrepo。

状态

已决定。如果/当出现用于管理 monorepo 和/或 polyrepo 的新工具时,愿意重新审视。

详情

假设

我们开发的所有代码都是为某一个组织的产品服务的,而不是面向公众的。也就是说,这家券商(Broker-Dealer)并不打算拥有任何类似公众志愿开发者的群体。

约束

约束在 https://github.com/joelparkerhenderson/monorepo-vs-polyrepo 中有详细记录。

立场

我们考虑了 Google、Facebook 等风格的 monorepo。我们认为,任何 monorepo 的扩展问题都出现在遥远的将来,到我们需要的时候,我们将能够利用与 Google 和 Facebook 相同的实践。

我们考虑了典型 Git 开源项目风格的 polyrepo,例如 Google Android、Facebook React 等。我们认为,对于公众参与(例如全世界任何人都可以参与代码工作)和单独可用性(例如项目可以独立使用,不依赖任何其他部分),这些是最佳选择。

论证

当组织/团队/项目相对较小时,我们选择 monorepo,因为快速迭代的优先级明显高于维持稳定性。

当组织/团队/项目相对较大时,我们选择 polyrepo,因为维持稳定性的优先级明显高于快速迭代。

影响

如果已有 CI+CD 流水线,我们可能需要对其进行调整,以便在一个仓库内测试多个项目。

对于 monorepo,CI+CD 的完整构建可能耗时更长,因为 CI+CD 可能会构建 monorepo 中的所有项目。

如果组织/团队/项目不断增长,monorepo 将出现扩展问题。

monorepo 的扩展问题可能使过渡到 polyrepo 变得越来越有价值。

从 monorepo 过渡到 polyrepo 是一项重大的 DevOps 任务,需要计划、管理和编程实现。

相关内容

相关决策

我们将为管理 monorepo(例如 Google Bazel)和 polyrepo(例如 Lyft Refactorator)的相关工具创建决策。

相关需求

我们需要开发能够与 git 良好协作的 CI+CD 流水线。

相关制品

我们预计仓库组织将带有用于资源供应、配置管理、测试以及类似 DevOps 领域的相关制品。

相关原则

易于撤销。如果 monorepo 在实践中行不通,或者领导层不想要,可以很容易地改为 polyrepo。

痴迷于客户(Customer Obsession)。我们重视让项目尽快送到客户手中,并且相信 monorepo 比 polyrepo 能更快地做到这一点,也有助于我们更快地迭代。

志存高远(Think big)。Google 和 Facebook 是 monorepo 优于 polyrepo 的强力倡导者,因为所有核心产品可以协同开发/测试/部署。

备注

在此添加任何备注。