为什么需要 DevOps
CapitalOne 是美国一家排名前十的银行,在 2014 年,他们技术部门采用传统软件开发方法,代码修改后不是立马上线,而是需要一个构建流程(即编译、测试、部署等),走完这些过程需至少 2 天的时间。显然,传统的软件开发方式在构建流程上有很多不尽人意的地方。
在 2015 年,CapitalOne 的技术部门实践使用 DevOps,然后:
- 代码集成频率:从每月 1 次到每 15 分钟一次;
- 部署流程:从手工变成自动化;
- 部署到生产环境频率:从每月或每个季度 1 次到每个迭代 1 次;
- 单元测试覆盖:从没概念到达到 90% 以上;
由此看出,DevOps 带来的不仅仅是效率,更深高质量软件的保障。
在企业内,集成和交付是非常普遍和高频次的,比如 Flickr 公司每次修改代码都会产生一次部署,一周内平均部署几十次。
Facebook 平均来说一位运维人员负责 500 台服务器,他们每天部署两次。
因此,快速的集成和交付部署将更快从用户那里得到使用反馈,更可以迅速对产品进行改进,更好地适应用户的需求和市场的变化。
DevOps 和敏捷开发的关系
开发团队根据业务需求开发相应的软件功能,开发团队如果采用瀑布模型等传统开发方式将难以快速响应用户需求和市场的快速变化,敏捷开发的出现促进了开发与需求之间的频繁沟通,加速了软件产品的开发效率,能快速响应变化。
但是,虽然新的功能被开发出来了,但按传统的协作方式,运维团队难以将新功能快速的、高质量的进行交付,DevOps 的出现就是为了提高软件产品的交付效率。
总结一下,为什么需要 DevOps?这是因为开发团队和运维团队的协同,已经成为快速交付高质量软件产品的瓶颈。
DevOps基本概念
DevOps 是什么
DevOps 是 Development 与 Operations 的合并简写,是开发和运维一体化的一组过程、方法和工具。如上图所示,开发与运维是紧密联系在一起的。
DevOps 目的
DevOps 目的是加强开发团队和运维团队的协作,使用自动化工具,尽早发现风险,实现持续、快速、可靠地交付高质量软件产品。
DevOps实践
上图展示了软件产品从开发到交付的主要过程。
- 第一步是编码:在代码开发和审阅的过程中,采用 Git 等工具对版本进行控制、合并;
- 第二步是构建:代码提交后,自动出发构建;
- 第三步是测试:采用自动化测试;
- 第四步是打包:通过自动化测试之后,自动打包成可以部署的产品;
- 第五步是发布:将产品自动化部署到生产环境中;
- 第六步是监视:通过监控程序对应用程序的性能进行监控,实时反馈给开发者;
总结一下,DevOps 实践的内容主要分为三部分:配置管理、持续集成、持续交付
配置管理
软件配置管理的核心功能是版本控制。常用的版本控制系统有 Git 和 SVN,通常来说,Git 更适合 DevOps,可以管理代码的所有版本,同时还可以跟踪代码的更改。
每一个开发者都是基于同一个代码库,开发一个新功能时,可以各自拉取一个最新的主干代码进行开发。通过不断的拉取可以让自己的副本和代码库中的版本最小差异化。通过频繁的提交代码可以让其他人拉取的副本和代码库中的版本最小差异化。多个分支并行应该及时变更集中到主干中,避免同时维护软件的多个版本。
持续集成
持续集成(Continuous Integration,简称 CI)是指开发者在代码的开发过程中,可以频繁地将代码部署集成到主干,并进行代码检查、自动化测试、编译构建。
当前状态对所有人都是可见的,集成服务器在服务集成的过程中如果发现问题将会及时的发送警告给相关成员。
持续交付
持续交付(Continuous Delivery,简称 CD )是在持续集成的环境基础之上,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以发布的状态。
持续部署是在持续交付的基础上,把部署到生产环境的过程自动化。
DevOps 完整流程
开发人员在开发环境中完成编码和单元测试之后,将代码提交到仓库中并发起集成,这个过程称为提交集成。提交集成后会触发私有构建,目的是为了防止有错误的代码进入仓库,进而保证代码的质量。编译单元测试和代码测试的结果将会作为代码审查的依据。提交集成的目标是将验证之后的开发代码提交到代码库的主干分支当中,以供其他开发人员使用和提交测试。可以通过人工定期或提交时触发的方式集成构建,集成构建的目标是构建出产品的部署包,需要按「编译、单元测试、打包、代码扫描」的顺序进行构成。可以通过自动化部署集成构建产生的产品部署包,并执行冒烟测试,以验证部署是否成功。接着通知测试人员进行测试,使用自动化测试的工具可以验证是否符合需求,并且自动化生成测试报告,将产品代码进行集成、部署、功能测试等过程称为提交测试,目标是验证新功能是否符合要求并确定待发布的版本。如果通过测试,则进入预发布环节,将待发布的产品部署包部署到预发布环境中,并进行验证,可进行性能测试、渗透测试等。预发布的目标是确定待发布产品部署包是否可以部署到生产环境中。最后发布是指产品部署包部署到生产环境中,并开始为用户提供服务。
DevOps工具链
在代码开发过程中,使用各种编程语言对应的IDE和版本控制工具Git。在测试过程中可使用单元测试工具xUnit、性能测试工具JMeter等。在进行包管理时,各种编程语言对应的包管理工具都是必不可少的。Travis CI和Jenkins都是非常流行的持续集成工具。对软件产品运行状态进行监控时,可以使用Elastisearch等工具。最后可以使用GitHub Project等工具实现团队的协作开发。
Travis Cl
https://travis-ci.org/
Travis Cl 是在软件开发领域中一个在线的、分布式的持续集成服务,用来构建及测试在 GitHub 托管的代码。支持多种编程语言,包括 Ruby、JavaScript、Java、Scala、PHP、Haskell 和 Erlang 等。免费支持 Github 项目,通过 yml 语法驱动执行,开通 Travis 后只需编写.travis.yml 就能完成持续集成,简洁清新而且独树一帜。
Travis Cl 局限性是只支持 GitHub,不支持其他代码托管服务,因此必须满足以下条件:
- 拥有 GitHub 帐号
- 该帐号下面有一个项目
- 该项目里面有可运行的代码
- 该项目还包含构建或测试脚本
使用 Travis Cl 的基本流程是:
官方文档地址 https://docs.travis-ci.coml、https://www.jianshu.com/p/8e6e4fd2aae7
Jenkins
https://jenkins.io/
Jenkins 是一个开源的、提供友好操作界面的持续集成工具,主要用于持续和自动地构建与测试软件项目、监控外部任务的运行。它有以下优点:
- 易安装:只有一个 java -jar jenkins.war,从官网下载该文件后直接运行,无需额外的安装,甚至无需安装数据库
- 易配置:提供友好的 GU 配置界面
- 测试报告:以图表等形式提供详细的JUnit/TestNG测试报表
- 分布式构建:把集成构建等工作分发到多台计算机中完成
- 文件识别:跟踪每次构建生成哪些 jar 包以及使用哪个版本 jar 包
- 插件支持:通过第三方插件扩展,使其变得更加强大
缺点是需要提供专门的机器对 Jenkins 进行部署。
云 DevOps 解决方案
使用开源工具自建 DevOps 有以下缺点:
- 系统众多,搭建成本非常高,因为往往项目管理是一个系统,代码管理也是一个系统,持续集成管理又是一个系统;
- 各系统账号和数据独立,维护成本高;
- 可视化程度低,学习成本高;
为了解决以上问题,由此,云 DevOps 解决方案应运而生,下面介绍几个云 DevOps 平台。
华为云 DevCloud
DevCloud 是华为云提供的云 DevOps 解决方案,它内嵌华为研发最佳工程实践,提供需求管理、项目管理、代码托管、代码检查、编译构建、发布部署、流水线等功能,涵盖完整的软件生命周期过程。
腾讯云 CODING DevOps
CODING DevOps 是腾讯云提供的云 DevOps 解决方案,它提供在线持续集成到自动部署全过程工具,分三大步骤,即迭代管理、持续发布和线上发布,如下图所示:
阿里云云效
云效是阿里云提供的云 DevOps 解决方案,一个阿里云账号就可以访问所有产品,它内置了丰富的丰富的持续交付流水线模板,与阿里云产品深度集成。