基于微服务的DevOps落地指南 交付效率提升40%

基于微服务的DevOps落地指南

交付效率提升40%

2015-2016年,珍爱线下门店已新增覆盖城市9个,与此同时,CRM系统大小故障却发生了数十起... ...

珍爱网是以“网络征选+人工红娘”模式提供婚配服务的婚恋相亲平台。CRM系统承载了整个珍爱网会员的全生命周期管理,涵盖资源挖掘、用户触达渠道以及服务跟进体系。

CRM系统对珍爱5400名红娘来说,是承载她们全部工作的核心平台;对公司业务来说,承载着引流、转化、支付、客户服务等全部环节。最最重要的是,公司收入的80%都是依托CRM系统完成的。

然而在珍爱网成立10年之际,运行10年之久的CRM系统已不足以支撑业务的快速发展了。

 

我们为什么要做DevOps

经过分析,我们发现CRM系统目前面临着以下问题:

技术上——

  • 传统的系统架构,不再适应敏捷开发,模块耦合,数据库存在单点故障;

  • 容错性差,冗余代码多,修复bug和实现新功能变得困难和耗时。

产品上——

  • 产品功能不够场景化、电子化、智能化;

  • 无法快速响应业务变化,迭代周期长。

我们可是背负着“成就天下姻缘”使命呢,系统重构,研发流程改进,迫在眉睫。

2017年1月25日,捷豹项目组成立,只为给业务打造一个“简单·好用”专注于婚恋相亲的综合服务平台。

捷豹CRM系统(PC端、Pad端、小程序端)的版本发布周期为一周一个常规迭代,紧急版本按天发布。

捷豹CRM系统整体设计思路如下图,我们希望能够实现系统的服务解耦、动静分离以及高可用

然而大家都知道,微服务架构中每个服务都具有业务属性,并且能独立地被开发、测试、构建、部署。换句话说,每个服务都是一个可交付的“系统”。

那么问题来了,如何让需求以小批量形式在团队的各个角色间顺畅流动,并以较短的周期完成小粒度的持续发布呢?

答案当然是 TAPD DevOps流水线,简直是神助攻!

 

 

 

整体效果

TAPD DevOps流水线支持集成主流的研发工具,覆盖产品研发全生命周期,提供可视化交付流水线,可以将DevOps各个环节进行统一展示和管理,真正实现一站式持续交付。

 

 

自2017年10月起,我们就应用TAPD的DevOps流水线,开展了一系列持续交付和持续改进实践。

CI和CD实现过程使用Gitlab、Jenkins、Sonar、Jacoco、Nexus、EasyOps、Docker、Kubernetes等工具,分别在代码管理、集成编译、包管理、自动化测试、发布阶段集成到TAPD流水线统一展示和管理。

 

在TAPD流水线实践DevOps的过程中,我们也打通了各环节的研发数据。

通过TAPD迭代详情中的Dashboard,可以统计并展示当前迭代的研发效能数据,包括:需求完成情况、缺陷新增和解决情况、代码提交与关联趋势、每日构建统计、构建产物版本情况、自动化测试、部署发布等全过程数据,研发效能度量更直观、更深入,让改进方向更明确,也让效能提升更明显。

 

基于以上持续交付和持续改进实践,我们的研发效能也有了质的提升。

我们从业务响应周期、持续交付能力、开发质量、交付质量四个方面来衡量研发效能,下图展示了各个维度的改进效果。

 

我们的DevOps是如何落地的

那么我们具体怎样利用TAPD DevOps流水线,一步步实现持续交付,最终提升研发效能的呢?

下面我将分享我们在各个环节的做法。

1 代码管理环节

1.1 建立TAPD分支管理规范

改造前:

开发编码过程中最崩溃的应该是:“我刚写好的代码又被谁覆盖了!”

并行开发过程中,最痛苦的莫过于开发的需求太多, 记不清哪个需求在哪个分支上,或者多个需求在一个分支上开发,撤代码撤到望眼欲穿……

改造后:

通过走访调研,最终我们确定遵循“一个需求一个开发分支”的原则,方便管理且可追溯,并行开发,互不干扰。

 

 

在Jenkins上创建Job,通过TAPD和Git的API,将TAPD需求ID与Git分支关联,创建的分支名为“工程名-创建日期-TAPD需求ID”,开发小哥哥去Gitlab上拉创建好的需求分支便可努力搬砖了。

待需求上线后转关闭状态的21天,自动将该分支删除,整个分支管理过程实现自动化

效果:

截至目前, 通过该Job创建分支次数达到1564次,创建成功的分支数远大于1564*3 个,而合并冲突数小于5次

1.2 TAPD源码关联

