在前面两篇文章中,我们详细介绍了网易轻舟的 CI 和 CD 实践,同时我们也知道在网易实践中,CI 和 CD 是分开的,但其实对用户而言,CI 和 CD 应该是一体的,如何解决这两者的矛盾呢?
网易轻舟的做法是通过流水线触发器中的 Pipeline 关联触发功能串联了 CI 以及 CD 流水线,用户可以预先在容器部署模块,创建对应的容器应用,然后在 CD 流水线中添加部署阶段,并选择对应的应用/部署进行更新升级。
需要注意的是,网易轻舟并没有在流水线这里提供太多的部署配置,仅提供了镜像升级。某些运维相关的配置项,比如部署策略、Service、环境变量等,依然需要到容器部署模块修改。这么做的目的,是为了限制流水线侧的权限范围,因为绝大多数情况下,持续集成面对的都是应用的更新场景,所以这么做也可以保证流水线可以长期稳定运行。
测试自动化
解决完 CI/CD 的连接问题,接下来我们就要关注测试的部分。梅光辉表示:“自动化测试是打通持续集成和持续交付的核心,没有有效的自动化测试保证,持续集成与持续交付就仅仅是一个没有灵魂的空壳。因此,网易轻舟在 CI/CD 中引入了对自动化测试的全方位支持。”
通常来讲,自动化测试分为单元测试自动化、接口测试自动化、集成(UI)测试自动化这三个层面。
自动化测试的三个层面的关系如上图所示,越往上越靠近 QA、业务和最终用户,但与此同时执行起来成本也越高、速度越慢、投入产出也越低。因此,业内最佳实践往往是加大最底层单元测试的占比(70%),再配合一定的接口自动化测试(20%)以及集成测试(10%)。
如果从 CI/CD 最佳实践来看,单元测试自动化一般在 CI 阶段就会 cover 掉,并作为代码合入的标准。而在发布过程中,则主要是接口测试自动化,以及最终的集成测试自动化。
针对接口自动化测试,CI/CD 在流水线中集成了网易内部的 GoAPI 接口自动化测试平台,如下图所示:
用户通过预先在 GoAPI 自动化平台配置接口测试执行集,然后在流水线中配置执行集,就可以在流水线执行过程中自动执行并产生测试质量报告了。
集成测试自动化一般是由 QA 或开发人员编写对应的自动化测试代码,来覆盖系统核心的使用流程,实现端到端的场景测试自动化。目前这方面技术最成熟的是 Java 生态,因此,网易轻舟内部技术选型采用较多的是 TestNG 等自动化测试框架,再结合 Retrofit、cucumber 等框架。
同时,CI/CD 中也提供了对 TestNG 工具的支持,用户在流水线部署阶段之后添加对应的集成测试阶段,然后配置相应的测试工程容器镜像,就可以在流水线执行过程中执行自动化测试了,并且也可以选择将生成的测试结果数据上传至对象存储或第三方平台,然后就可以在流水线执行页面提供相应的跳转链接查看测试结果了。
API 版本管理
无论是对于 API 的设计者,还是调用方,API 版本管理都是十分重要的。在实际应用中,随着业务的不断发展,API 也会不断变化,这时我们会常碰到的问题就是 API 的向后兼容性,当出现需求变更、考虑不全的情况,兼容性的实现就会变得复杂。
网易轻舟采用的是 RESTAPI 的设计风格,每个接口都对应着对一种资源的操作,版本信息直接放在 URL 中,表示每种资源都会有一个对应的版本。比如获取应用列表的 API 就是 GET /api/v1/applications 。一般情况下,在对应用的数据模型进行扩展和修改的同时,都会考虑数据的兼容性情况,比如某个字段的命名修改,在接口上会同时支持两个不同参数,而在实现上会将两个参数映射到同一个字段。同时在接口文档中,也会有说明告诉用户能够尽快做出修改。
如果应用对应的数据模型发生了无法兼容的变更,那就会将接口从 v1 升级到 v2,变为 GET /api/v2/applications。v1 版本的接口和 v2 版本的接口会同时提供对外服务,但是除了 bug 修复外,一般后续需求如果有对 API 的更新,都会在新版本中进行更新,用户如果想要使用新功能,需要主动迁移。
汪灿丰表示:“这种 API 管理方式是目前比较成熟的方式,当然,一般情况下都是会采用兼容的设计方案。”
采访嘉宾简介:
汪灿丰,网易杭州研究院高级产品开发工程师,专注于云原生以及 DevOps 领域,目前主要负责网易轻舟 CICD 的研发工作。
梅光辉,网易杭研究院高级服务端开发工程师,目前主要负责网易轻舟 CICD 研发工作,在云原生以及容器 DevOps 领域有过深入的研究和实践。
相关阅读:
评论