携程无线持续交付平台工程实践

2020-02-27 173浏览

  • 1.携程无线持续交付平台 赵辛贵
  • 2.个人介绍 赵辛贵 • 08年开始移动开发 • 13年入职携程 • 目前负责移动 App(Native/RN/Hybrid)框架相 关工作 • 关注性能质量和开发效率
  • 3.目录 CONTENTS 1 背景介绍 2 集成平台 3 测试平台 4 发布平台 5 运营平台
  • 4.背景介绍—数据 组织架构 集成发布 工程规模 • 30+ Native模块 • 30+ React Native模块 • 300+ 开发/测试 • 60+ H5 Hybrid模块 • 37个业务团队 •iOS:代码110W行 • 开发人员分散 •Android:代码272W行 • 4000+次App打包/每月 • 3000+次Hybrid&RN发 布/每月 • 1.5月一个版本 • 3天集成测试时间
  • 5.背景介绍—开发流程 需求阶段 Kick off 持续交付 编码、内测 集成交付 APP 需求收集,初 步沟通 DEV 服务端 H5 Hybrid Sit1 UAT集成 UAT集成 UAT集成 UAT集成 Sit2 跨BU联调 跨BU联调 跨BU联调 Sit3 入口测试 堡垒兼容 UAT集成 支付联调 Sit4 堡垒测试 跨团队沟通 FAT 评审 PRD 编写 需求封 板 Sit5 Sit6 Sit7 Launch 主版发 布 推生产 版本兼容 生产测试 功能验证 生产测试 生产测试 推生产 封板 推生产 生产测试 生产测试 增量发布
  • 6.背景介绍—集成平台演化 1. 原始形态 Jenkins build IM/Email发包 测试结果人工收集 2. 1.0版本-减少人工干预 MCD(持续集成 平台) 定时Build 二维码安装测试包 • MCD, Mobile Continuous Delivery的简称 • 基于Jenkins的任务和调度管理 测试结果平台收集
  • 7.背景介绍—集成平台演化 3. 老的发布系统下线, MCD整合Hybrid发布功能 打包集成 MCD Hybrid发布
  • 8.背景介绍—集成平台演化 4. 移动开发生命周期支撑系统(2.0) 集成平台 测试平台 MCD 发布平台 运营平台
  • 9.集成平台—功能与定位 用户 • 开发、测试、项目经理(PMO) 目标 • 确保能够快速及时的打出测试、生产包 • 提高产品交付效率,降低沟通成本 功能 • 打包、持续集成、测试包管理、模块管理
  • 10.集成平台—整体架构
  • 11.集成平台—早期开发流程 创建源码 分支 开发 说明: 1. 所有代码在一个Git仓库 2. 各个业务之间基于源代码依赖 3. SIT集成时间大约需要1周时间 SIT集成 测试确认 灰度发布
  • 12.集成平台—源码依赖的工程结构 Hotel.src Flight.src CTBusiness.src Main Foundation.src ThirdParty.src Train.src Tour.src 痛点: 1. 每次都要从代码仓库下载全量代码 2. 开发/打包编译时间长,MacPro需要8-10min编译,普通iMac需要 20-30min编译 3. 相互影响,编译容易失败
  • 13.集成平台—Bundle依赖的工程结构 Hotel.a HotelBundle Flight.a FlightBundle CTBusiness.a BusinessBundle Main Train.a TrainBundle Tour.a TourBundle 说明: 1. 引入中间产物Bundle(静态库/AAR)依赖 2. 发布流程发生变化 Foundation.a ThirdParty.a
  • 14.集成平台—集成发布流程优化 创建项目 开发 打Bundle包 标记为L 灰度发布 BU打包内测 测试确认 1. 功能开发完成,打Bundle包,默认发布标记为L(Latest) 2. 开发阶段,业务之间依赖彼此的Latest包 3. 测试通过,Bundle标记为RC(Release Candidate) 4. SIT集成阶段打包依赖RC包 Bundle发布 标记为RC SIT集成
  • 15.集成平台—安装包Bundle列表 安装包由各个业务模块Bundle组合而成,每个包都可查看当前Bundle列表
  • 16.集成平台—改造完成之后 1. 集成Build时间从10min下降到3min(MacPro环境) 2. 版本集成时间从1周降低到3天 3. 开发Build时间缩短,开发效率提升
  • 17.集成平台—版本发布日Launch时间 36 12:00 35 11:00 34 10:00 33 09:00 32 08:00 31 07:00 30 Second 06:00 29 Day 05:00 28 04:00 27 03:00 26 02:00 25 01:00 24 00:00 23 23:00 22 22:00 21 21:00 20 20:00 19 19:00 18 18:00 Launch 17:00 17 16 Day 16:00 15 15:00 14 14:00 13 13:00 12 12:00 11:00 11 10:00 10 09:009 launch time 零点 V7.0 V6.21 V6.20 V6.19 V6.18 V6.17 V6.16 V6.15 V6.14 V6.13 V6.12 V6.11 V6.10 V6.9 V6.8 V6.7 V6.6 V6.5 V6.4 V6.3 V6.2 V6.1 V6.0 V5.10 V5.9 V5.8 V5.7 V5.6 V5.5 code freeze
  • 18.集成平台—Bundle调试问题 开发脚本,提供简单配置,一键切换功能
  • 19.集成平台—Bundle依赖 1. 脚本中配置当前Bundle的依赖关系 2. Bundle build完成,发布之前,需要检测是否正确打出包 3. 被依赖的Bundle build完成之后,自动递归build依赖它的Bundle BundleA BundleB2 BundleB1 BundleC1 BundleC2
  • 20.集成平台—Bundle发布控制 1. Size控制 • Bundle build完成,自动计算Size • 准确计算方法:资源文件zip大小+可执行程序新增zip大小*AppStore加壳系数 • 超过Bundle设定的大小,无法发布RC 2. Build支持Bundle灵活选择配置 • 某个Bundle功能有问题时候,可以选择使用该bundle的稳定版本 3. 发布权限控制 • 发布日固定时间,禁止当前发布版本的所有Bundle RC发布权限
  • 21.集成平台—其它问题 1. 打包慢 • 缓存一切能缓存的内容 • iOS业务bundle比较大(包含4个CPU架构),定时从文件服务器同步 • 打包依赖的离线包下载之后,本地cache 2. 定制包--Bundle的继承 • 发布完成之后,创建新版本,或者创建新的定制包分支,可以从已发 布版本继承其Bundle
  • 22.测试平台—功能与定位 用户 • 开发、测试 目标 • 给业务测试人员提供自动化测试平台 • 自动化运行性能测试 • 提升产品的质量和稳定性 功能 • 代码扫描、单元测试、自动化测试、性能测试等
  • 23.测试平台—静态代码扫描与单元测试 1. 代码行数和重复率:Sonar 2. 静态代码分析:Infer 3. Unit Test: XCTest/JUnit /Robolectric/Mockito
  • 24.测试平台—自动化测试 1. 基于Appium二次开发 2. 支持业务部门自动化测试人员运行脚本与报表导出
  • 25.测试平台—性能测试 1. 对于发布前的版本进行monkey测试 2. 统计内存、CPU、电量、流量、启动时间、crash等信息,并和历史版本数据 对比 3. 整合到集成平台,可配置成打包完成自动运行
  • 26.测试平台—设备租赁管理 1. 基于STF二次开发,管理设备 2. 最大化利用机房已有设备
  • 27.发布平台—功能与定位 用户 • 开发、测试 目标 • 提高产品交付效率 • 确保发布内容及时正确的更新到用户App中 功能 • H5 Hybrid—离线包动态更新 • React Native—离线包动态更新 • Hotfix—动态发布 • Android Bundle—动态发布
  • 28.发布平台—整体架构
  • 29.发布平台—发布流程设计 创建发布单 新增版本 发布单: 确认代码分支和发布App版本 版本:对发布单做一次发布 FAT/UAT/生产发布
  • 30.发布平台—数据监控 下载&安装整体成功率99.5%+
  • 31.发布平台—资源包大小持续优化 全量包发布 Build生成的包直接下发 基于文件的 差分 将变更、新增的文件zip到一起下发,效果和bsdiff一致 静态差分 Build时,计算当前包与先前所有包的差分包 动态差分 下载时,动态计算2个包的差异,生成差分包
  • 32.发布平台—改进的差分算法 1. 先解压 2. 文件夹比对,diff其中的变化文件 3. zip文件夹中的diff文件
  • 33.发布平台—一组实测数据 App中初始包(KB) 下发离线包(KB) bsdiff结果(KB) 优化效果(KB) 87.2 88.3 57.1 14.4 188.2 184.7 140.1 9.41 375.3 369.9 276.4 2.9 1021.5 970.57 611.8 10.08 发布1周之后的版本,12个离线包可以下载,总共Size 148 KB
  • 34.发布平台—依赖管理 1. 数字表示优先级,数字越小,优先级越高 2. 框架类模块优先级为0,业务模块优先级为100 3. 相同优先级,根据发布时间下载 4. 整体作为列表,串行下载
  • 35.发布平台—安全问题 1. 下载列表中返回文件RSA签名 2. 离线包下载完成后,验证文件签名 3. Hotfix文件加密之后下发,本地加密存储,使用时候临时解密 4. bsdiff生成的patch文件,需要返回最新文件hash值,供App端merge完成之 后校验正确性
  • 36.发布平台—灰度与回滚 1. 灰度发布 • 发布完成之后,逐步选择一定比例用户生效 2. 回滚 • React Native&Hybrid重新发布 • Hotfix回滚删除本地的版本 3. 暂停发布 • 对于某些功能/修复没有生效,但是对用户没有负面影响,直接暂停发布
  • 37.运营平台—简介 用户 • 开发、产品经理 目标 • 方便线上App的运营配置 功能 • MobileConfig配置、活动配置、服务器IP流量配置、发布查询等
  • 38.