在我们开始下面的讨论之前,首先通过一张总图来了解一下不同的工具,在DevOps生命周期中所处的位置。
DevOps生命周期阶段
我敢断言长期从事开发工作的您,一定对上述图片并不陌生。那么,这是否意味着您能够自如地使用各个阶段的各种工具,而不会碰到任何问题呢?
本文将通过引导您遍历DevOps生命周期中的各个阶段,并向您介绍如何综合使用多种DevOps工具,来解决各种现实问题。总的说来,我们在采用DevOps模式进行软件与应用程序开发时,通常会经历如下五个不同的阶段:
- 持续开发
- 持续测试
- 持续集成
- 持续部署
- 持续监控
1.持续开发
此阶段涉及到对于软件应用程序基本功能的计划与编码。虽然对于计划而言,并没有什么可选的工具,但是可用于代码维护的工具却有不少。
通常情况下,项目的实现目标是在计划阶段被确定的。而当项目组成员开始着手编写代码时,就进入了所谓的编码阶段。
程序代码可以用任何一种语言来编写,但是我们需要配备相应的版本控制工具予以维护。如今,在此类持续开发的DevOps工具中,受用户欢迎的莫过于:Git、SVN、Mercurial、CVS和JIRA了。
那么,您是否真正理解保留代码主要版本的重要性呢?让我们从如下两个方面来讨论它对于开发与运营的影响吧:
- 只有各种版本(特别是存储在中央存储库中)得到了管控,我们才能确保统一的可信代码来源。在此基础上,所有的开发人员都可以针对最新提交的代码开展协作。同时,在计划发布最新版本时,运营人员可以确保访问到一致的代码。
- 在发布过程中,如果出现各种意外,或是发现程序代码中存在着严重的缺陷,以及功能性故障,那么运营人员就能够从容且快速地回滚或恢复到,先前部署过的、已处于稳定状态的代码版本上。
目前,大家普遍认可的工具是Git和GitHub(https://dzone.com/articles/git-vs-github-demystifying-the-differences)。其中,Git允许开发人员在分布式的VCS(版本控制系统)上开展彼此协作。
另外,由于并不依赖于中心服务器,因此运营人员可以从远程位置,对存储库进行各种拉和推式的操作。此处用于维护代码的中央存储库,便是GitHub。可见,Git可谓是世界领先的版本控制系统之一。
2.持续测试
众所周知,开发好的代码是不能够直接部署或发布到生产系统上的。我们应当充分测试代码的潜在错误和性能瓶颈。
通常,执行测试的方式有两种:效率低下的手动测试和高效快捷的自动化测试。如今业界普遍使用的便是自动化的方式,其中具有代表性的包括:Selenium、TestNG、JUnit/NUnit等工具,它们可以自动执行各种用户定义的测试用例。下面我们来看看此类工具的基本特点:
- 自动化测试节省了手动执行各类测试的大量时间、精力和成本。
- 此外,生成报告是它们的一大优势。通过评估测试套件中有哪些测试用例失败了,运营人员能够更直观地执行各项任务。
- 此类测试也可以安排在预先指定的时刻被执行。
显然,我们应该在DevOps生命周期中不断尝试各种工具,形成持续测试阶段的习惯。如果您要问哪一款是我的最爱?我会告诉你:我会将它们组合起来使用。例如:我会用Selenium进行自动化测试,由TestNG生成报告,进而使用Jenkins触发持续集成。
3.持续集成
这个阶段可谓DevOps最为出彩的部分。它在第一次发布过程中,就发挥了重要的作用。它能够最大限度地促进持续集成工具与配置管理工具的联合部署。
毫无疑问,如今市面上最受欢迎的持续集成工具便是Jenkins。当然,其他流行的CI工具还是Bamboo和Hudson。
持续集成工具的主要功效在于:它能够通过协调其他DevOps生命周期阶段的自动化工具,将整个DevOps结构完整地保持在一起。也就是说:无论是持续开发、测试或部署工具,还是持续监视工具,或是持续集成工具,都可以与CI工具全面集成。
- 在与Git/SVN集成后,Jenkins可以自动化地安排诸如:从共享存储库中提取代码之类的作业,并使其为构建和测试做好准备(即持续开发)。Jenkins可以被设置为在某个预定的时刻,或是有提交被推送到中央存储库时,触发构建作业。
- 与Selenium等测试工具集成后,我们可以实现持续测试。通常,我们可以使用Maven/Ant/Gradle之类的工具,来对已开发的代码进行构建。此后,Selenium可以通过创建一组测试用例,以及逐个执行这些测试用例,来自动执行各种代码。在整个过程中,Jenkins/Hudson/Bamboo的角色就是自动化计划。
- 与持续部署工具集成后,Jenkins/Hudson/Bamboo可以通过配置管理,以及容器化工具来触发部署计划。
- 另外,Jenkins/Hudson可以与Splunk、ELK、Nagios或NewRelic等监控工具相集成,进而对那些已部署的服务器状态和性能提供持续监控。
4.持续部署
在讨论了从头开始构建代码的工具、以及测试类工具之后,我们现在来一起看看配置管理工具或容器化工具。这两套工具都有助于在DevOps中实现持续部署(CD)。实际上,持续部署是软件项目的实际落地阶段。
目前,配置管理工具具有如下特点:
- 通常,配置管理需要在应用程序的功能需求和性能中,建立和维护一致性的行为。简而言之,它是将部署发布到服务器上,调度所有服务器上的更新,以及保持所有服务器上一致性配置的行为。
- 业界常用的此类工具有:Puppet、Chef、Ansible、以及SaltStack,其中最好的当属Puppet。这些工具都是基于主-从(master-slave)架构的。当有新的部署被发送到主服务器时,这台主服务器负责在所有从服务器之间复制此类变更。
下面我们看看容器化工具:
作为一套工具集,容器化工具可以协助运营人员在开发、测试和部署应用程序的环境中,保持一致性。通过对那些在开发/测试/阶段性环境中频繁使用到的相同依赖项和程序包进行打包与复制,容器化工具大幅消除了生产环境中各种错误与故障的可能。
Docker是最早也是久负盛名的容器化工具之一。过去,由于开发人员使用到了各种虚拟机与服务器,因此他们必须通过手动管理,才能保持生产环境状态的一致性。如今,有了Docker容器的协助,大家能够轻松地实现一致性的自动化保持。
近年来,许多云端应用的解决方案,都开始为容器服务提供支持了。其中,Amazon ECS、Azure容器服务和Google容器引擎,都能够对Docker容器提供原生的云服务支持。这也就是Docker能够广为普及的原因之一。当然,其他类型的容器化工具还有:Vagrant。
5.持续监控
如果我们不对应用程序的性能进行监视,那么开发和部署应用还有什么意义呢?就算是再全面的测试,也难免疏漏掉一些潜在的错误或性能问题,因此,持续监控与应用开发同等重要。
目前,属于此阶段的流行监控工具有:Splunk、ELK Stack、Nagios,Sensu、NewRelic。它们与Jenkins结合使用,可以让运营人员达到持续监控的目的。总的说来,持续监控工具的必要性在于如下两个方面:
- 由于程序的缺陷会给服务提供方造成财务上的损失,因此我们需要通过持续监控,来最大程度地减少功能性错误所出现的频率和带来的后果。
- 监控工具可以在用户普遍碰到故障,并产生不良使用体验之前,及时报告故障或服务水平的骤降。
Splunk和ELK堆栈是该领域的两大工具,它们之间有着竞争关系。它们虽然能够提供几乎相近的功能,但是具体提供的方式却不尽相同。
Splunk是一款非常容易上手的商业工具。而ELK堆栈则是由ElasticSearch、LogStash和Kibana三种开源工具组合而成。虽然可以免费使用,但是ELK设置起来却不像Splunk那么容易。我建议您亲自试用一下这两款工具,以选择更适合自己项目的一款。
原文标题:How To Combine DevOps Tools Together To Solve Our Problems,作者:Sahiti Kappagantula