改造前:

 在测试过程中, 最繁杂的应该是代码合并环节了,一个需求涉及到多个工程的代码变更,每天各个开发针对不同的需求,提测到测试同学进行代码合并。

开发/测试的比例为4:1,需求涉及的前后端工程40余个,面对一个需求到底要合并哪些工程,测试同学每天要在风中凌乱好几回……

改造后:

与研发效能度量深度结合,良好编码习惯,从源码关联开始。

通过源码关联功能,我们实现了以下闭环

所有研发任务都必须录入TAPD,并且只能通过需求ID来创建Git分支 → Commit信息必须关联源码提交 → 度量数据只获取关联源码的代码行 → 根据这部分数据进行研发效率和质量的度量。


测试同学只用关注该需求的Gitlab提交记录即可知道本次变更涉及的工程有哪些,不用和开发一个个确认,减少沟通成本。

由于提交比较频繁,我们写了一个爬虫脚本,将抓到的版本库去重,得到该需求要合并的工程。然后我们将待合并工程,生成TAPD的合并任务分发给指定同学,将整个过程自动化管理

 

效果:

综上,通过“源码管理”和“TAPD分支规范”,有效规避了代码管理过程中,冲突多、管理乱、不可追溯的问题,同时也实现按需求粒度、灵活发布的效果。

自2018年10月以来,通过这套代码合并任务自动分发方案,我们成功迭代上线了18个常规版本10个紧急版本,整个过程简单清晰,单任务合并整合环节,从原来的40分钟,减少到5分钟

 

2 代码质量分析

 

改造前:

Sonar其实很早就开始在项目过程中使用了,但是效果并不太好。

无论对于开发还是测试同学,都需要多维护一个系统,并且改动频繁,当某一个服务经手的开发过多时,Sonar扫描出问题后无法快速分配责任开发。

另外Sonar配置到集成环境构建时触发,让bug从发现环节开始滞后,修复过程也对版本稳定性带来风险

改造后:

在2018年底,我们发现TAPD流水线集成Sonar,还可以一键创建缺陷到TAPD。

于是,我们将Sonar扫描前置到开发每一次提交到Git仓库便触发构建,让Sonar缺陷在开发自测环节变暴露出来,同时,每一次构建能清晰的展示本次代码变更人,开发可以安心地收下这一页的bug啦。

 当然,有的开发小哥哥可能没有及时修复,没关系, 测试小姐姐将未及时关闭的Sonar缺陷通过“批量导入缺陷功能”每天自动化(通过TAPD的API实现)创建到你的缺陷清单里,开发小哥哥再也不会错过那些被遗忘的bug啦。

 噢,贴心的TAPD还在缺陷详情里把bug的文件名和代码行都给展示了呢,开发小哥哥和测试小姐姐终于可以不跨系统维护Sonar了。

 

 

 

需求分支经过静态扫描和自测通过后就要提交到集成环境啦。

在这个环节,除了常规编译步骤,我们还增加了开发的单元测试Jacoco覆盖率检测。在集成环境我们也增加了Sonar进行最后一次扫描确认。

单元测试框架为JUnit,与TAPD进行关联,构建后在“自动化测试”板块可以看到本次构建的单元测试用例总数和通过率(单元测试通过率是我们对研发质量度量的一个很重要的指标),单元测试不通过的case和Sonar扫描的bug处理方式一致,由API脚本统一录入TAPD缺陷进行跟踪。

 


 

单元测试的覆盖率情况,方便开发同学分析单元测试用例对测试对象的分支覆盖情况。

 

 


 

编译后就是Sonar进行最后一道集成环境的全量代码扫描工作了。

 

 

 

我们在包管理环节的实践主要分为对 “jar包”和“Docker镜像”的管理。

构建生成的jar包,推送到Maven仓库(用于其他项目的依赖引用)。将Nexus集成到TAPD,通过“构建产物”可以看到软件包的详细信息。

 


 

同时,流水线可以清晰看到构建步骤的耗时分布,也帮助我们有针对性地去优化构建效率。

 

 然后进行Docker镜像打包,推送到Docker仓库,生成配置,并推送到配置仓库。

顺便说说为什么要用Docker吧!

项目初期只有一个dev环境,随着版本构建的频繁,稳定的测试环境对测试同学来说尤为关键,但是部署一套40余工程的环境对运维同学来说工作量也非常之大,于是我们引入了容器技术。在环境搭建、应用迁移方面都有很好的收获。

同时,基于珍爱的业务背景,特别是对于特殊节日搞活动时候,容器化能快速对服务进行横向扩容;减少对环境的依赖,部署快、扩容快。同时容器运行时会对服务运行环境进行隔离,也有效提升了安全性和服务运行的稳定性。

 

 

 自动化测试分为接口测试和UI自动化测试两个部分。

