MCI:移动持续集成在大众点评的实践美团技术团队

美团是全球最大的互联网+生活服务平台,为3.2亿活跃用户和500多万的优质商户提供一个连接线上与线下的电子商务服务。秉承“帮大家吃得更好,生活更好”的使命,我们的业务覆盖了超过200个品类和2800个城区县网络,在餐饮、外卖、酒店旅游、丽人、家庭、休闲娱乐等领域具有领先的市场地位。

随着各业务的蓬勃发展,大众点评移动研发团队从当初各自为战的“小作坊”已经发展成为可以协同作战的、拥有千人规模的“正规军”。我们的移动项目架构为了适应业务发展也发生了天翻地覆的变化,这对移动持续集成提出更高的要求,而整个移动研发团队也迎来了新的机遇和挑战。

当前移动客户端的组件库超过600个,多个移动项目的代码量达到百万行级别,每天有几百次的发版集成需求。保证近千名移动研发人员顺利进行开发和集成,这是我们部门的重要使命。但是,前进的道路从来都不是平坦的,在通向目标的大道上,我们还面临着很多问题与挑战,主要包括以下几个方面:

上图仅仅展示了我们移动项目中一小部分组件间的依赖关系,可以想象一下,这600多个组件之间的依赖关系,就如同一个城市复杂的道路交通网让人眼花缭乱。这种组件间错综复杂的依赖关系也必然会导致两个严重的问题,第一,如果某个业务需要修改代码,极有可能会影响到其它业务,牵一发而动全身,进而会让很多研发同学工作时战战兢兢,做项目更加畏首畏尾;第二,管理这些组件间繁琐的依赖关系也是一件令人头疼的事情,现在平均每个组件的依赖数有70多个,最多的甚至达到了270多个,如果依靠人工来维护这些依赖关系,难如登天。

移动研发要完成一个完整功能需求,除了代码开发以外,需要经历组件发版、组件集成、打包、测试。如果测试发现Bug需要进行修复,然后再次经历组件发版、组件集成、打包、测试,直到测试通过交付产品。研发同学在整个过程中需要手动提交MR、手动升级组件、手动触发打包以及人工实时监控流程的状态,如此研发会被频繁打断来跟踪处理过程的衔接,势必严重影响开发专注度,降低研发生产力。

项目依赖复杂、研发流程琐碎、构建速度慢、App质量保证是每个移动项目在团队、业务发展壮大过程中都会遇到的问题,本文将根据大众点评移动端多年来积累的实践经验,一步步阐述我们是如何在实战中解决这些问题的。

MCI(Mobilecontinuousintegration)是大众点评移动端团队多年来实践总结出来的一套行之有效的架构体系。它能实际解决移动项目中依赖复杂、研发流程琐碎、构建速度慢的问题,同时接入MCI架构体系的移动项目能真正有效实现App质量的提升。

MCI完整架构体系如下图所示:

MCI架构体系包含移动CI平台、流程自动化建设、静态检查体系、日志监控&分析、信息管理配置,另外MCI还采取二进制集成等措施来提升MCI的构建速度。

我们通过构建移动CI平台,来保证移动研发在项目依赖极其复杂的情况下,也能互不影响完成业务研发集成;其次我们设计了合理的CI策略,来帮助移动研发人员走出令人望而生畏的依赖关系管理的“泥潭”。

在构建移动CI平台的基础上,我们对MCI流程进行自动化建设来解决研发流程琐碎问题,从而解放移动研发生产力。

在CI平台保证集成正确性的情况下,我们通过依赖扁平化以及优化集成方式等措施来提升MCI的构建速度,进一步提升研发效率。

我们建立一套完整自研的静态检查体系,针对移动项目的特点,MCI上线全方位的静态检查来促进App质量的提升。

我们对MCI体系的完整流程进行日志落地,方便问题的追溯与排查,同时通过数据分析来进一步优化MCI的流程以及监控移动App项目的健康状况。

最后,为了方便管理接入MCI的移动项目,我们建设了统一的项目信息管理配置平台。

接下来,我们将依次详细探讨MCI架构体系是如何一步步建立,进而解决我们面临的各种问题。

我们对目前业内流行的CI系统,如:TravisCI、CircleCI、Jenkins、GitlabCI调研后,针对移动项目的特点,综合考虑代码安全性、可扩展性及页面可操作性,最终选择基于GitlabCI搭建移动持续集成平台,当然我们也使用Jenkins做一些辅助性的工作。MCI体系的CI核心架构如下图所示:

