DevOps落地实践及案例分享_chuangejing4954的博客-程序员宅基地

技术标签: devops  


转载本文需注明出处:微信公众号EAWorld,违者必究。

引言:

银行业为了应对业务的快速变化、互联网层面不穷的业务形态和交易压力,IT“双态(或双模)化”无可避免,开始探索部分业务参考互联网的方式引入分布式架构,但对于银行业独特的强监管、高安全、强一致性的行业要求前提下,如何在业务发展、合规、IT革新之间找到平衡?

而DevOps被越来越多的金融企业所采用,来支撑软件生产过程的数字化转型,本文主要和大家分享在金融行业落地DevOps的一些坑,如何填坑以及一些心得体会!希望大家能够在自己企业中,找到适合自己企业的DevOps实践之路!

目录:

一、关于DevOps实践的一些问题
二、DevOps在金融行业落地都有哪些姿势
三、DevOps在金融行业落地的套路
四、DevOps将软件生产线数字化
五、总结一些DevOps最佳实践
六、DevOps项目落地过程中一些心得体会

1.关于DevOps实践的一些问题

来源:DevOps咖啡馆


我们从国际信息科学考试学会(EXIN)关于DevOps认证体系来分析,DevOps Pre-Master(DOPM)中包含了敏捷、精益、ITSM和测试相关的内容,也就是说这四项其实是作为了DevOps知识体系的基础,其中敏捷、精益和测试是和软件生产、开发工作Dev强相关,ITSM则与Ops运维工作强相关。所以DevOps知识体系更像是对于以往IT知识的再次提炼和融合,不是一门新的技术。

DevOps是什么?又不是什么?

DevOps是个开放的体系,从实践中而来,并且还在不断的发展,具体到某个组织也并没有一致的套路,所以DevOps落地更多是因组织而异、因目标而异、因人而异
大家越来越意识到IT是个系统工程,要提高IT组织的绩效,有很多好的通用的实践,好的DevOps落地实践会涵盖DevOps最核心原则和模式,避免走不必要的弯路,有效地缩短个人和组织的学习曲线
在DevOps项目落地过程中需要培养和训练全局的、系统性的思维认知能力,而非某些工具和命令的用法(原因是:原则和实践是相对稳定的,而工具和命令的变化是非常快的),DevOps落地不是单纯的CI/CD,也不是单纯的Jenkins + Ansible

DevOps是自动化运维吧?不是做运维的为什么要学DevOps?

DevOps是跨部门的合作,里面涉及的部门和角色远不止开发和运维(其他包括产品、需求、架构、测试、安全、项目管理等),所以DevOps不是自动化运维
但DevOps项目落地需要服务于组织目标,可以从自动化运维开始

讲DevOps还是在讲理论,会不会太虚了?

所谓DevOps落地本质上就是定义问题、识别问题可能的最优解、然后不断实验该解的循环过程。这里不存在一个通用的落地框架,重要的是能理解问题的本质,培养自主解决问题的能力。任何别人家的落地都只是别人家的,企业需要发展出独有的、属于自己的落地实践,没人能替代(就像家长嘴里的别人家的孩子,永远无法成为自己的孩子)
DevOps是高绩效IT企业实践的有机集合体。任何企业的IT都需要在竞争的环境下不断提升自身的绩效,以便有效创造客户价值、最大化业务产出、减少浪费、提升交付速度和交付质量,并使企业在数字化时代拥有市场领先的IT能力。那么,从这个意义上来讲,只要是IT从业人员,学习和了解DevOps对组织和个人都是有非常有意义的

2.DevOps在金融行业落地都有哪些姿势



我们先看看我们对于CICD的定义:

CI持续集成,我们通常定义为从代码提交到编译打包,再到SIT的过程
CD中的持续交付,我们通常定义为从代码提交到UAT的过程
但项目里,没有用DevOps做CI的项目,也可变相为从编译打包到UAT的过程
CD中的持续部署,我们通常定义为从代码提交到最后生产部署的全过程
但项目中,有可能变通为从编译打包到生产部署的过程

总结来看,项目结果不同,或者接入DevOps应用系统也有可能处于不同的阶段,这造成了,CI/CD的过程随项目实际情况会有些差异。



DevOps项目在售前、招标或前期阶段,我们通常看到是小圈里面的内容:CI/CD、自动化部署及回滚、与现有云平台的接口、流程的图形化编排调度等,但这些只是DevOps的内核,真正去落地一个DevOps项目的时候,其实你会看到外面大圈的这些内容,换句话讲,需要梳理组织整个软件生产的全过程!

姿势一:小范围CI+CD,再全公司推广