接口测试主要通过开源工具实现,但涉及到跨系统维护,以及测试结果不能很好地跟踪,因此在TAPD上尝试用Python Unit Test做些核心场景的接口测试,以便于将这部分测试纳入到整个研发流水线当中,构建成功后自动触发场景接口测试,失败的用例也能直接在TAPD跟踪

 

 

 

UI自动化,则是我们自己研发的平台,通过关键字驱动实现,并增加了代码覆盖率检测,以帮助测试人员分析哪些分支情况是没覆盖到的。

 

 


 

测试结果转为XML格式后也可以统一集成到TAPD管理,可以清晰直观地展示自动化测试结果。

 

 


 

目前我们的自动化用例覆盖业务流程达239个case成功率94%,运行时长15min,代码覆盖率21%。

 

 

 

我们整个发布流程简单分为以下几个步骤,部署发布环节主要用主流部署工具完成。

 

 

 

 

研发效能度量

每月通过TAPD产生的过程数据进行研发过程效率和质量分析。同时我们也设立了相关奖项激励大家正向PK,提升效率的同时更加重视研发质量。

 研发效率分析

 得益于TAPD的强大API,我们可以拿到需求交付过程数据。

 


 

通过深入分析,我们可以知道效率较低的环节到底是什么原因导致,以制定更有效的提升效率的方案,可以是流程自动化,也可以是制定规范。

 

研发质量分析

 

而研发质量分析方面,我们希望能在团队内部形成重视研发质量的共识和文化。

我们会统计出研发同学本月上线的任务数、代码行、花费、生产bug,来计算出有效花费,遵循“好、多、快”原则,评选出优秀的个人和团队进行表彰鼓励。

 

 


 

噢,TAPD的API好好用,以上提到的脚本均由测试同学通过API实现,你会发现高效的质量度量是一件特别有意思的事情,质量度量后的效能提升更是一件特别有成就感的事情!

 

 

 

 

 

总结

 

珍爱网捷豹CRM项目,应用TAPD DevOps可视化流水线,集成业界主流研发工具,实现一站式持续交付管理,让整个研发过程清晰、直观、透明。

在这一过程中,我们基于TAPD提供的API接口,进行了二次开发,实现了多个环节的自动化闭环。

此外,我们通过API以及TAPD Dashboard,获取持续交付过程数据,从而进行研发效率和质量的分析以及持续改进。

基于以上实践,我们从业务响应周期、持续交付能力、开发质量、交付质量4个方面衡量的研发效能,都有了显著的提升。

我们将持续在此基础之上不断完善和优化,挖掘TAPD DevOps流水线的更多场景,全方位提升研发效能。

 

 

原文地址:https://www.cnblogs.com/chenliangcl/p/10599126.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


