研发效率破局之道
葛俊
前 Facebook 内部工具团队 Tech Lead
34093 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
开篇词 (1讲)
研发效率破局之道
15
15
1.0x
00:00/00:00
登录|注册

06 | 代码入库到产品上线:Facebook如何使用CI/CD满足业务要求?

解决:测试分层、定时运行、单主干开发分支、git rebase、持续部署
问题:资源消耗、提交历史、精准定位问题
挑战:几千名开发人员共同使用一个大代码仓
极致地进行自动化测试验证
验证进行分级
按照一定时间间隔进行验证
Phabricator作为CI驱动,进行各种静态检查、单元测试、集成测试、安全测试、性能测试
本地验证与CI流水线验证方式保持一致
软件包只构建一次、使用Docker镜像、使用干净的环境
权衡运行速度、资源和测试完整性
技术角度考虑:并行运行测试、水平扩展、增量测试
大量高质量的测试和检查
目标:将每一个代码提交,都构建出产品直接部署给用户使用
问题:频繁发布产品,提前发现问题
目标:对每一个进入主干分支的代码提交,构建打包成可以发布的产品
目的:尽早、频繁地进行代码集成,减少冲突和低效能问题
问题:代码合并太晚
持续开发和CI/CD的互相促进
挑战和问题
持续部署
CD
CI
流水线使用的环境,尽量和生产环境一致
流水线的运行速度一定要快
流水线的测试要尽量完整
持续部署(CD)
持续交付(CD)
持续集成(CI)
思考题
具体案例:Facebook是如何实施CI/CD来提高效能的?
CI/CD流水线的具体原则以及最佳实践
3个“持续”的定义和作用
代码入库到产品上线:Facebook如何使用CI/CD满足业务要求?

该思维导图由 AI 生成,仅供参考

你好,我是葛俊。
在上一篇文章中,我和你分享了代码入库前的流程优化,即持续开发。今天,我会继续与你介绍流程优化中,代码入库和入库后的 3 种持续工程方法,即持续集成(Continuous Integration, CI)、持续交付(Continuous Delivery, CD)和持续部署(Continuous Deployment, CD)。
在接下来的分享中,首先我会与你介绍这 3 种方法的定义和作用,帮助你深入理解这 3 个“持续”背后的原理和原则;然后我会以 Facebook 为参考,给你介绍基于这些原则的具体工程实践。我希望,这些内容能够帮助你用好这三个“持续”方法,提高团队的研发效能。
首先,我先来介绍一下,持续集成、持续交付和持续部署是用来解决什么问题的,也就是它们的定义和作用。

3 个“持续”的定义和作用

