简介:百度资深架构工程师通过技术手段提高研发效率的实践。
背景
去年底团队接手负责 30 多个面向 ToB 的平台系统,系统多,需求紧,人力缺口一直存在,主要问题体现在:
通过技术手段提高研发效率一直是我们追求的目标。今年通过对业界和公司内部爱番番团队的相关技术调研,决定对现有研发流程进行改进规范,通过 CI/CD 能力建议,提高研发效率和降低运维成本(感谢爱番番团队的 CI/CD 工作!)
今天主要从以下方面来说明 CI/CD 针对 ToB 场景的最佳实践,除了说明做了 What 外,更重要希望能从价值收益上说明 How 和 Why。(注:ToC 与 ToB 各方面差异较大)
简单理解:Continuous Integration/Continuous Deployment
深入理解:基于新兴的 DevOps 文化,以管道的形式,通过自动化构建、测试和部署,缩小开发团队和操作团队之间的差距,以到达快速稳定的交付目的。
Devops
DevOps 是 Development 和 Operations 的组合,是一种思想、一组最佳实践、以及一种文化,用于促进应用开发、应用运维和质量保障(QA)部门之间的沟通、协作与整合。以期打破传统开发和运营之间的壁垒和鸿沟。
CI
CI 即 Continuous Integration 的缩写,开发人员将会频繁地向主干提交代码,这些新提交的代码在最终合并到主干前,需要经过编译和自动化测试流进行验证;
CD
CD 可对应多个英文名称,持续交付 Continuous Delivery 和持续部署 Continuous Deployment;
Continuous Delivery
完成 CI 中构建及单元测试和集成测试的自动化流程后,持续交付可自动将已验证的代码发布到存储库。为了实现高效的持续交付流程,务必要确 CI 已内置于开发管道。
持续交付的目标是拥有一个可随时部署到生产环境的代码库。
Continuous Deployment 对于一个成熟的 CI/CD 管道(Pipeline)来说,最后的阶段是持续部署。作为持续交付 —— 自动将生产就绪型构建版本发布到代码存储库 —— 的延伸,持续部署可以自动将应用发布到生产环境。
涵盖范围
涵盖软件开发全生命周期,作用于各个阶段
基本原则
CI/CD 实施的基本前提条件是根据团队的技术能力现状,制定符合团队实际情况的研发流程规范。
技术全景图
研发流程规范
分支管理规范
Pipeline 规范
部署设计
方案一与方案二的区别是 index.html 放在 BOS 还是 RD 服务器?
优先推荐方案一:
方案一里有些后端可能无法配置转发;
备注:最优方案是由 BFE 配置转发规则至 BOS,不用经 RD 集群,但目前 BFE 无法直接转发至 BOS。
版本说明
前端静态资源版本一般分两种方式管理:
Hash 版本号:基于文件内容的 MD5 值,取部分长度或全部长度,做为文件的版本号,每个文件都有不同的版本号,适合于增量发布,节约存储空间。例如:index.abcd12.js,manifest.123456.js 等
时间戳版本号:以当前构建时间点为准,生成时间文件夹,构建结构部署在时间文件夹下。适合于全量发布。
目前选用时间戳版本号,考虑有如下:
Hash 版本,适合容器化部署,比如 Docker、Jarvis,每次包括所有资源文件;Bos 如果使用 Hash,文件夹下同名资源会有很多,显得较乱。
部署目录结构实例
performance
|---- 202101281200
| |---- css
| |---- js
| |----index.js
|---- 202101291200
| |---- css
| |---- js
| |----index.js
version.js
index.html
index.html 和 version.js 承担版本号维护,每次上线时更新版本号。
现状
前端中是大部分是无测试的,国外的一项调查显示,有 43% 的 developer 没有做过任何前端相关测试,两个主要原因:
以上两点导致前端测试不受重视,很多开发可能工作好几年年仍未写过测试。
我们为什么要做单测
ToB 业务 与 ToC 相比:
单测带来的收益:
前端自动化测试分层
E2E 测试:是一种黑盒测试,测试的是应用的执行是否从头到尾都按设计完成。
整个应用程序已在实际场景中进行了测试,其中包括测试组件之间的通信,例如数据库,网络,API 等,以及在各种浏览器中执行代码基本上测试一切。设置会花费很多时间,而且成本最高。
集成测试:测试程序之间的交互,例如,UI 和 API 之间的通信。设置所需的时间较短,也不太昂贵。
单元测试:是最小粒度的测试,因为它包括将代码的孤立部分作为单元进行测试。这些单元可以是方法,属性,某一个 UI 元素点击、输入这样的动作等形式。例如说我有一个函数,通过入参的不同,去覆盖逻辑的不同 if else 这样的分支,然后去确认函数的返回值是否与我们预期的一致,代码是否按预期执行,这就需要写断言,对于前两个测试类型来说,这是最快,最便宜的实现方式。
可以看到在金字塔中走的越高,建立我们的测试所花费的时间和成本(越耗时,失败时的信息越模糊,越难跟)就越多。这就是为什么许多项目倾向于专注于单元测试的原因,因为它们可以通过涵盖大多数场景,省时省力的去测试我们的代码。
Jest 表现强劲,在满意度和使用度维度都有不错的表现:
现状问题
随着业务逻辑越来越复杂,前后端分工与协作难免会出现争议,表现在:
故制定此标准,意在明确前后端分工,减少沟通成本,减少开发维护成本,提升客户体验。
基本原则
其他具体的约定参考阿里的《Java 开发手册》里的前后端规约章节。
工程能力地图的价值:
价值体现
无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新,随着时间推移,版本迭代,接口文档往往很容易跟不上代码。
Swagger 提供了一套规范去定义接口及接口相关的信息,RD 只需要按照规范编写描述文件,就可以做到自动生成各种格式的接口文档,生成多种语言的客户端和服务端的代码,以及在线接口调试页面等等。
YAPI 对各角色同学都有价值: