-
为什么我们需要DevOps?
-
DevOps与敏捷开发有何不同?
-
重要的DevOps工具是什么?
-
持续集成,持续交付是什么?
-
基础架构即代码是什么?
与围绕软件开发的大多数流行语一样,DevOps没有公认的定义。
定义从简单(如这两个定义)到复杂(可以持续一整本书)不等。
DevOps是文化理念,实践和应用快速交付工具的组合–AWS
DevOps是组织内部的跨学科协作,旨在确保软件新版本的自动化持续交付,同时确保其正确性和可靠性 –L Leite
与其尝试定义DevOps,不如让我们了解软件开发如何演变为DevOps。
几十年前,软件开发以Waterfall模型为中心。
Waterfall模型开发,与建筑项目类似-例如,建立一座令人惊叹的桥梁。
你将分多个阶段构建软件,这些阶段可以持续几周到几个月不等。
在大多数Waterfall项目中,企业要几个月才能看到应用程序的有效版本。
构建优秀软件的关键要素
在瀑布模型中工作了几十年,我了解到了开发出色软件的一些关键要素:
软件开发是一项涉及多种技能的跨学科工作。
人与人之间的交流对于软件项目的成功至关重要。
在瀑布模型中,我们尝试通过准备有关需求,设计,体系结构和部署的详细文档来增强交流。
但是,一段时间以来,我们了解到
快速获得反馈很重要。开发出色的软件就是要获得快速反馈。
我们是否正在构建符合业务期望的应用程序?
你不能等待几个月才能获得反馈。你可能想快速了解。
如果将其部署到生产环境中,你的应用程序会出现问题吗?
我们越早发现问题,越容易解决。
我们发现,最好的软件团队通常是快速反馈。帮助我们知道是否尽早在做正确的事情。
自动化至关重要。软件开发涉及广泛的活动。手动执行操作速度很慢且容易出错。
在了解了开发出色软件的关键要素之后,让我们看看我们如何演变为敏捷开发和DevOps。
如果通过加强团队之间的沟通,获取快速反馈和引入自动化,敏捷开发是第一步。
敏捷开发将业务团队和开发团队整合为一个团队,该团队致力于以小型迭代(称为Sprints)构建出色的软件。
敏捷开发关注开发周期不是在数周或数,而是在几天甚至一天之内的小需求。
敏捷开发如何增强团队之间的沟通?
敏捷开发使业务团队和开发团队聚集在一起。
在敏捷开发中,业务代表(通常称为产品负责人)经常出现在团队中,团队可以清楚地了解业务目标。
当开发团队对需求的理解不正确并且走错了路时,产品负责人将帮助他们进行课程更正,并保持正确的道路。
结果:团队构建的最终产品是企业想要的东西。
另一个重要因素,是敏捷开发团队具有跨职能的技能:编码技能(前端,API和数据库),测试技能和业务技能。
敏捷开发团队关注哪些自动化领域?
软件产品可能具有多种缺陷:
-
功能缺陷意味着产品无法正常工作。
-
技术缺陷使软件维护困难。例如,代码质量问题。
通常,敏捷开发团队专注于使用自动化来尽早发现技术和功能缺陷。
敏捷开发团队专注于自动化测试。编写出色的单元测试以测试你的方法和类。编写出色的集成测试以测试你的模块和应用程序。敏捷开发团队还广泛关注代码质量–使用诸如SONAR之类的工具来评估应用程序的代码质量。
如果你拥有出色的自动化测试和出色的代码质量检查,是否就足够了?
你可能还希望尽可能经常地运行它们。敏捷开发团队专注于持续集成。提交代码,运行单元测试,自动化测试和代码质量检查。这些都是在持续集成管道中自动执行的。在敏捷开发早期,最受欢迎的CI/CD工具是Jenkins。
敏捷开发如何促进即时反馈?
最重要的因素是,企业无需等待数月即可看到最终产品。在每次版本迭代结束时,都会将该产品演示给所有利益相关者。在优先考虑下一次版本迭代结束时,将采纳所有反馈。结果:团队构建的最终产品是企业想要的东西。
能够立即反馈的另一个重要因素是–持续集成。假设我将一些代码提交到版本控制中,在30分钟内,如果我的代码导致单元测试失败或集成测试失败,我将获得反馈。如果我的代码不符合代码质量标准或在单元测试中没有足够的代码覆盖率,我将获得反馈。
敏捷开发成功了吗?是。当然。通过专注于改善业务与开发团队之间的沟通,并着重于尽早发现各种缺陷,Agile将软件开发提升到了一个新的水平。
但是,出现了新的挑战。
现在,我们慢慢开始转向微服务架构,并且开始构建许多小型API,而不是构建大型整体应用程序。
运维变得更加重要。你每周要进行数百个小型微服务发布,而不是一个月发布一个整体。调试微服务中的问题并了解微服务中发生的事情变得很重要。
是时候在软件开发中使用新的流行语了–DevOps。
DevOps的重点是什么?
DevOps的重点是加强开发与运维团队之间的沟通。
DevOps如何增强团队之间的沟通?
DevOps使运维团队与开发团队更加接近。
DevOps团队关注的自动化领域是什么?
除了敏捷开发的重点领域(持续集成和测试自动化)外,DevOps团队还致力于帮助使运维团队自动化,例如,在服务器上配置软件,部署应用程序以及监视生产环境。一些关键术语是持续部署和基础架构即代码。
持续部署就是要在测试环境上持续部署新版本的软件。在像Google,Facebook这样的更成熟的组织中,Continuous Delivery可帮助将软件连续部署到生产中。
基础设施即代码就是将基础设施视为应用程序代码。你可以使用自动化配置方式创建基础结构(服务器,负载平衡器和数据库)。你将对基础结构进行版本控制-以便可以跟踪。
DevOps如何促进即时反馈?
DevOps将运维和开发团队召集在一起。因为运维和开发都是同一团队的一部分,所以整个团队都了解与运维和开发相关的挑战。
DevOps鼓励将持续集成,持续交付和基础架构作为代码。
尽管我们说敏捷开发和DevOps是使事情变得简单的两个不同的事物,但实际上,对于DevOps的含义没有公认的定义。
我认为敏捷开发和DevOps是两个阶段,可以帮助我们改善构建出色软件。他们不会互相竞争,但是可以一起帮助我们构建出色的软件产品。
就我而言,敏捷开发和DevOps是相辅相成
如果你是团队中的明星开发人员,因此软件问题需要你快速解决。
你要快速创建本地环境。
你要更新单元测试和自动化测试。
你会收到一封电子邮件,指出将进行质量检查。
一些集成测试会自动运行。
你的质量检查小组会收到一封电子邮件,要求你批准。他们进行手动测试并批准。
你的代码将在几分钟内投入生产。
这就是DevOps的故事。
DevOps是软件开发的自然发展。DevOps不仅仅是工具,框架还是自动化。这是所有这些的结合。
DevOps专注于人员,流程和产品。DevOps的“人员”部分是关于文化和树立良好思维模式的,这是一种促进开放式沟通并重视快速反馈的文化,一种重视高质量软件的文化。
敏捷开发帮助弥合了业务团队与开发团队之间的鸿沟。开发团队了解业务的优先级,并与业务合作,以提供最有价值的故事为先。但是,开发团队和运维团队并没有保持一致。
开发团队的目标是将尽可能多的新功能投入生产。
Ops团队的目标是保持生产环境尽可能稳定。
如你所见,如果将产品投入生产很困难,那么开发人员和运维人员就无法保持一致。
DevOps旨在使Dev和Ops团队实现共同目标。
开发团队与运维团队合作,以了解和解决运维难题。Ops团队是Scrum团队的成员,了解开发中的功能。
我们如何才能做到这一点?
打破开发人员和行运维人员之间的隔墙!
开发人员和运维人员结合-选项1
在成熟的DevOps企业中,Dev和Ops是同一Scrum团队的一部分,彼此分担责任。
开发人员和运维人员结合选项2
但是,如果你处在DevOps演进的早期阶段,那么如何才能使Dev和Ops拥有共同的目标并一起工作呢?
-
你可以开始做的一件事就是让开发团队分担运维团队的一些职责。例如,开发团队可以在生产部署后的第一周内负责新版本的发布。这有助于开发团队了解在发布新版本时操作所面临的挑战,并帮助他们团结起来找到更好的解决方案。
-
你可以做的另一件事是让运维团队的代表参与Scrum活动。
-
接下来,你可以使开发团队更清楚地看到运维团队面临的挑战。当你在运维中遇到任何挑战时,请使开发团队成为解决方案团队的一部分。
由于自动化,出现了另一个有趣的选择。通过将基础结构即代码并为开发人员启用预配置,你可以创建操作和开发团队可以理解的通用语言-代码。
此图展示了两个简单的工作流程
让我们分解一下,尝试并理解它们。
让我们从No 2开始-首先是持续部署。
如果你不经常运行测试和代码质量检查,这有什么用?
如果你没有足够频繁地部署软件,部署自动化有什么用?
开发人员将代码提交到版本控制系统后,将立即执行以下步骤:
-
应用程序打包—构建应用程序的可部署版本。
-
应用程序部署-启用新版本的应用程序。
-
给测试团队的电子邮件,用于测试应用程序。
一旦获得测试团队的批准,该应用程序将立即部署到Next Environment。
这称为连续部署。如果你持续部署到生产环境,则称为持续交付。
在过去,我们创建环境并手动部署应用程序。
每次创建服务器时,都需要手动完成。
-
如果需要更新Java版本怎么办?
-
是否需要应用安全补丁?
基础架构即代码—像应用程序代码一样对待基础架构
这是基础架构即代码应理解的一些重要事项
-
基础设施团队专注于增值工作(而不是例行工作)。
-
更少的错误,可以从故障中快速恢复。
-
服务器是一致的(避免配置漂移)。
通常,这些是IaC中的步骤
使用Terraform,你可以预配置服务器和基础架构的部分,例如负载平衡器,数据库,网络配置等。你可以使用使用Packer和AMI等工具预创建镜像来创建服务器(Amazon Machine Image)。
流行的配置管理工具是Chef,Puppet,Ansible和SaltStack。这些旨在在现有服务器上安装和管理软件。
在微服务世界中,可能会使用Java构建一些微服务,使用Python构建一些微服务,以及使用JavaScript构建一些微服务。
不同的微服务将具有不同的构建和部署方式。
这使运维团队的工作变得困难。
我们如何有相同的方式来部署多种类型的应用程序?容器和Docker。
使用Docker,你可以构建微服务的镜像-不管它们的语言如何。你可以在任何基础架构上以相同方式运行这些镜像。
Kubernetes通过帮助协调不同类型的容器并将其部署到集群。
以下是一些重要的DevOps指标。
以下是DevOps的一些最佳做法
如何衡量DevOps实施的成熟度
你如何衡量DevOps实施的成熟度?这里是一些重要的问题。
-
每次提交都会触发自动测试和自动代码质量检查吗?
-
你的代码是否持续交付生产?
-
你有很多可重复使用的模块吗?
-
开发团队可以自我配置环境吗?
-
快速修复生产需要多长时间?
-
自动化测试失败时,构建会失败吗?
-
你有自动NFR测试吗?
-
你是否具有开发和生产环境相同?
-
你是否使用A / B测试?
-
你是否使用金丝雀部署?
-
只需单击一下按钮即可部署?
-
你可以通过单击按钮来回滚吗?
-
你能否通过单击按钮设置和释放基础结构?
-
你是否将IAC和版本控制用于基础架构?
-
团队是否使用集中监控系统?
-
只需单击一个按钮,开发团队就可以访问日志吗?
-
如果生产中出现问题,团队是否会收到警报?
|