1 前言
随着京东金融业务的不断拓展,客户端开发团队人数激增,代码量急剧膨胀,业务的成长和人员的倍增给技术架构、团队合作、产品的交付都带来了巨大的挑战,本文将讲述京东金融移动 APP 是如何保证高效、稳定、安全、高质量的持续交付,希望借此机会向大家分享经验与教训,与大家共同探讨移动 APP 高质量持续交付之道,在讨论移动 APP 持续交付之前先介绍一下京东金融研发协同平台。
京东金融研发协同平台(简称 JCI)致力于将构建、部署、测试、发布的过程自动化,以此来帮助用户高效且安全地交付研发成果;JCI 集成了应用管理、组件管理、移动 APP 管理、产品管理、代码管理、编译构建管理、发布管理、审批管理等功能,从研发协同、代码质量、安全、快速交付、测试及结果反馈等几个方面打造了一条完整的工具链。
移动 APP 持续交付模块作为 JCI 最重要的模块之一,将测试、编译打包,发版、构建渠道包,上传生产服务器等手工操作实现了完全自动化,让整个交付过程变得可靠、可预期、可视化、改变了移动 APP 的交付方式,让开发人员从琐碎的重复劳动中解放出来。
2 平台理念
移动 APP 持续交付的理念是构建研发流程闭环。
3 JCI 移动 APP 持续交付模块具备哪些能力?
从上面这张图可以看到,我们移动 APP 持续交付模块对开发所依赖的基础环境,如代码托管服务(提供 svn 和 git 两种方式)、在线代码 review,组件类的依赖管理,iOS 开发需要的证书管理,流程化权限管理、渠道号管理等都提供了统一的服务。除此以外,开发所有的活动都承载在项目管理里,项目管理中提供了变更管理、提测管理、版本管理、集成管理、任务和需求管理的能力。为了提高代码质量,也提供了静态代码扫描的能力,使用多种工具进行静态代码扫描,并可配置扫描任务,配置安全规则、展示扫描数据等。在整体的移动 APP 构建过程中,我们提供了 Android/iOS 机器环境管理、构建参数管理、调度管理、持续集成管理和包管理。而在发布过程中,根据不同的发布场景提供了不同的发布能力,比如说全量发布、灰度发布、渠道发布、Patch 发布。
4 持续交付流水线
首先什么是持续交付?我们如何定义持续交付的呢?用通俗点的话讲,持续交付是指研发能够快速、安全、频繁的向客户交付价值,以便尽早得到生产环境中反馈的问题。
移动 APP 持续交付平台的核心就是建设可靠可重复的交付流水线,通过交付流水线,将全局过程标准化、自动化、可视化,关键流程和节点管控,实现并行开发过程中的协同和管理。
整个交付过程把需求、开发、集成、测试、发布一体化;各个阶段相互独立,并加入规范化的流程。
开发阶段:
当有项目需要开发,开发细化了产品需求和发布计划,拆分成独立的 bundle,各个 bundle 有着自己的需求、开发、测试计划,相互独立,开发可以通过看板管理自己的需求和任务,需求关联上线分支,配合每次发布,统一记录跟踪需求处理进度。
开发创建分支进行编码,编码完成之后可以在平台上进行代码 review,并在 JCI 创建一个变更关联开发分支进行构建编译。
当完成当前 bundle 的开发和自测以后,进入第二阶段即集成阶段。
集成阶段:
所谓的集成是我们把多个项目需求集成在一起,代码合并到集成分支,打成一个整体的包,然后对整体进行回归和测试。在集成阶段,开发同样在 JCI 上创建一个变更并关联到集成分支,然后将集成分支构建编译集成测试包,这个阶段会有加入一些静态代码扫描,JCI 是集成了多种静态代码扫描工具进行代码的安全扫描,如果开发验证结果没问题,就可以提交测试进行全回归测试。
开发可以随时关联集成分支触发构建。构建成功后会把 ipa/apk 包生成二维码,并微信通知将二维码发送给相关测试或者开发,通过手机扫描二维码可直接安装对应版本。
在构建结果页面中展示当次构建的成果物(如.ipa、.apk、info.plist 等文件),供有需要的用户进行下载。
集成阶段支持各种类型的持续集成任务配置运行和结果通知,静态代码扫描等,代码扫描结果如图:
测试阶段:
开发提交测试的同时,JCI 会自动生成测试基线。
测试可以根据不同配置构建测试和生产环境包。
集成测试阶段,测试可以通过接口自动构造中间态测试数据,通过 mock 平台模拟同步、异步、多协议接口返回,根据交易 ID 及各类信息,自助跨服务追踪和定位问题,降低被动配合成本,减少测试依赖,提升稳定性和效率,如果测试认为当前的版本测试质量符合预期了,就可以提交发布申请,进入发布阶段。
发布阶段:
由测试提交发布申请,APP 负责人进行审批,审批通过之后,分支代码会自动合并到基准线。
JCI 平台支持渠道包的构建更新、推送和下载,并支持渠道号维护,如果需要构建渠道,可通过 JCI 批量构建渠道包,并推包推送给用户,一个持续交付流程就终结了。
渠道号管理支持上传渠道文件,同时也支持增量上传和覆盖上传。
渠道包构建和推送平台:
整个过程还有必不可少的一部分就是配置管理及代码协作工作流,保证整个研发过程能够高效、安全、高质量的交付,离不开可靠的分支策略,JCI 移动 APP 的分支策略采用分支开发模式,具体的工作流如下图:
开发人员开始一个新的 feature 从主干创建特性分支,然后在这个分支上提交代码修改,也就是说每一个 feature(可以是一个人完成,也可能是多个人完成)对应一个特性分支。等到要发版时,从主干拉出一条新的发布分支 Release A,将本次要发布的特性分支依次合并到发布分支。开发用发布分支去提测时会自动创建提测标签,发布完成之后,发布分支自动合并到主干上,并自动创建发布标签。
5 交付效率
前面我们已经介绍了整体的交付的流水线,对整个持续交付平台,效率其实是一个很重要的因素,如何来保证效率?这是我们未来要走的路,虽然现在研发流程、质量保障方面有了一些积累,但是在移动 APP 这个领域还有很多问题等待我们去解决。
整个交付效率要从开发、测试、发布三个阶段来提升。
如何提升开发效率?
随着业务的增加,代码功能稳步上升, 合并代码全靠开发线下进行,代码合并时间呈指数级上升,效率极低且容易出错,因此需要在架构上进行组件化拆分,使每一个组件都有一个自己独立的工程,解决协同合作的问题,提升研发效率。
另外就是二进制交付,比如说我们有一个 APP 有十几万行代码,本次发版修改了 1000 行代码,传统的源码交付的方式,是需要将这十几万行代码全部重新编译一次,才能产生这个 APP,效率特别低下,如果能做到二进制的交付,也就是只需要交付增量的部分,这 1000 多行代码可能也就涉及到几个模块,这几个模块加在一起可能也就几千行代码,我们当前需要交付的就是这几千行代码的模块就可以了,由十几万行代码变成几千行代码的交付。
最后是依赖管理,它本身是依赖前面的二进制交付,前提是将整个 APP 都拆分成了模块,对交付而言只需要更新其中几个模块,这几个模块就可以通过依赖管理来管起来。
如何提升测试效率?
测试效率通常是通过自动化工具来实现。在之后 JCI 平台会提供了静态代码扫描、UI 自动化工具来提升整体的效率,通过各种代码扫描工具进行扫描,然后获取扫描结果,集成到平台,自动化进行单元测试与统计数据采集,并生成报表。
如何提升发布效率?
平台已经具备批量构建渠道包并推送生产的能力,目前欠缺的是如何让平台具备精准发布的能力和线上监控的能力,精准发布就是可以按照版本来发,按照渠道、机型、网络、设备、IP 等等,另一个就是多批次的方式控制发布节奏,同时每个批次可以控制我们的用户量,比如说第一批次发 1000 人,看一下效果,如果 Crash 指标都很正常,就再发一部人,逐渐地迭代,保证我们整体发布的可控。其实整个过程最核心的问题就是需要实时监控线上的数据指标,比如线上舆情数据、性能监控数据,以及线上实时 crash 数据、 UV 数据等。通过这些数据来判断当前交付的版本是不是符合预期,一旦发现当前交付的版本并不符合我们的预期,那么就需要停止当前的版本发布,尽量减少用户的影响。如果我们当前线上的这个问题比较严重,那么我们会立刻对当前线上的版本做一个回滚,或者说我们通过热修复的手段来解决。
6 总结
最后总结,持续交付平台是一个一站式的全生命周期的管控平台,它提供了从开发到构建、测试、发布、运维、运营的全生命周期的管控,集成了开发规范、测试规范、发布规范,也是一个效率提升和质量提升的平台,在移动 APP 这个领域我们还有很多问题没有解决,前方的道路依然坎坷,我们会更加努力,并不断前行。
评论