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

在回答这些问题时,我想看看:


尝试给出产品的实际定义,这提供了在现有代码库中实际描绘产品的实用准则。
根据此工作定义,制定一项实际执行拆分的计划。我们可以简化假设,即代码库是由实现连续集成和持续交付的全自动sdlc处理的。也就是说,每个分支都由在当前代码库中实现的自动化测试套件进行验证,并且每个合并到某个“魔术”分支中都会生成经过测试和部署的产品工件。 (产品伪像是例如源tarball,文档,二进制软件包,Docker映像,AMI,unikernels。)
如果该计划能够说明如何规避

问题,那么该计划是令人满意的。分割


自动化测试程序如何与预先存在的整体存储库和拆分存储库相关?
自动化部署程序如何与预先存在的整体存储库和拆分存储库相关?
将自动部署的代码存储在哪里程序本身?
存储的基础结构,监视和高可用性策略在哪里?
如何确保开发人员一次只需要一个代码库(但可能使用其他代码库的伪像)。像git-bisect这样的工具


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

拥有几个小型存储库来保存代码库相对于“膨胀存储库”方法,特定产品具有以下优势:


使用膨胀存储库,当产品不稳定时,很难回滚发布,因为历史与其他产品混合在一起产品历史记录。
拥有庞大的存储库,很难查看项目历史记录或拉动,而对于小型存储库,我们更有可能阅读此信息。 (这可能是像git这样的VCS特有的,与svn不同,我们无法检出子树!)
使用膨胀的存储库,我们在开发时必须做更多的分支舞蹈。如果有N个存储库,则可以在N个分支上并行工作;如果只有1个存储库,则只能在一个分支上工作;或者有大量工作副本,这也很麻烦。
在存储库中,日志提供了该项目的热图。他们甚至可以用作开发团队中知识传播的代理人:如果我三个月以来没有从事回购X,最好将我分配到一个从事回购X的团队中,以便我随时了解发展情况。在该组件中。
使用小型存储库,更容易获得组件的清晰概述。如果所有内容都放在一个大型存储库中,则没有描绘每个组件的明显伪像,并且代码库可以轻松地移向泥潭。
小型存储库迫使我们在组件之间的接口上工作。但是由于我们希望有一个好的封装,无论如何我们都应该做这件工作,所以我认为这对于小型存储库是一个优势。
有了几个小型存储库,拥有多个产品所有者就容易多了。
通过几个小型存储库,可以轻松地获得与完整存储库相关的简单代码标准,并且可以自动对其进行验证。


评论

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

肯定是。 :)

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

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

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

#1 楼

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

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

设计

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

信心

必须始终隔离这种转变,从某种意义上说,这是一贯的历史切割必须存在,仅提供过渡本身,并且仅提供过渡,而没有任何其他更改(经过几个月的准备)。有什么信心可以批准并按下红色按钮?

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

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

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

如果缺少此类测试代码,则应首先写。

策略

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

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

技术债务

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

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

集成测试

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

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