名词解释:

一次完整的组件集成流程包含两个阶段:组件库发版和向目标App工程集成。如下图所示:

第一阶段,在日常功能开发完毕后,研发提PR到指定分支,在对代码进行Review、组件库编译及静态检查无误后,自动发版进入组件池中。所有进入组件池中的组件均可以在不同App项目中复用。

第二阶段,研发根据需要将组件合入指定App工程。组件A本身的正确性已经在第一阶段的组件库发版中验证,第二阶段是检查组件A的改变是否对目标App中原有依赖它的其它组件造成影响。所以首先需要分析组件A被目标App中哪些组件所依赖,目标App工程按照各自的准入标准,对合入的组件库进行编译和静态分析,待检查无误后,最终合入发布分支。

通过组件发版和集成两阶段的CI流程,组件将被正确集成到目标项目中。而对于存在问题的组件则会阻挡在项目之外,因此不会影响其它业务的正常开发和发版集成,各业务研发流程独立可控。

组件的发版和集成能否通过CI检查,取决于组件当前的依赖以及组件本身是否与目标项目兼容。移动研发需要对组件当前依赖有足够的了解才能顺利完成发版集成,为了减小组件依赖管理的复杂度,我们设计了合理的发版集成策略来帮助移动研发走出繁琐的版本依赖管理的困境。

每个组件都有自己的依赖项,不同组件可能会依赖同一个组件,组件向目标项目集成过程中会面临如下一些问题:

频繁的版本集成冲突会导致业务协同开发集成效率低下,App测试包的不稳定性会给研发追踪问题带来极大的困扰。问题的根源在于目标项目使用每个组件的依赖项来进行集成。因此我们通过在集成项目中显示指定组件版本号以及禁止动态依赖的方式,保证了App测试包的稳定性和可靠性,同时也解决了组件版本集成冲突问题。

组件向组件池发版也一样会涉及依赖项的管理,简单粗暴的方法是指定所有依赖项的版本号,这样做的好处是直观明了,但研发需要对不同版本依赖项的功能有足够的了解。正如组件集成策略中所述,集成项目中每个组件的版本都是显示指定并且唯一确定的,组件中指定依赖项的版本号在集成项目中并不起作用。所以我们在组件发版时采用自动依赖组件池中最新版本的方式。这样设计的好处在于:

当基础组件库的接口和设计发生较大变化时,可以强有力的推动业务层组件做相应适配,保证了在高度解耦的项目架构下保持高度的敏捷性。但这种能力不能滥用,需要根据业务迭代周期合理安排,并做好提前通知动员工作。

研发流程琐碎的主要原因是研发需要人工参与持续集成中每一步过程,一旦我们把移动研发从持续集成过程中解放出来,自然就能提高研发生产力。我们通过项目集成发布流程自动化以及优化测试包分发来优化MCI流程。

流程托管工具实现方案如下:

无论iOS还是Android,在发布App包到市场前都需要做一系列处理,例如iOS需要导出ipa包进行备份,保存符号表来解析线上Crash,以及上传ipa包到iTC(iTunesConnect);而Android除了包备份,保存Mapping文件解析线上Crash外,还要发布App包到不同的渠道,整个打包发布流程更加复杂繁琐。

在没有MCI流程托管以前,每到App发布日,研发同学就如临大敌守在打包机器前,披荆斩棘,过五关斩六将,直到所有App包被“运送”到指定地点,搞得十分疲惫。如同项目集成流程托管一样,我们把整个打包发布流程做了全流程托管,无人值守的自动打包发布方式解放了研发同学,研发同学再也不用每次都披星戴月,早出晚归,跪键盘了(捂脸)。

对于QA和研发而言,上面的场景是否似曾相识。Bug是QA与研发之间沟通的桥梁,但由于缺乏统一的包管理和分发,这种模糊的沟通导致难以快速定位和追溯发生问题的包。为了减少QA和研发之间的无效沟通以及优化包分发流程,我们亟需一个平台来统一管理分发公司内部的App包,于是MCIApp应运而生。

MCIApp提供如下功能:

未来MCIApp还会支持查询项目集成状态以及App发布提醒、问题反馈,整合移动研发全流程。

移动项目在构建过程中最为耗时的两个步骤分别为组件依赖计算和工程编译。

组件依赖计算

工程编译