先看看Capital one的案例,美国第一资本金融公司,美国排名前十的银行。

痛点:

2014年当时,Capital One的软件开发实践和很多传统做法没有什么不同:大量外包,瀑布模型,季度发布,手工流程,变更请求。在某次代码检查会上,大家发现一个测试失败是由于某个XML文件里的tag不配对造成的。按理说,这么小的问题改了再提交就可以了。但是:开发工作是由另外一家公司负责,他们需要发起漫长的变更请求;代码修改后的构建流程(编译、测试、部署等)就需要至少2天时间。这个小小的问题让Capital One的技术团队开始反思他们的构建流程,并决定从这里下手。他们从一个小的团队开始实践DevOps,最终把时间从2天缩短到几分钟。于是,这个实践逐渐在Capital One蔓延开来,所谓星星之火,可以燎原。

2015年的成绩:

代码提交频率:从之前的不固定到每天100多次的提交
代码集成频率:从每月1次到每15分钟一次
部署流程:手工变成自动化
部署到QA和Perf(性能)环境频率:从每月1次到每天4次
部署到生产环境频率:从每月或每个季度1次到每个迭代1次
单元测试覆盖:从没概念到>90%

2016年的成绩:

发布到产品环境的频率:从每个迭代一次到每天至少1次
自动发布的应用软件数量达20个
一个应用软件每天最多可以发布34次

总结DevOps在Capital one的落地姿势:先小范围做全套,再全公司大范围推广。



某寿险也是用的姿势一:他们是与基于Spring cloud的微服务体系架构一起引入DevOps的,原来的想法只是对于这些新的微服务的应用适用DevOps,经过半年的时间之后,感觉还不错,就将DevOps逐步向传统单体架构的应用中去推广了。表中的系统是目前已经接入到DevOps中的系统。对接的代码库有svn/gitlab/bitbucket,介质库是Nexus,CI和CD的流程目前还是做手工触发,CI集成了Sonar和maven test单元测试,cd已包含测试和生产环境。组件包含:springboot、shell脚本和tomcat 3类,主要是全量的部署方式。

再总结一下:先小范围适用CI+CD,它是现在微服务架构适用的,取得经验积累之后,再大范围的推广。

姿势二:先CI,后CD

我们看看中国银行的案例



在项目之初,中国银行首先对软件生产的全流程进行了重新梳理和规划,其中包含流程、规范、度量体系和反馈机制。

在实践阶段分了三步走,研发层面的持续集成、运维层面的持续交付,最终打通研发和运维实现DevOps全流程。

从试点效果来看,单就自动化部署层面就比之前提高了2-5倍的效率。并且在软件质量和规范落实层面有了长足的进步。

再来一个以姿势二落地的,某国家政策性银行。



它的科技局下属研发中心和运行中心是分开的两个大部门,两个部门之间的纽带就是介质,但之前代码基线与生产环境的介质版本一直对不上,这对生产的BUG修复、灾备部署都形成了很大困扰,所以它的研发中心引入DevOps是希望能形成统一的软件出口,能够将需求、代码、配置、介质控制在同一个基线上。所以他们做法是先做CI,并且并行配合maven的框架推广及CMMI4的落地实施。但项目到了二期,它要引进建行建银科技的新核心,一是新核心短时间内的多版本在多个测试环境的部署,二是配合改造的69个业务系统短时间内也会有很多版本要快速部署,进行集成测试,这就要求必须有自动化部署的工具才行。所以DevOps二期的重点就定在了CD,主要是配合核心及配套改造系统提测后的快速自动化部署。

所以总结一下,DevOps落地的第二个姿势:通常都是先由研发部门主导做CI,之后再推广CD,最后将两个流程串起来形成CI和CD的全流程。

姿势三:先CD,后CI



这是一家地方商业银行,也是因为今年要上新核心,并且伴随新核心,有5个系统要重新建设,110套系统要配套改造,行领导提出的目标:在9月8日上线时,利用DevOps做一键式的统一部署!所以项目一期的重点就放在了CD上,短期目标是满足110多套系统的短期大量版本的提测后的自动化部署,最终目标,是要将1+5+110这些系统能够可视化的一键式部署。项目的二期重点,是在CI,配合诸多研发管理的落地实施,全流程的应用和推广以及自动化测试的接入。

3.DevOps在金融行业落地的套路



套路我总结了五步:确定目标、选好姿势、梳理全流程、制定规范、最后分步实施。我们细看一下这五步:

第一步:确定目标

示例一:



这是农行对于DevOps设定的目标:1个平台、能够连接开发、测试、运维3个角色,打通需求、开发、测试、部署、运维5个环节。