前言我们于2022年5月宣布推出 AmazonDevOpsGuruforServerless ,这是面向AmazonDevOpsGuru https://aws.amazon.com/devops-guru/的全新功能。通过此功能,开发人员能够提高无服务器应用程序的运行性能和可用性。该产品链接可点击:https://aws.amazon.com/devops-guru/fe
GIT、GITLAB、GITHUB、GITLIBGit是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Github - 一个网站,提供给用户空间创建git仓储,保存用户的一些数据文档或者代码等作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户。随着越来越...
初识JFrog Artifactory背景在软件项目开发中,一个项目常常依赖于大量的外部库,而这些外部库又在不断的进行版本更新,特别是在当前微服务开发越来越流行的情况下,一个服务依赖于多个服务,如何管理依赖库以及依赖版本,确保开发有序进行呢?JFrog ArtiFactoryArtiFactory是一款二进制存储管理工具,用来管理构建构建工具(如:gradle)等所依赖的二进制仓库,以方...
在删除文件夹的时候,可能会遇到文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开,请关闭该文件夹或或文件,然后重试。这类无法关闭删除文件夹的情况,如下图所示。 解决这个的关键是,找到是哪个程序在使用该文件夹,把这个程序关闭掉就行了。 但有时说实在的并不好找。 下面来介绍一个方便的找到这些程序的方法。 首先按ctrl+shitf+esc快捷键,打开任务管理器。然后...
xcopy 若目标盘上不存在此子目录,而在目标盘的结束符又不以""为结束,则将提示:does destination specify a file name or directory name on the target[f=file,d=directory]?在目标盘上创建文件[按下]还是创建子目录[按下d] ?应选择d键如何在命令中指定copy的是一个文件或者目录?而不用再手动输入F或...
DevOps软件开发工艺解读随着业务复杂化和人员的增加,开发人员和运维人员逐渐演化成两个独立的部门,他们工作地点分离,工具链不同,业务目标也有差异,这使得他们之间出现一条鸿沟。而发布软件就是将一个软件想从鸿沟的这边送去那边,这之中困难重重。另一方面,行业竞争更加激烈,无论是客户还是公司自身,都要求软件能快速发布,频繁修改,而上边所说的这种隔阂,阻碍了开发团队的生产力,成了企业亟待解决的难题。面对...
创建任务创建任务比较简单,这里我们创建自由风格项目:General信息这里填写项目或任务的基本信息,如下:GitBucket这里我们用到的就以下两点,一个是参数化构建:构建的时候可以指定部分参数,比如这里我们这里指定要构建的分支作参数,第二个是丢弃旧的构建:这样每次构建都会丢弃之前历史构建,防止jenkins构建项目过多导致内存泄漏等问题:源码管理源码管理主要是填写我们要构建的...
一、在任务设置-构建触发器模块,选中“Build periodically”二、然后在日程表里输入你的定时构建时间,输入的时间语法参考如下:1、时间字段遵循cron的语法,每行由TAB或空格分隔的5个字段组成:MINUTE HOUR DOM MONOW DOW - 分钟:小时内的分钟数(0-59) - 小时 :一天中的小时(0-23) - DOM:月份的日子(1-31) ...
DevOps进阶(九)使用assembly plugin实现自定义打包assembly plugin的使用方式比较简单,主要有:1. 修改pom.xml pom.xml中设置如下:<build> <plugins> <plugin> <artifactId&g
<h2 id="1-操作环境"><strong>1. 操作环境</strong></h2>1. Windows:win72. JenkinsJenkins 1.6193. JavaJDK_1.7.0_64bit.exe4. Tomcatapache-tomcat-8.
在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。一.find命令基本格式:find path expres......
走近DevOps工程师我们之前已经听到很多谈论DevOps和DevOps世界的最新趋势的事情,但是就DevOps工程师本身,到底干些什么呢?在最纯粹的存在形式上来说,DevOps工程师是为了加快开发和运营团队之间的交付效率而存在的桥梁。DevOps工程师在软件生命周期中能带来什么?在传统的交付周期中,软件开发人员会在经年累月的编写代码后,将软件交给QA团队进行测试,然后将最终版本交给运营...
1、关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit。例如我jenkins的地址http://localhost:8080/,那么我只需要在浏览器地址栏上敲下http://localhost:8080/exit 网址就能关闭jenkins服务.2、重启Jenkieshttp://localhost:8080/restart3、重新加载配置信息http...
   我们在执行Jenkins的项目构建的时候一般都是通过web管理界面中的”构建”来执行项目构建操作,但是除此之外我们还可以通过项目配置中的”构建触发器”来触发构建操作,其中”构建触发器”有一种方式是通过配置令牌远程触发项目构建;要启用Token(令牌)远程触发项目构建首先要保证Jenkins服务安装了build-token-root 插件,...
maven三种打包插件maven有多种可以打包的插件,如下: plugin function 官网 maven-jar-plugin maven 默认打包插件,用来创建 project jar maven-shade-plugin 用来打可执行包,executable(fat) jar http://maven.apache.org/plug...
Linux下查看和添加环境变量$PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接。编辑你的 PATH 声明,其格式为:PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:你可以自己加上指定的路径,中间用冒号隔开。环境变量更改后......
贾磊:高级质量经理&敏捷教练曾就职于外企、国企、大型上市企业等,担任过测试工程师、测试经理、项目经理、敏捷教练、质量总监、高级质量经理等岗位。是一名敏捷变革的爱好者和践行者。爱好网球、羽毛球。正文原文链接:https://www.scaledagileframework.com/continuous-explorati
在IT流行语的字母组合中,DevSecOps是一个很容易让人混淆的缩写。DevSecOps是一个特定工具吗?是否有DevSecOps流程或最佳实践?DevSecOps应该成为内部IT部门的优先事项,还是更广泛的公司理念?如果一个公司已经利用了DevOps的流程和技术栈,那么它应该升级到DevSecOps吗?或者这只
企业项目开发流程商城1.1B2C直销商城商家与会员直接交易(BusinessToCustomer)1.2B2B批发商城商家与商家直接交易1.3B2B2C购物平台商家和会员在另一个商家提供的平台上面进行交易1.4C2B定制商城会员向商家发起定制商品的需求,商家去完成。1.5O2O线上线下
jenkins清除工作空间报错 错误如下: Error:WipeOutWorkspaceblockedbySCM   解决方法:进入jenkins服务器,进入workspace,手动rmcd/var/jenkins_home/workspace  ===================注释==================如果你的启动命令如下:【进行了外部目录的挂载