依赖扁平化的核心思想是事先把依赖项以及依赖版本号进行显示指定,这样通过固定依赖项以及依赖版本就彻底去掉了组件依赖计算的耗时,极大的提高了项目构建速度。与此同时,依赖扁平化还额外带来了下面的好处:

实际上组件代码还可以通过二进制的方式集成到目标工程:

相比源码方式集成,组件的二进制包都是预先编译好的,在集成过程中只需要进行链接无需编译,因此二进制集成的方式可以大幅提升项目编译速度。

为了进一步提高二进制集成效率,我们还做了几件小事:

(1)多线程下载

(2)二进制包缓存

研发在MCI上触发不同的集成任务,这些集成任务间除了升级的组件,其它使用的组件二进制包大部分是相同的,因此我们在CI服务器上对组件二进制包进行缓存以便不同任务间进行共享,进一步提升项目构建速度。

除了完成日常需求开发,提高代码质量是每个研发的必修课。如果每一位移动研发在平时开发中能严格遵守移动编程规范与最佳实践,那很多线上问题完全可以提前避免。事实上仅仅依靠研发自觉性,难以长期有效的执行,我们需要把这些移动编程规范和最佳实践切实落地成为静态检查强制执行,才能有效的将问题扼杀在摇篮之中。

静态检查最简单的方式是文本匹配,这种方式检查逻辑简单,但存在局限性。比如编写的静态检查代码维护困难,再者文本匹配能力有限对一些复杂逻辑的处理无能为力。现有针对Objective-C和Java的静态分析工具也有不少,常见的有:OCLint、FindBugs、CheckStyle等等,但这些工具定制门槛较高。为了降低静态检查接入成本,我们自主研发了一个适应MCI需求的静态分析框架--Hades。

Hades的特点:

Hades的核心思想是对源码生成的AST(AbstractSyntaxTree)进行结构化数据的语义表达,在此基础上我们就可以建立一系列静态分析工具和服务。作为一个静态分析框架,Hades并不局限于Lint工具的制作,我们也希望通过这种结构化的语义表达来对代码有更深层次的理解。因此,我们可以借助文档型数据库(如:CouchDB、MongoDB等)建立项目代码的语义模型数据库,这样我们能够通过JS的Map-Reduce建立视图从而快速检索我们需要查找的内容。关于Hades的技术实现原理我们将在后续的技术Blog中进行详细阐述,敬请期待。

目前MCI已经上线了覆盖代码基本规范、非空特性、多线程最佳实践、资源合法性、启动流程管控、动态行为管控等20多项静态检查,这些静态检查切实有效地促进了App代码质量的提高。

MCI作为大众点评移动端持续集成的重要平台,稳定高效是要达成的第一目标,日志监控是推动MCI走向稳定高效的重要手段。我们对MCI全流程的日志进行落地,方便问题追溯与排查,以下是部分线上监控项。

我们会对异常流程进行监控并且通知流程发起者,同时我们会对失败次数较多的Job分析原因。一部分CI环境或者网络问题MCI可以自动解决,而其它由于代码错误引起的异常MCI会引导移动研发进行问题的排查与解决。

除此之外,我们还对MCI集成成功率、二进制覆盖率等方面做了监控,做到对MCI全流程了然于胸,让MCI稳定高效的运行。

目前MCI平台已经接入公司多个移动项目,为了接入MCI的项目进行统一方便的信息管理,我们建设了MCI信息管理平台——摩卡(Mocha)。Mocha平台的功能包含项目信息管理、配置静态检查项以及组件发版集成查询。

Mocha平台负责注册接入MCI项目的基本信息,包含项目地址、项目负责人等,同时对各个项目的成员进行权限管理。

MCI支持不同项目自定义不同的静态检查项,在Mocha平台上可以完成项目所需静态检查项的定制,同时支持静态检查白名单的配置审核。

Mocha平台支持组件历史发版集成的记录查询,方便问题的排查与追溯。

作为移动集成项目的可视化配置系统,Mocha平台是MCI的一个重要补充。它使得移动项目接入MCI变得简单快捷,未来Mocha平台还会加入更多的配置项。

本文从大众点评移动项目业务复杂度出发,详细介绍了构建稳定高效的移动持续集成系统的思路与最佳实践方案,解决项目依赖复杂所带来的问题,通过依赖扁平化以及二进制集成提升构建速度。在此基础上,通过自研的静态检查基础设施Hades降低静态检查准入的门槛,帮助提升App质量;最后MCI提供的全流程托管能力能显著提高移动研发生产力。