示例二:



我们再看看招商银行设定的目标:DevOps是作为打造精益研发体系的一个重要组成部分。

第二步:选好姿势

第一种姿势:小范围CI+CD,之后全公司推广CI+CD , 并打通全流程
第二种姿势:先CI,后CD,打通全流程
第三种姿势:先CD,后CI ,打通全流程

第三步:梳理全流程

示例一:



这是对一家商业银行全流程的梳理,以及DevOps需要集成的IT系统,如项目管理系统、JIRA以及测试管理系统。

示例二:




这是招商银行的全流程梳理,将DevOps平台切成了两个平台协同工作平台和持续交付流水线平台。

示例三:




以上是农行的全流程梳理方式。

第四步:制定规范

在将整个软件生产全流程梳理完之后,会很对DevOps及各原有IT系统的集成界面和分工非常清晰。接下来就要进行第四步规范的梳理和制定,规范包含哪些呢?

开发规范
持续集成规范
持续部署规范
持续交付规范
介质管理规范
文档命名规范
开发分支管理策略
测试管理规范
运维管理规范
……

那规范制定的目的是什么呢?

有效管控软件生产线上的各个活动和环节
建立统一质量和衡量标准
软件生产活动能被持续度量、反馈、优化
通过DevOps进行有效落实

简单来讲,没有规范的制约,没有统一标准,大家各做各的,DevOps项目不可能成功。

第五步:分步实施

接下来,就是第五步,要具体的落地实施了,但也要有前有后,分轻重缓急。我们建议调些试点项目来,如何来调呢,原则是啥?

DevOps试点项目的选择建议原则:

基于互联网渠道,需要快速迭代的项目
需求、产品、开发、测试、运维都在一个团队的项目
有一定脚本化或CI/CD积累的项目
基于JAVA Maven的项目

DevOps试点项目执行原则:

制定规范与试点项目执行并行,来验证规范可落地、可实施,而非空中楼阁
通过试点项目总结出类似项目推行DevOps的规定动作,如:Demo脚本、CI/CD流程、自动化测试脚本、Maven二方库和三方库的管理经验等等
DevOps与试点项目团队混编,定期举行回顾会,巩固成果,总结教训,关键——肯定成绩和收获

DevOps试点项目执行的苦恼:一个巴掌拍不响:

需要坚持对目标的执念
“两口子过日子”理论

4.DevOps将软件生产线数字化



从横向角度来看,DevOps产生的数据可以分3个部分:

管理数据、开发数据和运营数据,其实这些数据是涵盖了软件生产的全过程,我们可以通过这些数据或直播,来反哺到我们的生产过程,优化我们的不足。



我们从另一个角度DevOps的质量视图、从纵向角度来看,我们也可以从周期、效率、治理和技术的角度来去制定指标考核。

5.总结一些DevOps最佳实践

持续集成的原则

鼓励开发人员在开发分支上频繁的提交代码,随后触发CI流程,在CI过程中可以加入单元测试和代码质量检查等动作,这样产生代码冲突的几率会下降,并且代码质量也会提高的;
在下班之前,构建必须处于成功状态,原因是你的代码在第二天有可能是其它同事开发工作的基础,如何无法保证构建成功,会影响其它的人工作质量和效率,团队氛围也会产生坏的影响;
让开发环境上快速体现最新程序包
让程序、配置、数据分离,其实现在好多的单体应用开发时,是将程序、配置、数据裹在一起的,改一处,要解决一堆的依赖,改一处,牵扯到很多地方都要做更新,这些降低了版本迭代的效率,并且很可能会出现遗漏
maven模式下,pom依赖尽量不要用system本地依赖模式,而是将二方库和三方库依赖到统一的类似Nexus介质库,整个组织一份,来屏蔽本地jar依赖差异导致的编译错误。

持续集成的最佳实践

构建过程,建议等待构建的结果,不要同时做其它的事情,尤其是构建失败之后不要提交新代码,这样很可能会错上加错,最后不知道到底是谁的错,这些错误的回溯会产生很大的成本。
提交之前在本地运行所有的提交测试
提交之前请更新本地代码,保证代码是最新的,冲突解决了,再提交
记得更新数据库、配置文件等 
等构建成功后再继续其他工作 
下班之前,构建必须处于成功状态 
以十分钟为界限,如果代码提交后构建错误,十分钟之内无法解决问题,需要将新代码撤回,否则可能会影响其它同事的工作。

自动化部署的原则

