- 《架构师》2020年11月
- InfoQ中文站
- 1638字
- 2020-11-26 18:07:39
网易CI/CD实践(下):测试自动化及API版本管理
在前面两篇文章中,我们详细介绍了网易轻舟的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领域有过深入的研究和实践。