不知道你是否还记得,在开篇词中,我提到过一个低效能的情况,即产品发布上线时出现大量提交、合并,导致最后时刻出现很多问题。这个情况很常见,引起了很多用户的共鸣。产生这个问题最主要原因是,代码合并太晚。这里,我再与你详细解释一下原因。
当多个人同时开发一款产品的时候,很可能会出现代码冲突。而解决冲突,需要花费较多的时间;同时很可能出现冲突解决失败,导致产品问题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Facebook在代码入库到产品上线的流程中,采用了持续集成(CI)、持续交付(CD)和持续部署(CD)这三种持续工程方法。这些方法的出发点是解决代码合并导致的低效能问题,通过尽早、频繁地将代码推送到共享的代码仓库分支上,减少代码冲突造成的问题。Facebook注重运行大量高质量的测试和检查,以及投入硬件资源、使用增量测试等方式来提高流水线的速度。Facebook在CI方面加强持续开发,让开发人员能在开发环境上进行大量的验证,同时使用Phabricator作为CI的驱动,并作为质量检查中枢,尽量提高入库前代码审查的流畅性。在持续交付方面,Facebook使用大仓,同一个仓中每天有几千个代码提交,因此采用了按照一定时间间隔进行验证的方式,同时对验证进行分级。在持续部署方面,Facebook极致地进行自动化测试验证,采用类似持续交付的方法,把一段时间之内的提交一起部署。Facebook的实践为读者提供了具体的原则和最佳实践,帮助他们加深理解并应用这些方法来提高团队的研发效能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《研发效率破局之道》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(27)

  • 最新
  • 精选
  • 刘晓光
    最大的困难有三个都在人的工作习惯上:有效且同期建设的单元测试;每天至少一次的push代码;轻量级频繁的code review

    作者回复: 第七篇文章会有一些相关讨论。希望对你能有些帮助。有问题继续讨论 :)

    2019-09-05
    2
    11
  • 技术修行者
    1. 在几千名开发人员共同使用一个大代码仓的工作方式下,做好 CI 有很大的挑战性。你觉得挑战在哪里,容易出现什么样的问题,又应该怎么解决呢? 最大的挑战有两个:1. 代码冲突如何处理。2. 模块之间的依赖如何解决。 对于1,首先是要改善团队文化,鼓励大家频繁提交,而不是只在每天下班前提交一次,其次,出现冲突,需要开发人员自己解决,这部分在做plan,最好能预留一些buffer,不然大家都在赶进度,都不会愿意去做,容易拖到最后,更不容易解决。 对于2,模块之间尽量松耦合,要保证模块之间的接口是稳定的。 2. 今天我提到了持续开发在 CI 中的作用,请你结合上一篇文章,思考一下持续开发和 CI/CD 是怎样互相促进的。 CI/CD的快速反馈,对于持续开发来说,是一个正向激励的作用,让开发人员对于正在开发的功能更有信心。

    作者回复: 非常好的答案!一点我的想法: > ...首先是要改善团队文化,鼓励大家频繁提交, 这个推荐实时文章中的思路和办法 > ...而不是只在每天下班前提交一次... 是的。这个应该是做原子性的提交。做好一个马上就提交。而不是每天提一次的。另外,如果Commit比较大,可以每天都`git fetch; git rebase`一次,把最近一天的冲突在本地解决,然后继续在本地开发,直到commit 做完再提交

    2019-09-13
    6
  • 于小咸
    使用git rebase的话,具体操作流程应该是 add /rm ->commit ->pull ->rebase ->push 这样子对吗

    作者回复: 对的。不过一般中间哪一个pull是使用fetch。因为pull会自动merge。所以, add /rm ->commit ->fetch ->rebase ->push

    2019-09-05
    3
    6
  • 詩鴻
    使用大仓和组件化多仓的权衡关键主要是什么呢?

    作者回复: 这篇文章有不错的权衡列表: https://dev.to/pavanbelagatti/what-do-you-prefer-and-why-mono-repo-or-multiple-repositories-401b 从我的经验看,大仓的最大挑战是代码仓太大之后,会让很多操作性能下降。而git本身对代码仓中的子文件夹的支持不好。如果能克服这个挑战,使用大仓非常好! 一些推荐的解决办法: https://www.perforce.com/blog/hth/multiple-git-repositories-whats-best-way-manage-them

    2019-09-18
    2
    2
  • 陈斯佳
    终于搞懂了持续交付和持续部署的区别,主要就是前者仅限于非生产环境,目的是随时随地提供可部署的软件;后者则是直接部署到生产环境中。看老师的观点,也就是提交量很大的情况才会考虑到持续部署。鉴于我们公司的提交量还处于excel checklist的可以摆平的状况,持续部署应该在很长的时间内不需要我去担心了……重点关注持续集成和持续交付上

    作者回复: 是的,只有一部分公司需要持续部署。

    2020-04-07
    1
  • Lu
    老师您好~ 我所在的组织在尝试CICD流水线从而实现云上部署。CI流水线这一步每次都会有安全漏洞检查,单这个检查本身耗时很久,而且还需要等待排队,解决这个问题可以从哪些方面入手呢?谢谢。

    作者回复: 这个可以从几个方面入手: 1. 提高安全检查时间。如果能做到增量代码检查(只检查改变的代码涉及的部分)就可以大大提高效率 2. 降低运行安全检查的频率。参考第六篇文章的“基本原则 2:流水线的运行速度一定要快”部分。我们可以考虑不要对每一个代码入库都运行安全漏洞检查,而是每个一段时间运行一次。如果发现问题再从上一次检查的提交到这一次检查的提交之间用折半查找去找到有问题的提交进行修复。

    2020-03-18
    1
  • GeekJ
    您好,我想请问在Facebook管理协作中,整个流水线的衔接、协作、融合、改进,是谁来推动的呢?或如何触发的呢?

    作者回复: 触发主要是1. 代码进入代码检查中心Phabricator。实际上Phabricator是流水线的神经中枢。代码入库之前,开发者会把改动发送到Phabricator,这会触发代码审查和机器检查流水线。2. 代码入库(git server)后Phabricator会监控到,然后出发各种流水线。3. 同时流水线还有定时的触发。比如每隔一段时间构建、运行测试、部署到一个测试环境上。 改进、融合的工作主要是工程师团队和Infrastructure团队共同推动。工程师团队会有需求,他们可以自己改进,当然更多是Infrastructure团队改进。Infrastructure团队也会考虑改进。工具部门就是Infra的一部分。

    2020-02-02
    1
  • 于小咸
    怎样提高自动测试的覆盖率和性能,会是很大的挑战,各模块开发者对其他模块不熟悉,发生bug的机率较高,测试覆盖到位比较难。 业务变化过程中,及时发现不必要的测试,提高测试性能也比较重要。

    作者回复: 我见到比较有效的方法是通过职责定位解决:每个团队对自己的模块负责,并不要求测试覆盖率。就是这么简单的办法就很有效。 比如,如果模块A依赖于模块B,那么首先A的作者会有意愿写一些针对A调用B的集成测试,因为这样的自动化方便在A的开发过程中,确保A的运行正确。 同样的,如果发现B有问题,B的作者会有意愿给B写单元测试和接口测试。因为在A的测试失败找到是B的责任时,B的自动化测试可以节省B的作者的Debug时间。 这样的方式,你觉得在你的团队会有成效吗?

    2019-09-04
    2
    1
  • Geek_93f953
    持续集成、持续交付、持续部署的核心区别在我看来是自动化测试能力: CI 每天多次将多人开发的代码合并到主干,并进行构建、代码检查、冒烟测试 CDelivery 自动将CI的结果打包、在测试环境和类生产环境进行自动化测试 CDeploy 自动将CDelivery的结果进行回归测试,并按照预设的灰度策略部署到生产环境

    作者回复: 嗯,可以这么理解。测试能力越强,可以自动化保证质量的地方就更多,就可以更快!

    2019-09-04
    1
  • oliver
    增量测试有个问题,如果是较大范围的代码重构,如何确定增量测试的边界呢?

    作者回复: 这个跟平时的改动差不多呀,就针对每一处改动,找到相关的依赖,都运行测试。

    2020-04-22
收起评论
显示
设置
留言
27
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部