原则1:确保从开发、各类测试到生产,使用相同版本的中间件和操作系统,保证从操作系统、到补丁包、到应用运行环境基线是一致的
原则2:同一套脚本,解决各类环境的部署问题,不要试图通过脚本来解决环境的差异性,因为环境的差异性本应该是不存在的,否则改了脚本,之前的各个环境还需要做脚本的回归测试
原则3:部署之前,事先设计回滚与零停机发布的策略
原则4:全量发布优先,尽量不要用增量发布,因为引入增量发布,就会引入手工操作,人工去选择哪些做增量
原则5:详细记录部署活动的整个过程

自动化部署的最佳实践

要做到自动化部署,要确保自动化部署的成功,最最重要的关键为:保障一致性!将要部署的各个环境一致;在各个环境执行的部署脚本一致;要部署的安装包也要一致! 

从提测之后,所有环境运行的是同一个介质包,不要在SIT、UAT、准生产和生产等环节重复的打包
保证各个环境的操作系统、补丁和软件运行环境的基线一致;
保证使用同一的二方和三方库依赖,推荐Nexus
关于配置文件,建议: 配置文件与代码的版本保持一致 
配置项清晰、规范、统一命名
配置项模块化、且封闭
每个配置项都是唯一的,避免顾此失彼
避免过分设计,尽量简单
建议逐步过渡到Apollo这样的统一配置中心,以key/value的形式管理各环境的配置项

6.DevOps项目落地过程中一些心得体会

关于DevOps项目的复杂度,我画了一个矩阵图,希望与大家形成共鸣:



图的X轴是软件生产的全流程,Y轴是DevOps要集成的各类IT系统,Z轴是要推广的各个项目,从这个图可以看出,要做好DevOps落地,复杂度还是相当高的。

DevOps项目落地,我自己总结了一套扁担理论:



这条扁担就是软件生产的全流程,是整个项目的骨架,需要事先梳理全流程,并打通工具链,制定各类规划和规范
扁担一头挑着自动化持续集成,各项目组件构建的调研、设计、开发、适配,从标注化到脚本化,最后自动化,并落实开发规范
扁担另一头挑着自动化部署,各项目组件部署的调研、设计、开发、适配,从标注化到脚本化,最后自动化,并落实部署和运维规范

但DevOps项目虽然落地困难,无论从管理者层面和一线人员层面也确确实实能给金融起来带来价值:

对于管理者:

将软件生产的各个管理环节前置,尽早发现软件质量问题,从而降低缺陷的解决成本和对生产带来的影响;提高软件产品的质量
缩短软件产品的生产周期,软件产品尽早的投产使用,给业务带来价值
实现从业务需求到产品上线的里程碑管理和成本统计
实现需求、开发任务、代码之间的闭环关联

对于一线人员:

引入流程化和自动化等手段,提高软件产品的生产效率
保证环境一致性、脚本一致性、介质一致性,缩短各环境的发布部署时间
在软件产品的生产过程中,引入标准和规范,从而规避手工操作带来的混乱和风险 

希望大家能够通过本文,了解一些DevOps在金融行业落地的套路和最佳实践,能够找到适合自己组织的DevOps落地经验。


关于作者:八爷,普元架构师,擅长DevOps、基础架构层IaaS/PaaS/虚拟化、系统分析和架构分析;参与九江银行持续集成项目、国家开发银行CDP二期项目、中投移动办公平台项目、山东城商联盟服务治理项目咨询工作。


关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。长按二维码关注!

转载于:https://my.oschina.net/u/3920392/blog/3081707

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chuangejing4954/article/details/101010276

智能推荐

hadoop原理巧用到异地机房双活_hadoop怎么算双活-程序员宅基地

为什么要考虑hadoop集群异地双活?因为我们一般集群的建设基本上都是部署在同一个地方,为了保证公司业务24小时不间断服务,所以必须要考虑集群的高可用,而我们常见的高可用一般是给A集群搞个灾备集群B集群,A、B集群不会再同一个机房,A、B集群的数据同步依赖于hadoop自身提供的工具distcp,那么discp有什么缺点呢。1.长时间占用yarn资源2.一般只同步重要的部分数据(这一点其实没毛病)3.两个集群必须所有节点必须网络畅通4.天级别数据延迟,因为我们可能一天24小时都在同步..._hadoop怎么算双活

float的范围和有效数字怎么算出来的?_float bit位计算-程序员宅基地

首先说一下: 范围是3.4E-38 ——3.4E+38,可提供7位有效数字。 上述这两个量都是近似值,各个编译器不太一样的。 下面我就将标准值是怎么定义的,和你说一下: 这个比较复杂,建议你找一下IEEE754标准看一下。 这个简单说一下吧: 在IEEE754标准中进行了单精度浮点数(float)和双精度数浮点数(double)的定义。float有32bit,doubl_float bit位计算

