持续集成分享佳都数据/运维部/何建来前言随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile)在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。目录DevOpsEssentialsCI/CD持续集成工具介绍2如何持续集成3阶段计划41持续集成介绍软件交付流程需求部署开发传统开发人员工作回顾每天的工作:编写代码、编译、运行单元测试、生成文档、打包和部署。工作内容多,而且琐碎。我们怎么才能把精力放在主要业务的实现和代码优化上呢?如果我们编写的模块对外部系统的有依赖,那么软件集成也是一个问题,而且随着团队的人员的变动,就会对团队协作、软件质量、项目进度的把控提出了更多的要求。项目过程的后期,系统集成测试发现BUG的返工较多,而且返工的工作量比前期发现BUG的返工工作量还大。项目上线时,心中总是忐忑不安,拜托千万不要出错。日常工作中遇到哪些问题?琐碎的事情,占用了大量的时间?传统站点部署流程不通过需求分析原型设计开发代码提交测试内网部署内网测试是否通过外网部署备份数据外网测试代码回滚确认上线发布成功通过不通过通过传统站点部署问题•上哪个版本,版本没错吧?•XX请假了,怎么上线?手抖了……•怕出线上问题啊…•哪些库文件要改…每月都有那么几次!!版本上线已经成为项目组的心魔我们的Dev&Ops别人家Dev&OpsDEVBUSINESSOPS1持续集成介绍定义持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。持续集成要求开发人员频繁地提交他们的所完成的工作产品,这个频率通常是至少每天一次,有时候可以多次。每次集成会通过自动化构建(automatedbuild)的方式进行尽量快速地验证,以确保新提交的变化不会造成新的问题。如果在集成的过程中出现异常,则应当快速的反馈给相关的人员。构建是将源代码放在一起,并验证软件可以作为一个一致的单元运行的过程;验证活动一般包括编译、测试、审查和部署。意义1.持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;2.持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;3.持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。要素1.统一的代码库2.自动构建3.自动测试4.每个人每天要向代码库主干提交代码5.每次代码递交后都会在持续集成服务器上触发一次构建6.保证快速构建7.模拟生产环境的自动测试8.每个人都可以很容易的获取最新可执行的应用程序9.每个人都清楚正在发生的状况10.自动化的部署持续集成工具介绍2Jenkins,之前叫做Hudson,是基于Java开发的一种持续集成工具,用于监控秩序重复的工作,包括:1、持续的软件版本发布/测试项目。2、监控外部调用执行的工作。Jenkins本身并没有自动构建的功能,Jenkins只是将JDK、Maven等工具集成起来,将持续集成的整个过程可视化。什么是Jenkins编译工具1.Make工具Linux或者Windows最原始的编译工具,在linux下编译程序常用make(Windows下对应的工具为nmake)。它负责组织构建的过程,负责指挥编译器如何编译,连接器如何连接,最后生成一个可用的文件。2.Ant工具Make编译一些比较复杂的工具使用起来不灵活,语法很难理解,延伸出ant工具。3.Maven工具MavenMaven是一个项目管理工具,它包含了一个项目对象模型(ProjectObjectModel),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(DependencyManangementSystem),和用来运行定义在生命周期阶段中插件目标的逻辑。Maven是面向技术层面,针对Java开发项目管理工具,它提供了构建工具所提供功能的超集,除了构建功能之外,Maven还可以管理项目结构、管理依赖关系、生成报告、生成Web站点、有助于团队成员之间的交流与协作。可以理解为项目构建工具。对象模型POMMaven项目对象模型POM(ProjectObjectModel),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理软件。Maven除了以程序构建能力为特色之外,还提供高级项目管理工具。POM是Maven项目中的文件,使用XML表示,名称叫做pom.xml。在Maven中,当谈到Project的时候,不仅仅是一堆包含代码的文件。一个Project往往包含一个配置文件,包括了与开发者有关的,缺陷跟踪系统,组织与许可,项目的URL,项目依赖,以及其他。它包含了所有与这个项目相关的东西。事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。Pom.xml文件groupId:组织标识,通常是独一无二的。例如,一家银行银行集团拥有所有银行相关项目artifactId:项目名称,version:版本号,例如:1.0,packaging:打包的格式,可以为:pom,jar,war,ear,rar,parMaven的价值指导开发:提供了Java项目的最佳开发实践,自由开发项目骨架而可自动生成项目结构自动编译:不仅仅只像Ant自动编译,还包括测试,打包,发布,文档生成,项目站点生成……依赖管理:Maven可以方便地管理应用程序依赖,例如第三方依赖、模型依赖无限扩展:插件模式可以无限增强Maven功能,例如通过Tomcat、Jetty插件可以自由控制其服务器持续集成:鼓励开发者积极提交代码,更早地发现程序错误,在并行开发中稳妥推进开发协作:更简单和谐的团队协作如何持续集成3持续集成系统的组成一个完整的构建系统必须包括:•一个自动构建过程,包括自动编译、分发、部署和测试等。•一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。•一个持续集成服务器。本文中介绍的Jenkins就是一个配置简单和使用方便的持续集成服务器。持续集成流程持续集成详细流程成果展示阶段计划4级别环境和部署流程管理配置管理构建和持续集成开发测试质量运维监控和度量原始阶段纯手工过程部署软件系统、配置环境,不能频繁部署、过程不可靠流程流转靠人的经验管理来完成部分文件使用版本控制,签入代码不频繁纯手工方式构建,缺少管理和报告手工测试人工监控为主,自动监控为辅基础阶段自动化部署到某些环境,创建一套新环境比较简单快捷,过程相对可靠需求、开发、运维之间交换有规范、不存在信息遗漏所有构建软件系统所需的东西都纳入版本控制,包括源代码、配置、构建脚本、部署构建、数据脚本等定时或人工触发自动化构建部分自动化测试监控作为常态化运维保障工作,故障发生时通过邮件、短信等方式及时通知可持续阶段全自动化、提供自助服务式的部署方式,每个环境的部署都共用同一个过程各个环境流程管理是闭环,并在平台中管理,环节之间流转具备自动化能力库和依赖也被管理起来每次变更提交都会触发自动化构建和测试自动化单元、接口、UAT测试有统一的监控平台,并能对监控数据进行分析和异常定位成熟阶段完全自动化,实现端到端的交付从平台上可以看到整个过程的信息频繁签入代码,开发人员每天至少签入一次代码到主分支收集构建度量及测试结果数据,并进行可视化分析和展示质量度量和趋势跟踪,自动化测试可以覆盖的都采用自动化测试所有系统都纳入统一监控平台,开发运维可通过监控平台提升系统可靠性管理优化阶段所有资源和环境都会高效的管理起来,自动化地配置管理,提供统一的PaaS服务平台提供虚拟化、容器化的资源团队从需求、开发、测试、部署、运维,所有工具和管理都在一个平台,可管理、可流转、可追溯支持高效的协作、快速开发、可审计的变更管理流程持续改进流程,优化反馈机制,提高透明度几乎没有生产回退、缺陷能及时发现和修复系统监控和业务反馈及时,快速进行优化提升成熟度模型第一阶段:核心实践和试点第二阶段:持续集成和测试第三阶段:持续部署和交付第四阶段:持续运维第五阶段:持续评估改进阶段实施DevOps指标金字塔运维效率服务质量服务速度组织效能客户价值经营业绩收益资金流市场份额新的业务服务支持交付时间用户满意度响应时间净推荐值/口碑分享合作响应变化意志和情绪生产支持部署成功率故障恢复时间生命周期时间部署频率每次交付成本变更和发布的成本支持的用户数支持的服务器数指标金字塔