06 | 代码入库到产品上线:Facebook如何使用CI/CD满足业务要求?
06 | 代码入库到产品上线:Facebook如何使用CI/CD满足业务要求?
讲述:葛俊
时长17:51大小16.34M
3 个“持续”的定义和作用
CI/CD 流水线的具体原则以及最佳实践
基本原则 1:流水线的测试要尽量完整
基本原则 2:流水线的运行速度一定要快
基本原则 3:流水线使用的环境,尽量和生产环境一致
具体案例:Facebook 是如何实施 CI/CD 来提高效能的?
小结
思考题
赞 4
提建议
精选留言(26)
- 刘晓光2019-09-05最大的困难有三个都在人的工作习惯上:有效且同期建设的单元测试;每天至少一次的push代码;轻量级频繁的code review
作者回复: 第七篇文章会有一些相关讨论。希望对你能有些帮助。有问题继续讨论 :)
共 2 条评论10 - 技术修行者2019-09-131. 在几千名开发人员共同使用一个大代码仓的工作方式下,做好 CI 有很大的挑战性。你觉得挑战在哪里,容易出现什么样的问题,又应该怎么解决呢? 最大的挑战有两个:1. 代码冲突如何处理。2. 模块之间的依赖如何解决。 对于1,首先是要改善团队文化,鼓励大家频繁提交,而不是只在每天下班前提交一次,其次,出现冲突,需要开发人员自己解决,这部分在做plan,最好能预留一些buffer,不然大家都在赶进度,都不会愿意去做,容易拖到最后,更不容易解决。 对于2,模块之间尽量松耦合,要保证模块之间的接口是稳定的。 2. 今天我提到了持续开发在 CI 中的作用,请你结合上一篇文章,思考一下持续开发和 CI/CD 是怎样互相促进的。 CI/CD的快速反馈,对于持续开发来说,是一个正向激励的作用,让开发人员对于正在开发的功能更有信心。展开
作者回复: 非常好的答案!一点我的想法: > ...首先是要改善团队文化,鼓励大家频繁提交, 这个推荐实时文章中的思路和办法 > ...而不是只在每天下班前提交一次... 是的。这个应该是做原子性的提交。做好一个马上就提交。而不是每天提一次的。另外,如果Commit比较大,可以每天都`git fetch; git rebase`一次,把最近一天的冲突在本地解决,然后继续在本地开发,直到commit 做完再提交
6 - 于小咸2019-09-05使用git rebase的话,具体操作流程应该是 add /rm ->commit ->pull ->rebase ->push 这样子对吗
作者回复: 对的。不过一般中间哪一个pull是使用fetch。因为pull会自动merge。所以, add /rm ->commit ->fetch ->rebase ->push
共 2 条评论5 - 陈斯佳2020-04-07终于搞懂了持续交付和持续部署的区别,主要就是前者仅限于非生产环境,目的是随时随地提供可部署的软件;后者则是直接部署到生产环境中。看老师的观点,也就是提交量很大的情况才会考虑到持续部署。鉴于我们公司的提交量还处于excel checklist的可以摆平的状况,持续部署应该在很长的时间内不需要我去担心了……重点关注持续集成和持续交付上
作者回复: 是的,只有一部分公司需要持续部署。
1 - Lu2020-03-18老师您好~ 我所在的组织在尝试CICD流水线从而实现云上部署。CI流水线这一步每次都会有安全漏洞检查,单这个检查本身耗时很久,而且还需要等待排队,解决这个问题可以从哪些方面入手呢?谢谢。
作者回复: 这个可以从几个方面入手: 1. 提高安全检查时间。如果能做到增量代码检查(只检查改变的代码涉及的部分)就可以大大提高效率 2. 降低运行安全检查的频率。参考第六篇文章的“基本原则 2:流水线的运行速度一定要快”部分。我们可以考虑不要对每一个代码入库都运行安全漏洞检查,而是每个一段时间运行一次。如果发现问题再从上一次检查的提交到这一次检查的提交之间用折半查找去找到有问题的提交进行修复。
1 - GeekJ2020-02-02您好,我想请问在Facebook管理协作中,整个流水线的衔接、协作、融合、改进,是谁来推动的呢?或如何触发的呢?
作者回复: 触发主要是1. 代码进入代码检查中心Phabricator。实际上Phabricator是流水线的神经中枢。代码入库之前,开发者会把改动发送到Phabricator,这会触发代码审查和机器检查流水线。2. 代码入库(git server)后Phabricator会监控到,然后出发各种流水线。3. 同时流水线还有定时的触发。比如每隔一段时间构建、运行测试、部署到一个测试环境上。 改进、融合的工作主要是工程师团队和Infrastructure团队共同推动。工程师团队会有需求,他们可以自己改进,当然更多是Infrastructure团队改进。Infrastructure团队也会考虑改进。工具部门就是Infra的一部分。
1 - 詩鴻2019-09-18使用大仓和组件化多仓的权衡关键主要是什么呢?
作者回复: 这篇文章有不错的权衡列表: 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
共 2 条评论1 - Geek_93f9532019-09-04持续集成、持续交付、持续部署的核心区别在我看来是自动化测试能力: CI 每天多次将多人开发的代码合并到主干,并进行构建、代码检查、冒烟测试 CDelivery 自动将CI的结果打包、在测试环境和类生产环境进行自动化测试 CDeploy 自动将CDelivery的结果进行回归测试,并按照预设的灰度策略部署到生产环境
作者回复: 嗯,可以这么理解。测试能力越强,可以自动化保证质量的地方就更多,就可以更快!
1 - cywen2023-01-08 来自江苏单元测试如何分级以使每次提交不用全量跑所有单元测试用例?在springboot项目中,单元测试一旦多起来,全量跑完耗时比较长,我们300多个用例就需要15分钟,每次提交都需要15分钟,开发使用的热情收到很大影响
- 我是xd2022-05-10目前经常说的CI CD主要是指持续集成、持续交付。持续部署一般公司都有固定的发布大版本的时间,不会频繁发布线上,除了紧急的hotfix。 持续集成是指开发频繁提交本地的开发代码到主干分支上进行代码集成,避免所有开发同一时间提交大量代码产生的代码冲突问题 持续交付是指对开发持续提交的代码发布到测试环境测试,测试通过后发布预发环境测试,确保每次提交后最新的主干分支验证通过保持可上线状态展开
- 小包2021-02-19Facebook 就有大量的单元测试和集成测试用例、安全扫描,以及性能专项测试用例 ------ 集成测试、安全测试、性能测试这些测试用例facebook是哪个角色完成的呢?
- Geek_0939f62021-01-05问题1最大困难是代码提交都会卡在最后时刻,不管如何强调必须提前合并但是还是不被遵循,最后导致code reviews时间压缩,review不了了之流于形式
- oliver2020-04-22增量测试有个问题,如果是较大范围的代码重构,如何确定增量测试的边界呢?
作者回复: 这个跟平时的改动差不多呀,就针对每一处改动,找到相关的依赖,都运行测试。
- 墨灵2020-03-24我现在的公司还没有CI/CD,看来要花时间搞起来,小公司很多东西都是不规范的。
作者回复: CI 非常有效。推荐搞起来。
- 蚂蚁内推+v2020-01-13大仓库的缺点1.cu的执行效率可能有影响,代码获取,单元测试等全面检查等耗时长;2.代码的分支管理和合并复杂 Fb会做增量单元测试或自动化测试吗?她们包含部署和自动化测试的流水线的耗时大概是多少?我们面临的问题是部署时间5~10分钟,极大影响的反馈效率
作者回复: > Fb会做增量单元测试或自动化测试吗? 如果大仓不做增量测试增量检查的话,效率就会极低。所以FB大量使用这样的实践。在本地运行的测试和检查基本上全是增量的。流水线上的也有相当一部分是只运行增量检查。 > 她们包含部署和自动化测试的流水线的耗时大概是多少? 本地检查一分钟。本地就可以构建跟生产比较一致的环境。所以反馈效率很高。CI实践会长一些,大概一二十分钟。
- 宝宝太喜欢极客时间了2019-10-13我再jenkins+gitlab+sonar做集成的时候,想通过Merge Requests触发代码检查,并且只检查请求合并的代码,这样能实现吗?有没有实现的教程可推荐呢?共 4 条评论
- 高倩2019-09-17比如,一个需求是基于用户不同状态来衍生出来的需求。测试过程中,需要考虑各种用户可能存在的状态扭转,以及对应的测试。但是上线以后,还是会存在没有考虑到的历史存量用户因为长期的业务累积,出现了预期之外的状态。导致代码上线以后,需要回滚。 再者,因为是多个端开发实现,上线时有一定的顺序上线,那比如等到中间上线的应用出现了问题。再想要回滚时,可能因为数据库数据被更改了的原因,导致无法回滚。后续就只能通过修复代码,或者修复数据库的办法才能解决展开
作者回复: > ...但是上线以后,还是会存在没有考虑到的历史存量用户因为长期的业务累积...
共 2 条评论 - lisa2019-09-16请问facebook的性能测试平台和ci流程是怎么结合的?有专门的平台,还是这部分测试代码和单侧代码一样也是集成在工程里面随ci流程触发?
作者回复: 这个问题答案我不是100%确定。应该是集成在工程里面随CI流程触发的。而且并不是每一个CI都触发,因为比较昂贵和耗时。
- 师傅又被抓走了2019-09-051 .在几千名开发人员共同使用一个大代码仓的工作方式下,做好 CI 有很大的挑战性。你觉得挑战在哪里,容易出现什么样的问题,又应该怎么解决呢? 容易出现代码合并冲突。出现冲突时的处理策略,回退or丢弃?冲突时,如何保证后续提交,可以正常合入? 功能依赖。功能模块大都不是独立的,如何保证双方一同合入? 代码功能冲突,大量冗余代码,一些功能可能会出现重复定义。 解决方案(我也不清楚,感觉需要一个好的架构师)展开
作者回复: 请参考对Weining Cao问题的回复。
- Weining Cao2019-09-05挑战在如何快速解决合并冲突。如何快速同步开发机器的代码保持最新。还有如果测试失败如何快速回滚。
作者回复: > 挑战在如何快速解决合并冲突。 开发人员自己解决。提交做到原子性有很大帮助。 > 如何快速同步开发机器的代码保持最新。 经常`git fetch; git rebase origin/master`。 > 还有如果测试失败如何快速回滚。 1. 减少入库时的测试失败:多使用本地测试 2. 入origin/master库之后不会滚。写修复提交再赶紧push上去。实在不行,`git revert`命令产生一个新提交push上去。