智聪,大众点评iOS技术专家,专注于移动工具链开发,对移动持续集成、静态分析平台建设有深刻理解和丰富的实践经验。

邢轶,大众点评Android技术专家,专注于移动持续集成、静态分析、静态化等App基础设施建设。

大众点评移动研发中心,Base上海,为美团提供移动端底层基础设施服务,包含网络通信、移动监控、推送触达、动态化引擎、移动研发工具等。同时团队还承载流量分发、UGC、内容生态、个人中心等业务研发工作,长年虚位以待专注于移动端研发的各路英雄豪杰。欢迎投递简历:dawei.xing#dianping.com。

THE END
1.大众点评下载2024安卓最新版手机app官方版免费安装下载普通下载 安全下载 需下载豌豆荚APP 简介 评论(425) 历史版本 小编点评 出门不知道去哪吃?这里有真实用户亲测美食,还有周边休闲娱乐好玩的地方推荐。 应用介绍 大众点评是一个聚焦本地生活吃喝玩乐的消费方式分享平台,帮助大家探索和发现城市内外的精彩好去处,丰富休闲好时光。这里不仅有丰富的新热商户/景点等https://m.wandoujia.com/mip/apps/44751
2.大众点评大众点评手机版免费下载大众点评网手机客户端7.8.2- 新增扫码付款,完成支付只需扫一扫- 随时打开大众点评app,在首页为你精确推荐所在位置的优惠- 查看一个店附近的商户和优惠更方便大众点评网手机客户端7.8.11.手机买单优惠多多:闪惠折扣,现金券,折后再减2.体验优化,修复多处Bug大众点评网手机客户端7.8.0-全新商户页,手机买单更便捷,https://sj.zol.com.cn/dianping/
3.微博随时随地发现新鲜事!微博带你欣赏世界上每一个精彩瞬间,了解每一个幕后故事。分享你想表达的,让全世界都能听到你的心声!https://www.weibo.com/u/1738738447?refer_flag=1005050003_
4.微博微博认证:大众点评官方微博精选 微博 视频 相册 置顶 大众点评 11-15 19:02 来自 微博网页版 天渐凉,贴秋膘,秋补正当时要滋养 要润燥 要调理 要平衡8家养生餐厅安利,秋季食补马上安排上~带话题#组个秋冬暖锅局#,转发此条微博分享你的秋冬美食,12月15日点评君将随机抽取两位宝子送出50元美团卡~来点评app搜https://m.weibo.cn/u/1738738447
5.大众点评app大众点评网手机版大众点评电脑版大众点评下载专题为大家整理出了大众点评的各个版本,包括:大众点评安卓版、大众点评苹果版、大众点评电脑版、大众点评IPAD版、大众点评商家版等,用户可以根据自己的需求进行下载!如果你是商家,请选择商家版;用户的话,直接下载大众点评APP即可! 官方介绍 大众点评是中国领先的本地生活信息及交易平台,不仅为用户提供商户http://www.downcc.com/k/dzdp/
6.大众点评app官方版下载推荐理由:一款大众生活服务平台 手机扫描下载 大众点评app官方版是一款生活服务类的软件。在国内一提起消费服务平台,朋友们肯定会第一时间想起大众,作为国内的知名平台怎么能没有自己的APP,今天带来的这款软件就是官方打造的手机客户端。当我们用户需要寻找附近的好店时,只需打开这款软件,超多好店尽入法眼,更有点评https://www.91rjz.com/pcsoft/188072.html
7.大众点评网推荐 吃喝玩乐优惠信息,提供美食餐厅、酒店旅游、电影票、家居装修、美容美发、运动健身等各类生活服务,通过海量真实消费评论的聚合,帮您选到满意商家。https://www.dianping.com/
8.迅雷赋能共识,共建信任 面向用户 面向企业 面向未来 迅雷客户端 20年技术沉淀,专注更好的下载体验 立即下载 Android 版 iOS 版 Windows 版 Mac 版 NAS 版 TV 版 迅雷会员 尊享会员特权,助力下载提速 立即前往 迅雷影音 支持海量格式,多种画面滤镜 立即前往 https://www.xunlei.com/
9.大众点评app下载安装立即下载详情 相关 评论 大众点评app是一款集商家信息、消费点评、优惠信息以及用户好评为一体的生活信息交互及交易软件,大众点评是我国最早建立的第三方消费点评网站。在这个注重吃喝玩乐的时代,哪里有好吃的,哪里有好玩的成了我们较为关注的话题,大众点评可以根据食客的评价以及这方面资讯信息,大致的了解到这些商家店铺https://www.32r.com/app/5414.html
10.大众点评app下载大众点评11.30.6最新版下载上传App 应用权限 隐私政策 7.0 用户评分 游戏简介 大众点评是一款生活服务类app,在这里你可以通过定位系统来查找周围的店铺,衣食住行各个方面你都能在这里寻找到优质的店铺和产品,通过查看他人的评价,货比三家做出自己的选择吧。喜欢的小伙伴快来下载吧。 https://m.ali213.net/android/55595.html
11.大众点评app下载大众点评app官方版下载最新版本大众点评app(com dianping v1)是一款专为广大居民用户们打造的优惠团购平台,在这款软件中智能化搜索附近周边的消费场所,在这里汇集了各种餐饮、美食、酒店、娱乐等优惠活动信息,一键轻松下单团购价。在大众点评app官方最新版本中轻松探索各个城市的生活服务领域,有兴趣http://www.mz6.net/soft/237121.html
12.大众点评app官方版下载大众点评手机版v11.24.13安卓版下载地址 软件截图 相关软件 大众点评app官方版是大家所知的生活类软件,在其中有着诸多热门景点和饭店以及娱乐休闲地址,你不但可以在这里找到感兴趣的娱乐项目,而且还能够在评论区查看其它用户的体验发言,从而来确定该不该去,而且还能够为你推荐当下热门的吃喝玩乐地点,像ktv、酒馆、网咖、健身房等,并且在这款软件中https://m.192luyou.com/app/34505.html
13.大众点评app旧版本大众点评app旧版本安卓版大众点评是一款非常好用的手机APP助手,手机上大众点评,吃喝玩乐应有尽有,这里有海量的生活服务信息,服务遍及全球几百个国家和地区,上大众点评,你想怎么玩就怎么玩! 版本:7.9.0平台:安卓/苹果类型:生活助手语言:简体中文大小:15.49M时间:2015-09-17 生活大众点评app下载大众点评app大众点评 https://www.zuiben.com/a_soft/19594.html
14.大众点评网app下载手机版安装大众点评网app下载手机版是一款最专业的推荐吃喝玩乐的平台软件,平台里面汇集了全国各大城市的商家门店信息和消费者们到店体验的评价,以及众多非常优惠的特惠信息,平常在跟好友聚会前,就可以在上面根据自己的喜好来查找相对应的商家,各地的用户朋友都能在上面根据海量的用户评价来找到自己满意的商家。 大众点评网app下载https://www.bt201.com/app/705.html
15.大众点评官方下载大众点评app最新版本免费下载大众点评是一个聚焦本地生活吃喝玩乐的消费方式分享平台,帮助大家探索和发现城市内外的精彩好去处,丰富休闲好时光。 这里不仅有丰富的新热商户/景点等目的地信息,还有用户实地打卡的照片和评价,为你在选择美食餐厅、酒店民宿、景点门票等相关信息时提供帮助。 【美食推荐】新开热店、网红餐厅、老字号、本地人爱去的街边https://android.myapp.com/myapp/detail.htm?apkName=com.dianping.v1&apkCode=695
16.大众点评app下载安装到手机大众点评网手机客户端大众点评官方app不仅仅只是找到好吃好玩的那么简单,平台中的店铺都有相应的团购可以选择,而且使用大众点评专属优惠券还有各种意想不到的优惠。大众点评可以说是目前最靠谱的团购app之一,不仅店铺涵盖多,而且大部分的评论都是真实的,用户在选择的时候相应的评论是可以做参考的。大众点评手机版现在新用户可以直接领取10元红http://www.downyi.com/key/dazhongdianping/
17.大众点评Dianpingapp下载【大众点评APP介绍】 大众点评app(易速软件园提供下载)是一款可以寻找到各种吃喝玩乐的应用软件。在这里,首先可以寻找到各种美食,搜索附近有什么餐厅,都可以一一找到,能够有最真实用户点评信息以及可以看见商家的环境如何,其次,如果想出门旅游,这里有全面的旅游攻略可以查询,最后可以在手机上方便的预定酒店,飞机票和电影http://www.yisusoft.com/down/12366.htm