DevOps实践:驭DevOps之力强化技术栈并优化IT运行

主旨

这本书并非坐而论道,而是介绍了DevOps全流程中的许多实践,以及相应工具的运用。虽然随着时代的推移,工具将来可能会过时,但是这些实践的应用和相应的方法是不会过时的,所以对于其中各种实践必要性和相关方法的讲解,是特别值得注意的。作者认为一切皆代码,所以各个章节是围绕代码的生命周期展开的,提到了这些环节的实践:

  • 管理代码
  • 构建代码
  • 测试代码
  • 部署代码
  • 监控代码

DevOps和持续交付简介

DevOps的由来

  • Patrick Debois对于IT行业中开发和运维的相对对立感到十分不爽
  • Patrick于是在2009年在比利时根特市组织了第一场DevOps Days大会,大会延续至今,DevOps Days也被简称为DevOps
  • 敏捷宣言里说“个体和互动高于流程和工具”,DevOps想要强调的就是个体和互动,有助于拆除企业里的部门墙
  • DevOps的另一个核心目标是实现自动化和持续交付。将重复乏味的工作自动化掉,才能把人解放出来互相交流或者做更有价值的事情

DevOps的转变必须要快,多快才算快?

一种观点是,如果存在不必要的等待而导致注意力不集中,就说明你的流程或工具有问题。

一切皆代码

对于DevOps而言,几乎一切都可以用代码来表示:

  • 开发者的源代码
  • 运维人员用于描述基础设施的代码或脚本
  • 质量保证人员编写的自动化测试
  • 产品文档
  • 甚至硬件也可以用软件的形式来表达

管理代码

源代码管理(SCM)系统里最主要流行的就是Git。

分支策略实际上是一个约定,包括一系列规则,描述何时创建分支、如何命名、分支如何使用等。

Git flow有点复杂,Github flow更为简单。

当生产环境的部署节奏比开发团队的交付节奏慢时,会出现需要在已发布的代码里修复缺陷,但主干上海包含不想发布的新功能的问题。有两种处理办法:

  • 创建一个缺陷修复分支并将其部署到生产环境。虽然简单一些,但可能需要多一份测试资源来测试补丁分支。
  • 功能开关。发布包括缺陷修复在内的最新开发版,但将不想发布的新功能暂时关闭。不占用多一份测试资源,但实现起来需要一些额外准备工作。

可以两手准备,在特定环境下使用特定方法。

构建代码

为什么要让构建足够快?

如果构建足够快,开发者就更愿意频繁提交代码,集成问题就可以及早得到暴露。

构建从机(即slave机器)的作用

  • 增加并行构建效率
  • 用于在不同操作系统下构建软件

测试代码

为什么实践中自动化测试难以落地?

有很多因素,但非技术方面的重要原因之一是:

非DevOps的企业中,如果有人不得不处理你的烂代码,那么对于开发人员来说写点烂代码根本无关紧要。

换句话说,开发不用为自己的代码是否能在生产环境上运行负责到底,也就不会关注如何做好自动化测试。

要解决这个问题没有灵丹妙药,必须调动人的积极性,制定实际的目标,一步一步来。

单元测试

  • 如果测试代码前需要复杂的设置和运行时依赖,那么就不再是单元测试了
  • 单元测试必须又快又容易写,才能被开发人员所使用

测试覆盖率

  • 100%的代码覆盖率并不是终极目标,实际过程中要权衡成本和收益比
  • 单元测试要去测试那些真正有价值的逻辑

自动化验收测试

  • Cucumber对于DevOps的意义之一在于尝试将不同的角色结合在一起,以对话的形式去定义功能验收测试,让没有任何编程技巧的人也可以去完成
  • 尽管是用自由文本写成的,但是仍然需要规范化和简化

自动化GUI测试

如果需要在测试环境安装浏览器,可以在桌面环境中包装一个浏览器,或者使用Selenium Grid为测试生成多个浏览器实例。

JavaScript测试

  • Karma - JavaScript语言单元测试
  • Jasmine - 类似于Cucumber的行为测试框架
  • Protractor - AngularJS的测试框架

测试后端集成点

  • 即对于SOAP和REST endpoint的功能性自动化测试
  • 通常性价比较高
  • 后端endpoint相对较稳定,测试的维护成本比GUI测试要小一些
  • soapUI是一个可以用于编写和执行这类测试的工具

部署代码

配置基础操作系统

  • 如果是跨平台的通用技术栈(Java、Python或Ruby等),对操作系统的依赖不那么明显
  • 其它情况下则显然会依赖操作系统,特别是在电信行业里,使用底层混合的软硬件进行集成时

部署工具

  • Salt
  • Ansible
  • Puppet
  • Chef
  • PalletOps

各有异同和适用场景,具体如何使用还得看实际情况。

在客户端节点运行代码的方式上:

  • Puppet主要使用拉模式
  • Ansible使用推模式,通过SSH来推送
  • Salt使用推模式,通过消息队列来推送

用Docker来做部署

  • Docker最吸引人之处是可用来创建可重用的容器,应用在开发、测试与生产环境中
  • 基于Docker构建大型服务器集群的解决方案:
    • Docker Swarm
    • Kubernetes

监控代码

Nagios

Nagios有两种不同类型的检查方式:主动检查与被动检查。

其他监控与统计工具

  • Munin
  • Ganglia
  • Graphite

日志处理

  • Log4j
  • ELK
powered by Gitbook最后更新于: 2018-06-03 15:18:35

results matching ""

    No results matching ""