真正的持续集成:分布式代码仓库和依赖

微服务架构为软件开发带来了极大的灵活性,并加快了交付速度,但同时也带来了依赖管理问题。传统的解决方案虽然能够解决依赖管理问题,但都太极端,顾此失彼。于是,Netflix尝试着寻找自己的解决方案,期待着在整个组织层面做到真正的持续集成。本文内容来自Netflix技术博客,已获得翻译授权,查看英文原文 Towards true continuous integration:distributed repositories and dependencies。

在过去的8年间,Netflix基于AWS构建了一套健壮的微服务架构,我们因此学会了如何在AWS上构建可靠的高性能服务。我们的微服务架构解耦了工程团队,让他们可以自由地构建、测试和部署他们的服务。这种灵活性最大化了团队的交付速度。在Netflix,交付速度和可靠性是设计解决方案时首要的考虑点。

基于我们的架构,微服务为它们的消费者提供了一个客户端软件包,用于处理所有的IPC(进程间通信)逻辑。这同时为服务的提供者和消费者带来了很多好处。除了客户端,微服务的很大部分是基于我们的运行时平台而构建的,这个平台由内部的软件包和第三方开源的软件包组成。

尽管服务开发团队有很大的发布灵活性,但他们的交付速度却受到了依赖软件包的影响。一项新增的产品特性可能要求很多微服务都用上最新版本的共享软件包或客户端,而更新依赖版本可能会带来风险。

简而言之,依赖管理是一项艰巨的任务。

更新项目的依赖可能带来潜在的问题。

具有阻断性的API变更。这是最典型的场景,一个编译错误导致整个构建失败。由依赖锁定(Dependency Locking)和动态版本选择器组成的语义版本控制(Semantic Versioning)可以帮助大部分团队避免发生这种错误。不过,锁定在一个主版本上会让整个公司的代码升级变得很困难,导致配置漂移(Configuration Drift),并且需要长期地维护旧软件包。 具有传递性的依赖更新。因为JVM的类路径是扁平结构,所以在一个应用程序里,一个类只能存在一个版本。像Gradle和Maven这类工具可以处理版本冲突,避免同一个软件包的多个版本被引入到项目当中。这也意味着,你的应用程序里有一些代码依赖了具有传递性特征的软件包,但你的代码并没有针对它们进行过测试。 具有阻断性的功能变更。理想情况下,这个问题可以通过执行适当的测试来缓解。软件包的所有者可以通过运行使用者的测试案例来了解他们对软件包功能的预期。
我们发现,为了解决大规模的依赖管理问题,很多公司使用了两种方案:共享最小化(Share Little)和单体仓库(MonoRepo)。

共享最小化(或者干脆不使用共享软件包)最近在微服务领域很流行,它的核心论调是说,微服务之间不应该共享代码,服务之间只能通过HTTP API进行耦合。更有甚者,有人说直接使用拷贝加黏贴的方式来代替共享软件包。这是一种非常极端的解耦手段。 单体仓库的核心论调是说,组织的所有代码应该全部保存在一个单独的仓库里。任何一个代码变更在提交到HEAD之前,都需要针对整个代码仓库进行编译和测试。内部软件包没有所谓的版本,只有HEAD代码。所有的提交在到达HEAD之前需要跨过一些门槛。第三方软件包需要通过“审批”才能被使用,而且仅限于一两个版本。
这两种方式都能解决大规模的依赖管理问题,不过它们也带来了一些挑战。共享最小化促进了解耦,也加快了工程速度,但牺牲了代码的重用性和一致性。单体仓库保证了代码一致性,并降低了风险,但牺牲了灵活性。不管采用哪一种方式,我们都需要对Netflix的开发基础设施和运行时架构做出重大的调整。况且,这两种方案会破坏我们所推崇的自由和责任文化。

我们给自己提出了一个很大的挑战目标:

我们能否为Netflix的工程师们提供一种解决方案,它不但具有单体仓库的优势,还能保持分布式仓库的灵活性?

我们以单体仓库为蓝本,另辟蹊径,希望找出能够达到相同目的的可替代方案。单体仓库所要解决的核心问题是什么?我们能否在传统的二元集成世界里开发出一种新的方案?

我们的解决方案,虽然还在试验阶段,不过可以从中归纳出三个关键的特性。

向发布者反馈。直接或间接地向共享代码所有者快速地反馈使用者所遇到的问题。同时,允许团队因下游依赖的中断而暂停发布。目前,我们不会把这类问题的责任归咎到使用者身上。通过向软件包所有者反馈他们的问题给Netflix带来的影响,希望他们能够负起应有的责任。 来源管理。当有新版本发布时,为使用者提供一种安全的方式,用于自动增加软件包的版本。既然我们已经针对所有的下游依赖测试过每一个软件包,那为什么不直接让使用者知道新版本,从而加快新版本的采用速度呢! 分布式重构。为共享代码的所有者提供一种方式,让他们可以全局地对API的使用者进行快速的重构。我们已经开始向使用了某些特定Java API的Git代码仓库发起了全面的拉取请求。我们已经做了一些试验,并希望在这方面有更多的投入。
我们的旅程才刚刚开始。我们的发布者反馈服务目前正处于alpha测试阶段,我们计划后续会大规模采用这个服务,紧接着会进行来源管理。我们的分布式重构试验让我们了解到进行快速的全局重构是多么的重要。我们也看到了通过我们所构建的工具来降低依赖图复杂度的可能性。我们相信,通过扩展和培养这种能力,我们的Netflix团队将会在组织层面做到真正的持续集成,并减少(甚至免去)依赖管理的痛苦。

