内容来源:2017年9月2日,俏丽联合集团技能专家蒋志强在“七牛云&俏丽联合集团架构师实践日:CI/CD落地最佳实践”进行《持续集成和发布在俏丽联合集团的实践》演讲分享。IT 大咖说作为独家视频互助方,经主理方和讲者审阅授权发布。
阅读字数:2380 | 4分钟阅读
高朋演讲视频及PPT:http://t.cn/RYVMrcH

发布作为运用上线前的末了一个步骤,一贯以来都是运维做的比较频繁也是风险比较高的操作,发布系统不仅要做到提升发布效率,更主要的是保障发布过程中系统的稳定,减少因发布导致的故障。本次演讲紧张讲述美联的发布&持续集成系统的演进以及在提高发布效率,保障系统稳定上的实践。
发布系统的演进发布系统的演进在一定程度上代表了运维体系乃至是公司技能架构的演进。
技能架构-早期(2011-2013)
最早期的开拓措辞是PHP,最盛行的开源运行环境是LNMP,代码管理是SVN。
最开始的是人肉发布,后来有了PHP主站发布系统。它能代替人肉进行发布和操作,支持文件发布,有了回滚的功能,还有最大略的审批操作。
业务架构-中期(2014-2015)
到了2014年,我们的业务架构有所调度,建立了自己的交易平台。
开拓措辞变成了JAVA,运行环境是TOMCAT,代码管理用的是GIT。
业务系统改成JAVA往后对发布系统也提出了更多的寻衅。JAVA发布和PHP发布有很大差异,于是我们做了JAVA的发布系统。
发布系统也改为StarkPlus,须要支持更多的发布类型、发布模式,以及更多的发布功能。
发布系统的特点是支持类型多,有JAVA、C++、NodeJS、PHP、Golang、Css_js以及二方库。
发布策略也多,有分批发布、分组发布、流式发布、自动发布和自定义发布。
功能多。原来的系统每次只能发布一个特定的分支,现在有一个运用多个分支并行开拓的情形,以是我们须要多分支集成。
我们的运用又支配在多个机房,每个机房的配置可能都是不一样的,构建也不同,以是须要多机房构建。
最开始只有三套环境,后来逐步创造三套环境已经不能知足我们的研发需求,须要多套环境支配。
Docker是目前非常盛行的一个容器,我们现在也有部分运用在Docker上面,要对Docker做一些支持。同时也支持Docker和KBM的稠浊发布。
还有集成测试、安全扫描、性能压测和jar包检测,这些是其它业务团队做的工具,我们把它们集成到我们的发布系统中,来增强这些功能。
实践之路运维的根本-标准化
首先要做好根本软件及配置标准化,OS、JDK、tomcat、nginx等等为运维供应了一套最标准的环境,所有的运用都跑在同样的环境上。
运用本身配置的标准化,运用命名、配置管理,启停脚本、检测脚本、支配目录、日志目录这些有统一的标准。
我们供应了一个运用的模版,如果运用完备符合我们的标准,就不须要改动可以直接接入,但也有些分外的运用可能情形会不一样。
运用配置管理
运用类型配置可以利用我们的标准模版,也可以做一些自定义的功能,紧张是职员角色、运用类型、启停命令和软件包信息。实在它们集成在我们的发布系统里面,后来我们创造这些设置不仅仅是发布系统要用,其它很多运维系统、业务系统都会用到。于是我们把它罗列出来单独成立了一个配置中央。
上图是我们发布系统的一个依赖关系,里面的一圈是它的核心依赖,CMDB管理做事器,配置中央管理运用的配置,OpsAgent在每个机器上支配一个Agent,用来实行一些在做事器上持续的操作。Gitlab做代码管理,流程引擎用于审批内容。
外围一圈都是用于增强我们的功能和一些外部依赖,有监控、安全扫描等等。
发布系统架构非常大略,紧张便是两部分,一个是JAVA前端,用来做页面和流程掌握。下面一个是用Pathon写的一组worker,用于实行一些详细的操作,例如代码的构建、合并、支配。中间通过一个MQ做任务行列步队和解耦,它们之间通过DB来进行通报。
分支管理
上图是我们的分支管理。所有的开拓分支都是来源于master,在开拓分支上开拓完成将近发布的时候,发布系统会从master上拉出一个release,把feature分支一个个往上合,合完往后发布这个release分支。release分支发到线上成功往后再把它合回到master,创建一个基线。
新建&导入变更
创建变更有两种办法,一种是新建变更,便是从master上拉出一个新的分支;另一种是导入变更,已经有了从其余的开拓分支上的一个分支,须要手动把这个分支拉出来进行导入。
集成&发布
上图是我们集成发布的页面。最上层是我们的三套支配环境;发布的根本信息包括了运用名和当前发布的分支名称等;下面是我们发布过程,发布过程会根据运用类型的不同而有所差异;集成区的分支便是当前分支在发布中,待集成区是已经开拓提交了集成但是还没有进行发布。
进入线上
预发必须支配成功,集成区的checklist要全部通过。
代码合并
手动办理在代码合并过程中发生的冲突。Release分支改换策略便是新加入的分支或者修正feature分支代码的时候,Release分支是不会变的,不用再办理第二次冲突。
不同运用类型的构建办法是不一样的,而且构建是基于合并完成的Release分支,像JAVA、C++、GOLANG、NODEJS是放在一个Docker容器中进行构建,构建完成后会有产出。
康健检讨
每个运用都有康健检讨URL:/status
当访问/status时,检讨核心依赖(DB、cache、依赖运用),预热数据。
实行成功返回“SUCCESS”,别的状况均为失落败。
发布操持&审批
日常发布是周一至周四事情韶光,由主管审批;
常规紧急发布在周五、周末,由研发D进行审批;
节假日例如法定节假日、运营商封网等,也是研发D审批;
分外期间比如大匆匆、集团发布会等期间,理论上是不许可任何发布的,如需发布就须要通过CTO审批。
我们的特色
研发流程闭环
深度整合发布系统与项目管理系统(PMO),需求、项目可以创建、关联变更。变更发布后可以关照到PMO的系统去更新需求和项目状态,这样就可以明确每次发布的目的。
多机房、多分组构建
同一个运用在不同的机房有不同的配置,在不同的分组供应的做事也有差异。
线下&预发多套环境
由于需求多、变更多,以是支配变更非常频繁,测试总是抱怨环境不稳定。大项目希望能独占一套项目环境,办理环境的隔离。
Jar包检测&Diff
Jar包冲突检测:Jar包冲突会导致莫名其妙的问题,难以排查。
Snapshot包检测:Snapshot版本更新频率高,不可控。
Jar包版本限定:已经废弃的版本、有bug的版本不能被利用。
Jar包Diff:查看本次发布版本和基线版本的jar包差异。
稳定性
前端扫描:对付css_js的发布做前端代码质量检测;
安全扫描:对java代码做静态安全性剖析;
集成测试:预发环境发布的同时实行单元测试、接口测试;
性能监控&压测:线上beta发布后对beta机器实行性能压测。
我本日的分享就到这里,感激大家!
编者:IT大咖说,转载请标明版权和出处