面试题整理----Java基础-程序员宅基地

1.JDK 和 JRE 有什么区别?JRE是运行时环境 给需要运行Java程序的人使用JDK是Java开发工具包 包含JRE 给开发人员使用2.== 和 equals 的区别是什么?==比较的是内存地址equals比较的是值3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?不对,equals为true时hashco...

Spark整合Hive报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient-程序员宅基地

报错截图:整合Hive过程:hive版本:hive-1.1.0-cdh5.14.0 spark版本:spark-2.0.2-bin-hadoop2.7将hive的conf目录下的hive-site.xml配置文件拷贝到spark的conf目录下。hive的元数据存储在远端的mysql上,所以需要将mysql-connector-java-5.1....

android动画插值器-程序员宅基地

在android的动画中,有一个插值器,他的作用是告诉动画某个属性(比如颜色的渐变)如何随时间变化。它将以线性方式变化,还是以指数方式变化?它是否在开始时变化速度很快,然后逐渐变慢?使用方法是在需要设置插值器的动画xml文件中增加一个interpoplator属性,如下:http://schems.android.com/apk/res/android"android:inte

Project——智慧出行——module3--tf_modeling——步骤1:目录结构完善-程序员宅基地

完善目录结构, 其中utils中文件是直接复制tf_consumer中的内容

随便推点

Websocket--抓包分析Chrome+Fiddler_chrome websocket 抓包-程序员宅基地

之前自己一个人负责完成了公司的消息推送服务,和移动端配合完成了扫码登录、订单消息推送、活动消息广播等功能。为了加深自己对Websocket协议的理解,自己通过进行抓包的方式学习了一番。现在分享出来,希望对大家能有所帮助。Chrome控制台(1)F12进入控制台,点击Network,选中ws栏,注意选中Filter。(2)刷新页面会得到一个ws链接。(3)点击链接可以查看链接详情..._chrome websocket 抓包

android日志管理策略,logger android日志框架使用-程序员宅基地

1.项目背景logger是用于android 平台下打印各种(Json,map,list)格式文本和保存到本地文件的日志框架2.导入(当前使用2.1.1版本)android studio下,在gradle.build文件下添加,dependencies {compile 'com.orhanobut:logger:x.x.x'}eclipse 导入logger.2.1.1包3.API使用 框架结构...

在Matlab2018b中配置MinGW-w64 C/C++ 编译器_matlab2018 的 mingw-w64 编译器支持包-程序员宅基地

在Matlab2018b跑代码时,输入mex -setup,报错:错误使用 mex未找到支持的编译器。您可以安装免费提供的 MinGW-w64 C/C++ 编译器;在(https://jmeubank.github.io/tdm-gcc/articles/2020-03/9.2.0-release)上下载64位的TDM-GCC(根据自己的实际情况下相应的版本)下载完成后,有一个exe的文件双击下载好的exe文件再输入安装目录,【注意:要安装到c盘根目录下 这里是默认安装到的c盘】一直下_matlab2018 的 mingw-w64 编译器支持包

玩转Selenium 之三分钟解决遇见伪元素该如何处理?_处理为伪元素-程序员宅基地

问题发生在很多前端页面中,大家会见到很多::before、::after 元素,比如【百度流量研究院】:​比如【百度疫情大数据平台】:​以【百度疫情大数据平台】为例,“累计确诊”文本并没有显示在 HTML 源代码中,如果通过常规的 xpath 元素定位方式是没办法的,因为“累计确诊”文本并不存在当前页面 dom 树中。如何处理?我们要弄清楚的是该元素的特殊之处,文本究竟存放在哪?其实很简单,通过 Chrome 的 F12,我们将.._处理为伪元素

C、C++学习笔记——编写图形化界面链接时出现“LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main”解决方案-程序员宅基地

笔者在使用Microsoft Visual C++写一个图形化界面时,程序在编译时没有问题,编译通过,但是在链接时报错,如下图所示:错误信息:LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/界面.exe : fatal error LNK1120: 1 unresolved extern..._libcd.lib(crt0.obj) : error lnk2001: unresolved external symbol _main debug/

【Unity3D】5.x以上版本Application里面的某些方法过时的解决办法-程序员宅基地

Application.LoadLevel过时Application.LoadLevel("levelToLoad");//levelToLoad是string类型解决办法:using UnityEngine.SceneManagement;//引入命名空间SceneManager.LoadScene("levelToLoad");