首页>会议文档 >

郭扬 - 持续集成技术实践

page:
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践
郭扬 - 持续集成技术实践

郭扬 - 持续集成技术实践

所属会议:GIAC 2017全球互联网架构大会会议地点:上海


下载

手机看
活动家APP客户端

扫二维码下载
或点击下载
Android iOS

7170次
浏览次数
GIAC 2017全球互联网架构大会所有文档 毛茂德-阿里智能运维平台如何助力研发应对双11挑战_部分1 毛茂德-阿里智能运维平台如何助力研发应对双11挑战_部分2 jolestar 王渊命-如何利用+Kubernetes+建设+AI+时代的+DevOps+平台 曾勇 - Elastic Stack- Past, Present, & Future 滴滴出行 梁李印 - 滴滴实时计算平台架构与实践 董西成 - PB级Hadoop集群跨机房迁移实战 刘洋(炎寻) - 蘑菇街作业调度系统Jarvis的架构与实现 hai lu - 领英对实时流计算的应用和探索 洪倍-软硬兼施:分布式高速缓存和流式计算架构设计 杜修文 - 预览新世代MySQL 8-0 张文升 - Happy Hacking in Tantan Using PostgreSQL - PostgreSQL in Tantan 姚捷 - 秒级监控时代-GIAC(公开版) 杨保华-区块链到分布式账本 张晓通-壹钱包架构演进之路 赵文乐-互金企业如何运用技术解决发展和合规的挑战 苗广艺 - 人工智能技术如何在教育行业落地 袁进辉 - 深度学习平台技术演进 58速运 沈剑 - 头疼,技术 leader 怎么定量化 KPI 饿了么 史海峰-不忘初心,中级领导力修炼 沪江 余晟-要“蜕变”不要“退变”——成为合格技术领导者 特赞科技 黄勇 - 工程师择业之道 廖雄杰 - APM全栈性能监控实践 陆传胜 - bytecode dance 肖桦 - Java Tuning Guide 杨大鹏 - APM系统构建与应用 360 王浩 - APK行为监控与分析 白山云科技 丛磊 - AI重塑Web安全_部分1 白山云科技 丛磊 - AI重塑Web安全_部分2 刘明浩 - 金融科技分布式安全架构 何勉&洪永潮 - 度量引导的持续交付和敏捷实施 姚延栋 - Greenplum机器学习工具集和案例 李远策 - XLeaning:360深度学习调度平台架构设计 腾讯 黄明 - 进击的巨人:基于Angel的高维度Online Learning 谢孟军 - 微服务和Go语言的应用 杨晓峰 - Java9-In-Practice bilibili 毛剑 - B站微服务链路监控实践 陈皓 - Cloud Native 云化架构_部分1 陈皓 - Cloud Native 云化架构_部分2 吴疆 - Microservice 在 Cloud Foundry 的应用 邢海涛 - 微服务和K8s集成探索实践 jiangjie qin-Auto Management for Apache Kafka and Distributed Stateful System in General 阿里巴巴 马昕曦-Dubbo 的过去、现在以及未来 携程 余昭辉-去哪儿网消息中间件演进 阿里巴巴 姜天意-基于bpmn流程引擎驱动的前端研发平台 百度 彭星-基于 Vue 的 PWA 解决方案——开源 Lavas 项目案例 饿了么 邓钢-前端生产环境部署 ES6 代码 360 董福源 - Android框架虚拟化实战 滴滴出行 戴铭 - Swift 将 Web 代码转成60帧满帧原生应用的方案及实践_部分1 滴滴出行 戴铭 - Swift 将 Web 代码转成60帧满帧原生应用的方案及实践_部分2 极光 王可为 - 极光Android SDK架构演进之路 阿里巴巴 邹迪飞 - 移动应用高可用技术探索 华为 杜玉杰 - 物联网操作系统漫谈 映云科技 李枫 - 基于 EMQ 开发千万级 IoT 平台架构实践 云吧 张虎 - IoT:海量设备的连接和安全 饿了么 吴俊龙&严佳奇 - 饿了么全链路压测的实践与体系建设 京东 张琪 - 质效合一----驱动质量团队提效之路 腾讯 何纯 - 基于真实用户体验的实时监控和优化 宋子豪@Mesosphere_ 容器行业存储标准CSI与Apache Mesos 网易云 赖冬林-Kubernetes 网易云 性能优化实践-Final_部分1 网易云 赖冬林-Kubernetes 网易云 性能优化实践-Final_部分2 俞圆圆 - 电竞数据的容器实践 — serverless的电竞数据计算平台 鸟哥惠新宸-The Next G of PHP

文档介绍

软件的开发和发布过程中, 持续集成 (CI) 已经越来越受到重视和关注,那么持续集成能带来什么好处?如何在项目中应用、以及做好持续集成呢?本话题中将回答这些问题,分享在 fir.im 团队中,如何利用持续集成系统,提升软件开发的效率和质量

演讲实录

持续集成做什么

持续集成的概念出现在 2001 年,它其实是一个 XP 极限编程的工程实践。那么持续的是什么,集成是什么呢,非常简单就是“一直不停地集成代码”。

持续集成是把代码频繁的合并到主干,通过自动构建的方式验证软件的质量,让团队快速的响应质量,快速的修复问题,快速的给客户解决问题,快速地交付更好的软件质量。

我们为什么要做持续集成

开发人员对下面的软件开发场景很熟悉,比如:

场景一:开发了新功能,老功能产生新的 bug;
场景二:修好一个 bug,又产生其他 bug,甚至出现连环 bug;
场景三:出现的 bug 比较多,修改代码要很谨慎,不熟悉的模块一般不敢动,怕引起问题;
持续集成是如何缓解这个问题,Martin Fowler 大师曾经说过:

“Continuous Integration doesn’t get rid of bugs, but it does make them dramatically easier to find and remove.” — Martin Fowler
如上面所说,持续集成不能消除 bug ,但能更容易地发现 bug,更快速地修复,提升产品质量。那么,持续集成能给我们带来哪些价值?
从这张图上可以看到,持续集成形成一个完美的闭环。通过持续的集成进行不断地检查、调整,同时,项目的透明性也得到了最大的体现。

fir.im 如何进行持续集成实践

这是一个常见的持续集成流水线:
在日常的开发过程中,程序员在本地提交代码,持续集成流水线要求先做一次本地集成,在本地进行验证后提交到源代码管理仓库中,之后源代码工具会发出 webhook 触发到持续集成系统中。当构建/测试完成后,会及时通过钉钉或邮件通知团队(测试/研发/boss/产品经理)集成状态,产品经理或项目经理收到通知后会在测试环境做验收测试,这是一个比较完美的反馈环。

假如测试通过验收完毕后,持续集成系统会自动触发部署到类生产环节或测试环境,或由专人手动部署到生产环境。

为什么要做本地集成

首先,代码在远程进行管理,每个人都会提交代码,远程的代码仓库会产生变化,所以在本地集成的时候要求进行代码合并,以免出现分支冲突和代码冲突。其次,不要依赖于持续集成系统给你结果,可能需要 30 分钟的时间,不要让开发人员等待,一定要先做本地集成。

如何做版本提交

再说一个提交的问题,我们尽量保证每一次提交都是一个完整的提交,也就是原子提交。

当代码变动你想创建提交时,这个提交应该尽可能的小量,并且包含一个不可分割的特性(feature)、修复(fix)或优化(improved)。
拿每个产品开发都会遇到的 login 功能开发举例,当填完的用户名和密码传到数据库,做完验证后给用户返回一个结果。那什么是一个原子提交?比如,提交验证一个用户名,这是一个完整的 feature ;验证密码是否符合格式(6位/8位),这也是一个完整的 feature ;当我验证完用户名和密码后再传到数据库之后,查询正确与否,这也是一个完整的 feature ;保证每次提交是一个完整的 feature 或修复了一个 bug,不要代码写成半截。

持续集成系统

这里讲的是狭义的持续集成系统,通常的 CI 系统收到提交之后会触发构建,构建会有信息返回比如 commit id 、commit 信息、代码变更等,收到代码提交后会触发自动构建,接着安装依赖进行编译,并触发质量保证流程,也就是说自动化测试集。
自动化测试集包括代码静态检查-单元测试-集成测试-验收测试-性能测试,也会有压力测试、回归测试、monkey test等等一系列的测试。
接下来,我们具体讲一下 fir.im 团队如何进行持续集成实践的。

fir.im 的敏捷环境

fir.im 是一个内测分发平台,我们也做了一个持续集成 CI 产品-flow.ci。先来看一下我们正在使用的敏捷环境:
Trello 看板;
三个环境(类生产环境,测试环境,生产环境);
CI 工具(Jenkins/flow.ci)
说一下 Git 分支管理

我们在应用 3 个分支 —— master/develop/feature 分支,对 feature 命名会有一些要求,持续集成系统一定会反馈到 trello 的 kanban 里,所以对于 feature 分支我们也有这样的命名 feature/fci-{card number} 以方便区分。
多分支如何做频繁地持续集成?

master 分支,即线上分支。线上通常会有一些 hotfix, 任何产品都不可能避免线上的 bug ,这些 bug 需要在 master 分支进行修复,修复完成后持续集成系统会告知已上线,收到团队反馈,这些代码会要求更新在 develop 分支上,之后所有团队也会收到相关通知,那么 feature 分支会有变化吗?答案是肯定的,因为频繁的集成可以防止代码偏离。这就是我们多分支构建的策略。
还有一个策略——不同的分支不同的构建,持续集成系统跑完整个流程会很长,所以在 feature 分支频繁度会比在本地构建要高一些,但是也没有那么高。为了保证持续集成系统能快速地收到反馈,需要在 feature 分支上做一些定制的 workflow ,所以我们做了代码静态分析和单元测试。

当 feature 分支的 card 做完之后(scrum 中 done 的含义是指测试验收完毕),集成到 develop 分支,develop 分支会自动部署到测试环境,会跑一个整个自动化测试集,为什么是这样的构建策略呢?

我们会做代码 review ,当 feature 分支提 pr 到 develop 分支上,这样 develop 分支的构建条件是:当收到 pr 之后,开始跑持续集成。假如部署完成整个测试跑过了产品经理验收之后,没毛病了,终于可以发布了到 master 分支。
整个团队的构建频率可以看下这张图:
本地集成的频率非常高,远程构建对应的是 feature 分支,会相对低一下。QA 环境对应的是 develop 分支的构建粒度。这样的构建每天都会产生,所以做完之后不要积压,一定要保持上线节奏。
kanban + scrum 结合的方式构成我们每日构建,这是一个整体的构建策略和上线频率。

fir.im 的持续集成系统演变过程

罗马不是一天建成的,持续集成不是一开始就是完美的,每个开发者心中都有一个比较理想的自动化工作流——持续部署,大概会经历这几个演变阶段:

最初阶段:提交代码-自动部署;
一般进阶:提交代码-代码静态分析-自动部署,最简单先再加入代码静态分析;
高级进阶:提交代码-代码静态分析-自动化测试集-自动部署;
这是我们在用的自动化测试集,下面分别说下静态检查分析、单元测试、验收测试、性能测试的具体用途。

Step 1. 静态代码分析

每个公司都会有自己的代码规范,代码静态分析工具能够保证代码质量,现成的工具有 java 的 FindBugs,ruby 的 rubocop 等。利用代码检查工具可以帮助团队发现可重构的地方,输出产出 – HTML 报告,也会发现潜在 bug;有的代码检查工具还会检查出一些安全漏洞。

这三点是代码静态分析最重要的作用。这里也分享一个 GitHub 地址,列出一些主流语言的代码分析工具,可以参考一下。

Step 2. “单元测试”

这里的 “单元测试”也加上了集成测试,毕竟创业公司要求资源最大化。程序员一定要写单元测试,要克服开发的惯性思维,不要甩锅。下面有一些注意的点和大家分享:

测试异常——不仅仅测试正确情况,也要主动测试异常;
减少耦合——保证独立的可测试性;
功能分离——单元测试流太长,超过 20 分钟的话要详细想一下如何将功能单独拆开,效率更高;
测试=需求——从测试代码看到每个 class 是干什么的,同时出现 bug 时,第一时间是看测试,想想如何从测试中复现;
Step 3. 验收测试

验收测试是端对端的测试,从收到用户名密码到返回结果,是不是我们所期望的一个值,这是验收 Acceptance Test,其实是验收了整个功能。代码静态检查和单元测试,保证了我们如何怎么去写代码,验收测试保证了写正确代码,符合开发需求。

flow.ci 做验收测试比较多,用的是比较流行的框架 Cucumber + Selenium WebDriver,目前支持 3 种数据库,5 种 git 仓库,7 种 开发语言跑在 docker 容器云上,支持 iOS 构建跑在 mac 机器上,要保证这些排列组合正常运行,这是 flow.ci 做验收测试最核心的价值。
其实,持续集成是一个工作流,当 push 代码的时候才会 run 起来,但是 flow.ci 本身系统也有外部依赖的特殊性,会依赖一些第三方的 sevice(比如 GitHub/GitLab 等),验收测试应该一直保持不断地运行,也可以叫持续测试吧。因为我们永远不能保证第三方的 api 会不会改变:)

Step 4. 性能测试

我们的性能测试做的比较简单,主要测试 api.因为 fir.im 做 app 的内测分发,我们需要性能测试保证 app 上传下载的正常稳定。性能测试是单用户的,压力测试是多用户的,这是两者之间的区别。

性能测试会有一些不确定性,有很多系统会产生缓存。flow.ci 的性能测试跑在 docker 上,是一个干净独立的环境,需要让系统预热运行一下。Locust/JMeter/LoadRunner是目前比较流行的性能测试工具。
flow.ci 目前用的是 locust,可以参考一下。

持续集成的可视化、数据分析

我们认为一个好的持续集成系统也要做到项目进度的透明化,最传统的方式是发送相关的邮件,但实质上有几个人去看呢?为此我们采购了一个大的屏幕来解决这个问题,用来时刻提醒团队的某个构建结果。当然也可以用闪烁灯或音频的方式。
说到数据统计分析,整个 ci 流程跑下来产生的很多数据也非常有挖掘的价值。比如,对于代码静态分析有多少 Offence、Risk、Bug,对于单元测试有失败率、测试覆盖率;对于验收测试或性能测试有多少的失败率,这些数据都有可能成为衡量一个程序员的标准。
结语

CI 就像盖楼房的脚手架一样,没有脚手架就没办法盖出一个足够高的楼,没有 CI 就无法交付质量足够好的软件!

欢迎分享你的观点。

×

打开微信扫一扫,分享到朋友圈