本文转自d1net(转载)

时间: 2024-09-30 19:24:04

真正的持续集成:分布式代码仓库和依赖的相关文章

微服务的持续集成,四步“构建”一个代码世界

本文讲的是微服务的持续集成,四步"构建"一个代码世界,大师Martin Fowler对持续集成是这样定义的:持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误. 今天我们就来聊一聊微服务的持续集成. 目录 一.持续集成之构建 二.持续集成之部署 三.持续集成之测试 四.持续集成之发布 五.总结 一.持续集成之构建 当微服务产生

基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统

前言 在上一篇文章中讨论了容器服务提供的交付能力,在本文中我们将讨论如何从零搭建一个持续交付系统. 对于大多数公司而言,选择一个合适自己的持续交付系统是尤为重要的一件事情,不同的公司.不同的业务使用的场景也各不相同,因此要根据自己的业务场景与发展方向来选择合适的方案.根据不同的业务场景与交付方式,阿里云容器服务提供了三种不同的持续交付方案. 基于Jenkins的持续交付方案 基于Jenkins的持续集成和持续交付方案是所有方案中最灵活.能力最强的方式,但也是需要客户自主运维的方案.对于现有提供持

基于Docker的开发模式驱动持续集成落地实施

11月30日,资深质量优化专家陈能技老师,在[DBA+社群]中间件用户组进行了一次主题为"基于Docker的开发模式驱动持续集成落地实施"的线上分享.小编特别整理出其中精华内容,供大家学习交流.同时,也非常感谢陈能技老师对DBA+社群给予的大力支持.    嘉宾简介   资深质量优化专家,12年软件测试与质量管理经验 <软件性能测试诊断分析与优化>等多本IT畅销书作者 演讲实录   今天主要交流的主题是基于Docker的开发模式如何驱动持续集成落地实施,这里会涉及两个主要的

持续集成:从六个层次加速测试执行

在持续集成领域,一个产品的发布往往都有自己的过程周期(lifecycle),大体都会划分为:构建->部署->测试->发布等几个重要阶段,其中测试是发布产品前不可或缺的重要阶段,是产品质量的保证.而能让持续集成奏效,除了要求测试脚本更充分健壮,还要求测试脚本运行得更快更好.这点对于小型项目而言可能显得无关紧要,毕竟大多小项目的测试脚本不过百条,验证点不过千"点":但对于一个大型项目而言,测试代码源文件可能成百上千,执行完所有的测试可能要等很久,而苦等之后的结果却可能是满

Jenkins与Docker的持续集成实践

本文讲的是Jenkins与Docker的持续集成实践[编者的话]持续集成(CI/CD)是一种软件开发实践.用于帮助团队成员频繁.快速的集成,测试他们的工作成果,以尽快发现集成错误. 更频繁.更早的集成意味着更早的发现问题.通过持续集成,及时发现和解决代码故障,提高代码质量,减少故障处理成本等等. [3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站]本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)概览:持续集成系统介绍:客户端与服务端的

通过Docker容器运行持续集成/持续部署

本文讲的是通过Docker容器运行持续集成/持续部署,[编者的话] 对于Docker主流的应用场景:持续集成和持续部署(CI/CD)大家也许并不陌生.这篇文章从独特的视角阐述了如何利用各种云平台构建属于自己的CI/CD容器,笔者还自己扩展了Gitlab CI引擎,对CI感兴趣的同学对这个文章应该很感兴趣. 我曾经使用Docker了一段时间,在过去的一年里伴随着众多的Docker容器涌入,帮助用户们更容易的部署Docker容器到生产环境中.一些工具是第三方公司提供,当然也包括Docker公司自己的

超大型系统的持续集成与持续交付解决方案与阿里宙斯盾

作者简介:鲁小川,09年本科毕业于浙江大学软件学院,之后就一直就职于阿里巴巴B2B质量保障部,目前是云效持续集成与持续交付解决方案的负责人. 以下内容根据演讲嘉宾分享以及PPT整理而成. 今天分享的议题是<超大型系统的持续集成与持续交付解决方案及案例分析>,主要就是和大家聊聊阿里巴巴B2B技术部这几年来在持续集成与持续交付上实践经验,以及为什么要做宙斯盾系统平台产品来支撑持续交付.宙斯盾平台在阿里内部经过了5年多的积累沉淀,现在已经对外服务输出了,对外服务产品的名字叫做云效平台,后面还会介绍云

云计算基础设施持续集成实践

[演讲PDF]: https://yq.aliyun.com/attachment/download/?id=1837 [演讲视频]: https://yq.aliyun.com/edu/lesson/551 研发和传统基础设施交互方式 通常情况下,在开发过程中需要和基础设施打交道,需要在项目中申请开发.测试以及预发生产环境.在IDC时代,我们需要向IT部门申请这些资源,其批准后,我们才能获得这些资源.如果这些资源恰巧不足,我们只能等待购买新的资源或者更换其他资源. 当拿到这些资源之后,需要对开

初创公司应该如何做好持续集成和部署?

作者介绍 裴双才,Geekwolf,现MAKA运维负责人,博客: http://www.simlinux.com.<FastDFS分布式存储实战>作者,<Ansible中文手册>译者.RHCA/RHCVA,混迹各种开源社区,专注高效运维.DevOps.性能优化.Docker.MySQL等方向,热衷技术分享,欢迎一起讨论技术,互相学习,共同进步. 前言 持续集成和部署是每一个互联网开发团队都必须要面对的问题,特别是在初创公司,由于业务和技术团队快速增长,技术积累较弱,所以一个高效的,