DevOps
- 1. DevOps起源
- 1.1 瀑布开发模型
- 1.2 敏捷开发模型
- 2. DevOps到底是什么?
- 3. DevOps与虚拟化、容器、微服务
- 4. CI/CD是什么 ?
- 4.1 CI 持续集成(Continuous Integration)
- 4.2 CD 持续交付(Continuous Delivery)
- 4.3 CD 持续部署(Continuous Deployment)
- 4.4 CI 和 CD 有什么区别?
- 5. DevOps和CI/CD关系
1. DevOps起源
我们知道,一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护。
1.1 瀑布开发模型
最初,程序比较简单,工作量不大,程序员一个人可以完成所有阶段的工作。
随着软件产业的日益发展壮大,软件的规模也在逐渐变得庞大。软件的复杂度不断攀升。一个人已经hold不住了,就开始出现了精细化分工。
码农的队伍扩大,工种增加。除了软件开发工程师之外,又有了软件测试工程师,软件运维工程师。
分工之后,传统的软件开发流程是这样的:
软件开发人员花费数周和数月编写代码,然后将代码交给QA(质量保障)团队进行测试,然后将最终的发布版交给运维团队去布署。所有的这三个阶段,即开发,测试,布署。
早期所采用的软件交付模型,称之为“瀑布(Waterfall)模型”。
瀑布模型,简而言之,就是等一个阶段所有工作完成之后,再进入下一个阶段。
这种模型适合条件比较理想化(用户需求非常明确、开发时间非常充足)的项目。大家按部就班,轮流执行自己的职责即可。
但是,项目不可能是单向运作的。客户也是有需求的。产品也是会有问题的,需要改进的。
随着时间推移,用户对系统的需求不断增加,与此同时,用户给的时间周期却越来越少。在这个情况下,大家发现,笨重迟缓的瀑布式开发已经不合时宜了。
1.2 敏捷开发模型
于是,软件开发团队引入了一个新的概念,那就是大名鼎鼎的——“敏捷开发(Agile Development)”。
敏捷开发在2000年左右开始被世人所关注,是一种能应对快速变化需求的软件开发能力。其实简单来说,就是把大项目变成小项目,把大时间点变成小时间点。
有两个词经常会伴随着DevOps出现,那就是CI和CD。CI是Continuous Integration(持续集成),而CD对应多个英文,Continuous Delivery(持续交付)或Continuous Deployment(持续部署)。
美其名曰:“持续(Continuous)”,其实就是“加速——反复——加速——反复……”
敏捷开发大幅提高了开发团队的工作效率,让版本的更新速度变得更快。
很多人可能会觉得,“更新版本的速度快了,风险不是更大了吗?” 其实,事实并非如此。
敏捷开发可以帮助更快地发现问题,产品被更快地交付到用户手中,团队可以更快地得到用户的反馈,从而进行更快地响应。而且,DevOps小步快跑的形式带来的版本变化是比较小的,风险会更小(如下图所示)。即使出现问题,修复起来也会相对容易一些。
虽然敏捷开发大幅提升了软件开发的效率和版本更新的速度,但是它的效果仅限于开发环节。研发们发现,运维那边依旧是铁板一块,成为了新的瓶颈。
运维工程师,和开发工程师有着完全不同的思维逻辑。运维团队的座右铭,很简单,就是“稳定压倒一切”。运维的核心诉求,就是不出问题。
什么情况下最容易出问题?发生改变的时候最容易出问题。所以说,运维非常排斥“改变”。于是乎,矛盾就在两者之间集中爆发了。
这个时候,我们的DevOps,隆重登场了。
2. DevOps到底是什么?
DevOps这个词,其实就是Development和Operations两个词的组合。
DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
这个定位稍微有点抽象,但是并不难理解。反正它不是某一个特定软件、工具或平台的名字。
从目标来看,DevOps就是让开发人员和运维人员更好地沟通合作,通过自动化流程来使得软件整体过程更加快捷和可靠。
很多人可能觉得,所谓DevOps,不就是Dev+Ops嘛,把两个团队合并,或者将运维划归开发,不就完事了嘛,简单粗暴。
注意,这个观点是不完全对。这也是DevOps这些年一直难以落地的主要原因。
想要将DevOps真正落地,首先第一点,是思维转变,也就是“洗脑”。不仅是运维的要洗,开发的也要洗。员工要洗,领导更要洗。
DevOps并不仅仅是组织架构变革,更是企业文化和思想观念的变革。如果不能改变观念,即使将员工放在一起,也不会产生火花。
除了洗脑之外,就是根据DevOps思想重新梳理全流程的规范和标准。
在DevOps的流程下,运维人员会在项目开发期间就介入到开发过程中,了解开发人员使用的系统架构和技术路线,从而制定适当的运维方案。而开发人员也会在运维的初期参与到系统部署中,并提供系统部署的优化建议。
在思维和流程改变的同时,想要充分落地DevOps,当然离不开软件和平台的支持。
对比前面所说的瀑布式开发和敏捷开发,我们可以明显看出,DevOps贯穿了软件全生命周期,而不仅限于开发阶段。
下面这张图,更明显地说明了DevOps所处的位置,还有它的价值:
3. DevOps与虚拟化、容器、微服务
这几年云计算技术突飞猛进,大家应该对虚拟化、容器、微服务这些概念并不陌生。当我们提到这些概念的时候,也会偶尔提及DevOps。
大家可以设想一下,如果要对一项工作进行精细化分工,我们是对一个大铁疙瘩进行加工方便?还是拆成一块一块进行加工更加方便?
显然是拆分之后会更加方便。
所谓“微服务”,就是将原来黑盒化的一个整体产品进行拆分(解耦),从一个提供多种服务的整体,拆成各自提供不同服务的多个个体。
单体式架构(Monolithic)→ 微服务架构(Microservices)
- 微服务架构下,不同的工程师可以对各自负责的模块进行处理,例如开发、测试、部署、迭代。
- 而虚拟化,其实就是一种敏捷的云计算服务。它从硬件上,将一个系统“划分”为多个系统,系统之间相互隔离,为微服务提供便利。
- 容器就更彻底了,不是划分为不同的操作系统,而是在操作系统上划分为不同的“运行环境”(Container),占用资源更少,部署速度更快。
虚拟化和容器,其实为DevOps提供了很好的前提条件。开发环境和部署环境都可以更好地隔离了,减小了相互之间的影响。
4. CI/CD是什么 ?
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。
CI/CD 的核心概念是持续集成、持续交付和持续部署。它是作为一个面向开发和运营团队的解决方案,主要针对在集成新代码时所引发的问题(也称为:“集成地狱”)。
CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。
这些关联的事务通常被统称为 CI/CD 管道,由开发和运维团队以敏捷方式协同支持。
4.1 CI 持续集成(Continuous Integration)
协同开发是目前主流的开发方式,也就是多位开发人员可以同时处理同一个应用的不同模块或者功能。但是,如果企业计划在同一天,将所有开发分支代码集成在一起,最终可能会花费很多时间和进行很多重复劳动,费事费力。因为代码冲突是难以避免的。如果开发人员本地的环境和线上不一致的话,那么这个问题就更加复杂了。
持续集成(CI)可以帮助开发者更快地将代码更改合并到主分支并进行验证。
一旦开发人员将改动的代码合并到主分支,系统就会通过自动构建应用,并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。
如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速暴漏这些错误。
4.2 CD 持续交付(Continuous Delivery)
CI 在完成了构建、单元测试和集成测试这些自动化流程后,持续交付可以自动把已验证的代码发布到企业自己的存储库。
持续交付旨在建立一个可随时将开发环境的功能部署到生产环境的代码库。
在持续交付过程中,每个步骤都涉及到了测试自动化和代码发布自动化。
在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中。
4.3 CD 持续部署(Continuous Deployment)
对于一个完整、成熟的 CI/CD 管道来说,最后的阶段是持续部署。它是作为持续交付的延伸,持续部署可以自动将应用发布到生产环境。
实际上,持续部署意味着开发人员对应用的改动,在编写完成后的几分钟内就能及时生效(前提是它通过了自动化测试)。这更加便于运营团队持续接收和整合用户反馈。
总而言之,所有这些 CI/CD 的关联步骤,都极大地降低了应用的部署风险。
不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期工作量还是很大的。
4.4 CI 和 CD 有什么区别?
CI/CD 中的“CI”始终指持续集成,它属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到共享存储库中。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。
CI/CD 中的“CD”指的是持续交付和/或持续部署,这些相关概念有时会交叉使用。两者都事关管道后续阶段的自动化,但它们有时也会单独使用,用于说明自动化程度。
- 持续交付(第一种CD)通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器仓库),然后由运维团队将其部署到实时生产环境中。这旨在解决开发和运维团队之间可见性及沟通较差的问题。因此,持续交付的目的就是确保尽可能减少部署新代码时所需的工作量。
- 持续部署(另一种“CD”)指的是自动将开发人员的更改从存储库发布到生产环境,以供客户使用。它主要为了解决因手动流程降低应用交付速度,从而使运维团队超负荷的问题。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。
CI/CD 既可能仅指持续集成和持续交付构成的关联环节,也可以指持续集成、持续交付和持续部署这三项构成的关联环节。更为复杂的是,有时“持续交付”也包含了持续部署流程。
归根结底,我们没必要纠结于这些语义,您只需记得 CI/CD 其实就是一个流程(通常形象地表述为管道),用于实现应用开发中的高度持续自动化和持续监控。
5. DevOps和CI/CD关系
- DevOps是一种思想,是一种文化,主要强调软件开发测试运维的一体化,目标是减少各个部门之间的沟通成本从而实现软件的快速高质量的发布。
- CI/CD是指持续集成发布部署,是一套流程实现软件的构建测试部署的自动化。
- DevOps与CI/CD紧密相关,是理论与实践的结合,DevOps要实现人员一体化,必须要借助CI/CD工具来自动化整个流程。