如何实现从“一个用于所有产品的大型VCS存储库”组织模型到“许多小型VCS存储库”模型的平稳过渡?


15

通常的情况是,某些VCS系统中库所拥有的产品的代码发展到可以认为该代码库包含多个产品的地步。在多个VCS存储库中拆分代码库,每个VCS存储库专用于单个产品,可以利用多种好处(请参见下面的膨胀存储库模型,每个VCS存储库都有一个产品的好处)。从技术方面来说,拆分代码库是一个相当简单的步骤,因为大多数VCS支持此操作。但是,拆分可能会引起与自动化测试,持续交付,服务集成或监视有关的工程问题(请参阅拆分所引发的问题)。)因此,计划进行这种拆分的组织需要知道如何尽可能平稳地执行此过渡,即在不中断其交付和监视管道的情况下。第一步可能是更好地理解项目的概念,以及如何在整体代码库中描述拆分。

在此问题的答案中,我希望看到:

  1. 尝试给出产品的实际定义,这提供了在实际代码库中实际描绘产品的实用准则。

  2. 根据此工作定义,制定一个实际执行拆分的计划。我们可以简化假设,即代码库是由实现全自动处理的。也就是说,每个分支都由在当前代码库中实现的自动化测试套件进行验证,并且每个合并到某个“魔术”分支中都会生成经过测试和部署的。(产品文物源压缩包,文档,二进制软件包,多克尔图像阿美族,unikernels。)

  3. 如果它说明了如何规避

分裂引起的问题

  1. 自动化测试程序如何与预先存在的整体存储库和拆分存储库相关联?

  2. 自动化部署过程如何与预先存在的整体存储库和拆分存储库相关联?

  3. 自动部署过程本身的代码存储在哪里?

  4. 存储的策略在哪里?

  5. 如何确保开发人员一次只需要一个代码库(但可能会使用其他代码库的伪像)。

  6. git-bisect这样的工具


边际说明:与膨胀的存储库模型相比,每个VCS存储库拥有产品的好处

与“膨胀存储库”方法相比,拥有多个小型存储库来保存特定产品的代码库具有以下优点:

  1. 使用膨胀的存储库,当产品不稳定时,很难回滚发布,因为历史记录与其他产品历史记录混合在一起。

  2. 对于庞大的存储库,使用小型存储库很难查看项目历史记录或请求,而我们更可能阅读此信息。(这可能特定于git之类的VCS,与svn不同,我们无法检出子树!)

  3. 使用庞大的存储库,我们在开发时必须做更多的分支舞蹈。如果有N个存储库,则可以在N个分支上并行工作;如果只有1个存储库,则只能在一个分支上工作,或者有大量工作副本,这也很麻烦。

  4. 日志中有几个小型存储库,提供了该项目的热图。他们甚至可以用作开发团队中知识传播的代理人:如果我三个月以来没有从事repo X,最好将我分配到从事repo X的团队中,以便我随时了解发展情况。在该组件中。

  5. 使用小型存储库,更容易获得组件的清晰概述。如果所有内容都放在一个大的存储库中,则没有描绘每个组件的明显伪像,并且代码库可以轻松地移向泥潭

  6. 小型存储库迫使我们致力于组件之间的接口。但是由于我们希望有一个好的封装,无论如何我们都应该做这项工作,因此我认为这对于小型存储库是一个优势。

  7. 使用几个小型存储库,可以轻松拥有多个产品所有者。

  8. 使用几个小型存储库,可以轻松地拥有与完整存储库相关的简单代码标准,并且可以自动进行验证。


1
这种解决方案的关键部分是一个体面的工件存储库(例如,工件),它使您可以将依赖组件与同一存储库分离。IOW而不是共享代码(一个仓库),而是发布和使用构建的库(工件)。这也是开始此类工作的好地方,因为您可以一个一个地重构/提取模块。
阿萨夫·拉维


1
实际上,我们正在研究一个非常相似的问题。我们正在考虑的方法是拥有一个没有任何代码提交给它的主存储库,以及其他存储库作为子模块附加。但是我们仍然需要找到正确的工具和流程的集成来完成它。当我们弄清楚细节时,我将撰写一个详细的答案。
吉里·克鲁达

1
如果产品共享(平台/产品无关)代码,则事情可能会变得更加复杂。或者,如果每个产品系列都有通用代码。并不是说拆分不是一个好主意,只有部件的管理以及优缺点列表会有所不同。
Dan Cornilescu

