一.什么是持续交付
让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以发布的状况。它的目标在于让软件的构建、测试与发布变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。
二.对比持续交付和传统交付
传统交付的发布周期可以表示为下图:
传统交付的缺点:
慢交付:在这里,客户在指定需求之后很长时间才收到产品。这导致了不满意的上市时间和客户反馈的延迟。
反馈周期长:反馈周期不仅与客户有关,还与开发人员有关。假设您意外地创建了一个bug,并在uat阶段了解了它。修理你两个月前修过的东西需要多长时间?即使是很小的错误也会耗费数周的时间。
危险的热修复程序:热修复程序通常不能等待完整的uat阶段,因此它们的测试方式往往不同(uat阶段缩短了),或者根本没有测试。
压力:对运营团队来说,无法预测的发布是有压力的。更重要的是,发布周期通常被安排得很紧,这给开发人员和测试人员带来了额外的压力。
为了能够持续地交付产品,而不是将大笔资金花在全天候工作的运营团队上,我们需要自动化。这就是为什么,连续交付就是将传统交付过程的每个阶段都更改为一系列脚本,称为自动部署管道或连续交付管道。
然后,如果不需要手动步骤,我们可以在每次代码更改之后运行该流程,从而不断地将产品交付给用户。
持续交付的优点:
快速交付:开发完成后,客户就可以使用产品,大大缩短了产品上市的时间。请记住,软件只有在用户手中才会带来收入。
快速反馈周期:假设您在代码中创建了一个bug,该bug在同一天投入生产。要花多少时间才能修好你当天工作的东西?可能没有那么多。这与快速回滚策略一起,是保持生产稳定的最佳方法。
低风险的发布:如果您每天都发布,那么这个过程就会变得可重复,因此更加安全。
灵活的发布选项:如果您需要立即发布,那么一切都已经准备好了,因此没有与发布决策相关的额外时间/成本。
不用说,我们可以通过消除所有交付阶段并直接在生产上进行开发来实现所有的好处。然而,这将导致质量下降。实际上,引入连续交付的全部困难在于担心质量会随着取消手工步骤而降低。我们将展示如何以一种安全的方式处理它,交付的产品不断地有更少的bug,并更好地适应客户的需求。
三.怎么实现持续交付
自动化部署管道,它包括如下图所示的三个阶段:
每一步都对应着传统交付过程中的一个阶段,具体如下:
持续集成:检查以确保不同开发人员编写的代码集成在一起
自动化验收测试:这将取代手工qa阶段,并检查开发人员实现的特性是否满足客户的需 求
配置管理:这将取代手工操作阶段——配置环境和部署软件
1.持续集成
持续集成阶段向开发人员提供第一个反馈。它从存储库(git,svn)中检出代码,编译代码,运行单元测试,并验证代码质量。如果任何步骤失败,则停止管道执行,开发人员应该做的第一件事是修复持续集成构建。
2.自动化验收测试
自动化验收测试阶段是和qas一起编写的一组测试,这些测试应该替代手动uat阶段。它作为一个质量检验关来决定一个产品是否准备好发布。如果任何验收测试失败,则停止管道执行,不再运行进一步的步骤。它阻止移动到配置管理阶段,从而阻止发布。
3.配置管理
配置管理阶段负责跟踪和控制软件及其环境中的更改。它涉及准备和安装必要的工具、扩展服务实例的数量及其分布、基础设施清单以及与应用程序部署相关的所有任务。
配置管理是针对在生产环境中手动部署和配置应用程序所带来的问题的解决方案。配置管理工具(如ansible、chef或puppet)支持在版本控制系统中存储配置文件,并跟踪在生产服务器上所做的每个更改。
替代操作(运维)团队手工任务的另一项工作是负责应用程序监视。这通常是通过将运行系统的日志和指标流到一个公共仪表板来完成的,该仪表板由开发人员(或devops团队,如下一节所述)监视。
四.工具
1.docker生态链
docker作为集装箱化的领导者,近年来在软件行业占据了主导地位。它允许在与环境无关的映像中打包应用程序,因此将服务器视为一个资源场,而不是必须为每个应用程序配置的机器。
docker是一个明确选择,因为它非常适合(微)服务世界和持续交付过程。
2.jenkins
jenkins是目前市场上最流行的自动化服务器。它有助于创建连续集成和连续交付管道,通常还有助于创建任何其他自动化的脚本。高度面向插件,它有一个伟大的社区,不断扩展它的新功能。
更重要的是,它允许将管道编写为代码并支持分布式构建环境。
3. ansible
ansible是一个自动化工具,可以帮助进行软件配置、配置管理和应用程序部署。它采用无代理的体系结构,并与docker进行了良好的集成。
4.github
github绝对是所有托管版本控制系统中排名第一的。它提供了一个非常稳定的系统,一个基于web的ui,以及一个公共存储库的免费服务。
尽管如此,任何源代码控制管理服务或工具都可以使用连续交付,无论它是在云中还是自托管的,也无论它是基于git、svn、mercurial或任何其他工具。
五.docker实战
1.docker概述
docker是一个开源项目,旨在帮助使用软件容器进行应用程序部署。以下引用自docker官方页面:
docker容器将一段软件封装在一个完整的文件系统中,该文件系统包含运行所需的一切:代码、运行时、系统工具、系统库——任何可以安装在服务器上的东西。这保证了软件将始终运行相同的,不管它的环境如何。
因此,docker以类似于虚拟化的方式,允许将应用程序打包成可以在任何地方运行的映像。
2.虚拟化和容器化
没有docker,使用硬件虚拟化(通常称为虚拟机)可以实现隔离和其他好处。最流行的解决方案是virtualbox、vmware和parallels。
虚拟机模拟计算机体系结构并提供物理计算机的功能。如果每个应用程序都作为单独的虚拟机映像交付并运行,我们就可以实现应用程序的完全隔离。下图展示了虚拟化的概念:
每个应用程序都作为独立的映像启动,其中包含所有依赖项和客户操作系统。映像由虚拟机监控程序运行,虚拟机监控程序模拟物理计算机体系结构。
许多工具(如vagrant)都广泛支持这种部署方法,并致力于开发和测试环境。然而,虚拟化有三个显著的缺点:
低性能:虚拟机模拟整个计算机体系结构来运行客户操作系统,因此每个操作都有很大的开销。
高资源消耗:模拟需要大量的资源,并且必须为每个应用程序分别执行。这就是为什么在标准的台式机上,只有几个应用程序可以同时运行。
大型映像:每个应用程序都使用完整的操作系统交付,因此在服务器上的部署意味着发送和存储大量数据。
下面的图是docker带来的不同:
3.docker的安装
docker的安装过程快速简单。目前,大多数linux操作系统都支持它,其中很多都提供了专用的二进制文件。mac和windows也得到了本地应用程序的良好支持。
但是,重要的是要理解docker内部是基于linux内核及其细节的,这就是为什么在mac和windows中,它使用虚拟机(mac使用xhyve, windows使用hyv)来运行docker引擎环境。
这里只说在linux上的ubuntu 16.04操作(官方的命令):