2
我认为您使用git-bisect的第6个项目符号缺少某些内容。我想知道是否应该或多或少地要求一本书,所以不应该将其分为几个单独的问题。由于产品的定义是非常主观的(可能会有所不同),所以我认为SE网站上的问题实际上有点过高。太宽泛或太基于意见。
Tensibai

Answers:


9

这是一个引人入胜的问题,对于该问题可能实际上并不存在。我赞赏您在将问题与VCS保持上下文相关时,它自然会自动扩展到基础结构设计和实施计划。

虽然,似乎我们许多人都在进行这种过渡,这可能令人兴奋,但同时又令人沮丧和痛苦;并且我想分享自己的经验和观点,尽量不要学究,也因为我可能不是一个好工程师,也不要感到无聊。

设计

基础设施和体系结构应该一起编写现代软件。如果需要,可以紧密耦合。使用这些词听起来可能很奇怪,但是我们在这里并不一定要讨论代码本身:我的意思是它们必须是同一蓝图的一部分。当云层到来,人们开始为他们编写软件时,然后有多少人意识到,将泥球放在那儿,它们只是在不同的地方是相同的泥球?而且他们今天可能会在开发人员中工作。由于devops只是一个时髦词汇,对于不同的人而言具有许多不同的含义,因此我已经看到了devops团队在每次架构会议中所坐的地方。其他仅自动化的地方。为了实现这种转变,我们必须努力争取坐在那里。

置信度

从一定意义上说,过渡必须保持隔离,这是指必须存在一致的历史记录,这仅提供过渡本身,并且仅提供过渡本身,而没有任何其他更改(经过几个月的准备)。有什么信心可以批准并按下红色按钮?

我的意思是代码库必须更改以适应新的VCS结构,并且在开发过程中很难使其合并。(对于这个问题,可能会有一些促进策略,我将在稍后讨论一种常见的策略,该策略可以帮助并行化开发)。

好吧,我敢打赌,唯一的方法就是使用行为测试,并且应该启动相同的行为测试套件,以使用新的代码库来验证旧代码。我们没有在此处验证应用程序的行为是否正常,但是该过渡不会改变其行为。测试失败可能是一件好事!如果他们继续失败!

实际上,对泥球进行良好测试是非常罕见的。通常,代码是非常紧密地耦合在一起的,而且对于大多数传统代码而言,很可能不是使用测试驱动的方法开发的,甚至不是单元测试。

如果此类测试代码丢失,则应首先编写。

战略

是的,过渡必须保持隔离;但同时又整合了。我知道我可能在这里听起来很疯狂,但是我找不到其他词来形容信心如何保持业务发展。很少(甚至根本没有)公司愿意停止开发大型整体式代码库,以腾出空间进行这种过渡,而我们也不是一味地投入。也许数百名开发人员可能会继续为代码库做贡献(在这里,我会使用来自POV 的篡改词)。虽然我们的工作必须针对特定的快照以提供信心,但我们必须保持自己的基础(这里不是git的意思),以避免永远落后。

这里的实施策略可以提供不同的经验。一个常见的开发路线是在需要与核心交互时包装/适应(使用可选的重新安排方案公开端点)较新的实现分支(在这种情况下,位于其他存储库中)。使用这样的策略进行过渡以及重构,可以同时为VCS过渡提供POC方案,并在以后逐步进行。看到它就像雕刻泥球。是的,生活提供了很多有趣的东西。

技术债务

业务管理领域开始了解技术债务并将其考虑在内。不,请scratch,不正确。收集度量和质量数据已变得越来越普遍,但是就静态代码分析,代码审查,行为测试结果和性能而言,并生成精美的报告和所有内容……要使企业持续接受业务仍然非常困难。重构方法。它的商业价值“我们正在遵循一个敏捷的过程,这不会带来任何功能上的增强,不是吗?” 。基本上,这样做是在消除技术债务的存在。我认为这是常见的缺少必要步骤,无法启动从整体到微服务架构的任何过渡。

重新聚集

毕竟,您可能仍想提供一个类似于存储库的视图,您可以在其中构建多个产品。出于任何原因,即curr / next版本,多品牌,客户群。在这种情况下,诸如Google repo之类的工具可能会有所帮助。我自己从未用过,但我知道我需要一天。

整合测试

对于微服务,集成测试采用了“测试自己的API”的不同上下文。可以并且将存在更高层次的测试,功能或性能,但是如果没有适当的集成测试,它们是否意味着很多?就像进行集成测试而不进行单元测试一样。当然不是。这就是为什么,如果需要git bisect,将在微服务存储库分支中执行它,而不必在mudball存储库中运行它。

PS。这是草稿,我的英语不好,有一天我会解决的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.