DevOps 在公司项目中的实践落地
原文出处:https://www.cnblogs.com/beef/p/7743594.html
ref:
【DevOps】团队敏捷开发系列--开山篇
https://www.cnblogs.com/hyhnet/p/8082390.html
现在DevOps已经成为发展的趋势了,那它又是怎么实现落地的呢?
落实DevOps的指导思想
首先我们还是要回到什么是DevOps,如果大家忘记了可以回到之前再温故一下,包括我总结的DevOps公式。
其实DevOps核心思想就是:“快速交付价值,灵活响应变化”。其基本原则如下:
高效的协作和沟通;
自动化流程和工具;
快速敏捷的开发;
持续交付和部署;
不断学习和创新。
然而这些基本原则又是如何与项目研发息息相关的呢,也就是它们在我们的开发过程中的各个环节是如何体现的?请看下面一张来自《success with enterprise dev-ops - whitepaper》的介绍图:
敏捷管理:一支训练有素的敏捷开发团队是成功实施DevOps的关键。
根据康威定律:软件团队开发的产品是对公司组织架构的反映。
所以根据公司情况调整组织结构是首要条件,它将直接影响到需求、设计和开发阶段的效率、以及沟通的成本。
关于团队的沟通成本在《人月神话》中有个很好的计算公式:沟通成本 = n(n-1)/2,其中n为人数,所以沟通成本将随着组织人员的增加而呈指数级增长。而小而快的敏捷团队如何划分,我将在后面“DevOps的具体实施方法”一节中详细介绍。
持续交付部署:实现应用程序的自动化构建、部署、测试和发布。
通过技术工具,把传统的手工操作转变为自动化流程,这不仅有利于提高产品开发、运维部署的效率,还将减少人为因素引起的失误和事故,提早发现问题并及时地解决问题,这样也保证了产品的质量。下图展示了DevOps自动化的流程:
此图来自我的新书《分布式服务架构:原理、设计与实战》,书中也有具体介绍持续交付部署的细节内容。
IT服务管理:可持续的、高可用的IT服务是保障业务正常的关键要素,它与业务是一个整体。
IT服务管理(ITSM)直接影响产品运营的整个生命周期,传统的IT服务管理(像ITIL)在生产中做的非常好了,但是它对于DevOps来说又显得过于繁琐,所以有必要为DevOps创建一个只关注业务持续性的ITMS,它只需要很少的必要资源来为相应的业务提供服务,ITMS更多地从业务角度考虑了。
注:白话解释下什么是IT服务管理(ITSM),它是传统的“IT管理”转向为“IT服务”为主的一种模式,前者可能更关注具体服务器管理、网络管理和系统软件安装部署等工作;而后者更关注流程的规范化、标准化,明确定义各个流程的目标和范围、成本和效益、运营步骤、关键成功因素和绩效指标、有关人员的责权利,以及各个流程之间的关系等,比如建立线上事故解决流程、服务配置管理流程等;
而光有流程还不够,因为流程主要是IT服务提供方内部使用的,客户对他们并不感兴趣,所以还需将这些流程按需打包成特定的IT服务,然后提供给客户使用,比如在云平台上购买一台虚拟云主机一样。精益管理:建立一个流水线式的IT服务链,打通开发与运维的鸿沟,实现开发运维一体化的敏捷模式。
精益生产主要来源于丰田生产方式 (TPS)的生产哲学,它以降低浪费、提升整体客户价值而闻名,它主要利用优化自动化流程来提高生产率、降低浪费。所以精益生产的精髓是即时制(JIT)和自动化(Jidoka)。
JIT(Just In time):JIT用一句话描述就是消耗最少的必要资源,以正确的数量,生产和运送正确的零件。在这种模式下工作,可以最大程度上降低库存,防止过早或者过度生产。大多数公司更倾向用库存来避免潜在的停线风险,而丰田却反其道而行之。通过减少库存“逼迫”对生产中产生的问题做及时且有效的反应。当然JIT这一模式对解决问题的能力是相当大的考验,在能力不足的情况下,会有相当大的断线风险。
Jidoka(Build in quality):自动化,日语表示为“自働化”,字面含义是自动化,日语里表示为“自動化”,而在丰田TPS系统里,特意给“動”字加上了“人”字旁变成了“働”,换句话说,TPS/精益生产渴望生产的过程控制能像“人”一样智能,在第一时间就异常情况下自动关闭。这种自动停机功能可以防止坏件流入下游,防止机器在错误的生产状态下造成损坏,也可以让人更好的在当前错误状态下进行故障分析。当设备能够做到自动分析故障时,就可以将监管机器的“人”真正解放出来,做到对人力成本的节省。
——来自知乎
下图展示了丰田TPS(Toyota Production System)手册中的精益小屋:
而精益软件开发是精益生产和实践在软件开发领域的应用,总结为如下七条原则:
消除浪费
增强学习
尽量延迟决定
尽快发布
下放权力
嵌入质量
全局优化
精益管理贯穿于整个DevOps阶段,它鼓励主动发现问题,不断的优化流程,从而达到持续交付、快速反馈、降低风险和保障质量的目的。接下来让我们看看DevOps具体的实现方法。
DevOps的思想先进、理念完美,是目前为止我觉得最好的解决方案,不过DevOps最终能够落地,很大程度上还是归功于它有一整套的技术和开源工具。接下来让我们一起看看DevOps想着的技术栈吧。
技术栈
本节内容如果展开的话涉及太多,我将概略地为大家介绍下目前常见的一些开源DevOps技术工具,大家可以根据自己的需求选择使用,当然也可以使用像VSTS(Visual Studio Team Services)这样的集成团队环境。
其中有些内容在我的新书中有详细介绍,如代码仓库管理、虚拟机与容器化、持续集成&持续部署工具Jenkins、配置管理工具SaltStack。
敏捷管理工具
Trello
Teambition
Worktile
Tower
以上工具使用大同小异,选择一款适合自己团队的就好。我们公司主要使用的是Teambition,截张效果图如下:
产品&质量管理
confluence
禅道
Jira
Bugzila
其中confluence和禅道主要是产品的需求、定义、依赖和推广等的全面管理工具;而Jira和Bugzilla是产品的质量管理和监控能力,包括测试用例、缺陷跟踪和质量监控等。目前我们使用Jira较多。
代码仓库管理
Git
Gitlab
Github
Git是一个开源的分布式版本控制系统;Gitlab和Github是用于仓库管理系统的开源项目,它们使用Git作为代码管理工具,并在此基础上搭建起来的web服务。我们主要使用的是Git和Gitlab。
开发流程规范
Git Flow
Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践。Git Flow是一套使用Git进行源代码管理时的一套行为规范和简化部分Git操作的工具。Git Flow模型如下图:
Github Flow
Github Flow是Git Flow的一个更简单的替换方案,它只有一个feature分支和一个master分支,简单而干净。Github Flow模型如下图:
Gitlab Flow
GitHub Flow认为你可以通过合并feature分支直接把代码部署到线上。Gitlab Flow模型如下图:
自动化构建脚本
Gradle
Maven
SBT
ANT
我目前主要使用Gradle和Maven,而Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala。
虚拟机与容器化
VMware
VirtualBox
Vagrant
Docker
VMware和VirtualBox是最常用的虚拟机,支持非常多的平台,而Vagrant是构建在虚拟化技术之上的虚拟机运行环境管理工具。通过Vagrant可以方便实现的对虚拟机的管理,包括建立和删除虚拟机、配置虚拟机运行参数、管理虚拟机运行状态、自动化配置和安装开发环境必须的各类软件、打包和分发虚拟机运行环境等。
Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
持续集成(CI)&持续部署(CD)
Jenkins
Hudson
Travis CI
CircleCI
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能,它的前身为Hudson。
Travis CI 是目前新兴的开源持续集成构建项目,它与jenkins很明显的区别在于采用yaml格式,简洁清新独树一帜。
CircleCI是一个为web应用开发者提供服务的持续集成平台,主要为开发团队提供测试,持续集成,以及代码部署等服务。
自动化测试
Appium
Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。
Selenium
Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Mozilla 和 Firefox 中运行。
Mock测试
Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。这个虚拟的对象就是Mock对象,Mock对象就是真实对象在调试期间的代替品。Java中的Mock框架常用的有EasyMock和Mockito等。
消费者驱动契约测试
契约测试是一种针对外部服务的接口进行的测试,它能够验证服务是否满足消费方期待的契约。当一些消费方通过接口使用某个组件的提供的行为时,它们之间就产生了契约。这个契约包含了对输入和输出的数据结构的期望,性能以及并发性。而PACT是目前比较流的消费者驱动契约测试框架。
自动化运维工具
Ansible
Puppet
Chef
IT运维自动化是指将IT运维中日常的、大量的重复性工作自动化,把过去的手工执行转为自动化操作。自动化是IT运维工作的升华,IT运维自动化不单纯是一个维护过程,更是一个管理的提升过程,是IT运维的最高层次,也是未来的发展趋势。下图为常用自动化运维工具对比:
监控管理工具
Zabbix
Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。
ELK Stack日志分析系统
ELK Stack是开源日志处理平台解决方案,背后的商业公司是Elastic。它由日志采集解析工具 Logstash、基于 Lucene 的全文搜索引擎 Elasticsearch、分析可视化平台 Kibana三部分组成。
云监控(如Amazon CloudWatch)
Amazon CloudWatch 是一项针对 AWS 云资源和在 AWS 上运行的应用程序进行监控的服务。您可以使用 Amazon CloudWatch 收集和跟踪各项指标、收集和监控日志文件、设置警报以及自动应对 AWS 资源的更改
DevOps的思想先进、理念完美,是目前为止我觉得最好的解决方案,不过DevOps最终能够落地,很大程度上还是归功于它有一整套的技术和开源工具。接下来让我们一起看看DevOps想着的技术栈吧。
技术栈
本节内容如果展开的话涉及太多,我将概略地为大家介绍下目前常见的一些开源DevOps技术工具,大家可以根据自己的需求选择使用,当然也可以使用像VSTS(Visual Studio Team Services)这样的集成团队环境。
其中有些内容在我的新书中有详细介绍,如代码仓库管理、虚拟机与容器化、持续集成&持续部署工具Jenkins、配置管理工具SaltStack。
敏捷管理工具
Trello
Teambition
Worktile
Tower
以上工具使用大同小异,选择一款适合自己团队的就好。我们公司主要使用的是Teambition,截张效果图如下:
产品&质量管理
confluence
禅道
Jira
Bugzila
其中confluence和禅道主要是产品的需求、定义、依赖和推广等的全面管理工具;而Jira和Bugzilla是产品的质量管理和监控能力,包括测试用例、缺陷跟踪和质量监控等。目前我们使用Jira较多。
代码仓库管理
Git
Gitlab
Github
Git是一个开源的分布式版本控制系统;Gitlab和Github是用于仓库管理系统的开源项目,它们使用Git作为代码管理工具,并在此基础上搭建起来的web服务。我们主要使用的是Git和Gitlab。
开发流程规范
Git Flow
Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践。Git Flow是一套使用Git进行源代码管理时的一套行为规范和简化部分Git操作的工具。Git Flow模型如下图:
Github Flow
Github Flow是Git Flow的一个更简单的替换方案,它只有一个feature分支和一个master分支,简单而干净。Github Flow模型如下图:
Gitlab Flow
GitHub Flow认为你可以通过合并feature分支直接把代码部署到线上。Gitlab Flow模型如下图:
自动化构建脚本
Gradle
Maven
SBT
ANT
我目前主要使用Gradle和Maven,而Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala。
虚拟机与容器化
VMware
VirtualBox
Vagrant
Docker
VMware和VirtualBox是最常用的虚拟机,支持非常多的平台,而Vagrant是构建在虚拟化技术之上的虚拟机运行环境管理工具。通过Vagrant可以方便实现的对虚拟机的管理,包括建立和删除虚拟机、配置虚拟机运行参数、管理虚拟机运行状态、自动化配置和安装开发环境必须的各类软件、打包和分发虚拟机运行环境等。
Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
持续集成(CI)&持续部署(CD)
Jenkins
Hudson
Travis CI
CircleCI
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能,它的前身为Hudson。
Travis CI 是目前新兴的开源持续集成构建项目,它与jenkins很明显的区别在于采用yaml格式,简洁清新独树一帜。
CircleCI是一个为web应用开发者提供服务的持续集成平台,主要为开发团队提供测试,持续集成,以及代码部署等服务。
自动化测试
Appium
Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。
Selenium
Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Mozilla 和 Firefox 中运行。
Mock测试
Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。这个虚拟的对象就是Mock对象,Mock对象就是真实对象在调试期间的代替品。Java中的Mock框架常用的有EasyMock和Mockito等。
消费者驱动契约测试
契约测试是一种针对外部服务的接口进行的测试,它能够验证服务是否满足消费方期待的契约。当一些消费方通过接口使用某个组件的提供的行为时,它们之间就产生了契约。这个契约包含了对输入和输出的数据结构的期望,性能以及并发性。而PACT是目前比较流的消费者驱动契约测试框架。
自动化运维工具
Ansible
Puppet
Chef
IT运维自动化是指将IT运维中日常的、大量的重复性工作自动化,把过去的手工执行转为自动化操作。自动化是IT运维工作的升华,IT运维自动化不单纯是一个维护过程,更是一个管理的提升过程,是IT运维的最高层次,也是未来的发展趋势。下图为常用自动化运维工具对比:
监控管理工具
Zabbix
Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。
ELK Stack日志分析系统
ELK Stack是开源日志处理平台解决方案,背后的商业公司是Elastic。它由日志采集解析工具 Logstash、基于 Lucene 的全文搜索引擎 Elasticsearch、分析可视化平台 Kibana三部分组成。
云监控(如Amazon CloudWatch)
Amazon CloudWatch 是一项针对 AWS 云资源和在 AWS 上运行的应用程序进行监控的服务。您可以使用 Amazon CloudWatch 收集和跟踪各项指标、收集和监控日志文件、设置警报以及自动应对 AWS 资源的更改
DevOps自动化
全面自动化 —— 部署、 升级、 扩展、 维护、 数据、 测试、 监测、 安全和策略管理。在自动化方面投入巨资,目标是100%的自动化,不考虑低于90%的可能性。
DevOps团队工具
工具名称
工具用途
Docker
虚拟化容器技术,快速构建独立隔离服务
Jenkins
自动化平台,可以配置自动化测试与持续部署
New Relic
应用性能监测
Ansible
自动化(配置管理工具)平台,持续集成与编排
Kubernetes
开源的docker编排工具,可以发布与回滚
JMeter
基于Java的压力测试工具。用于对软件做压力测试
还有很多工具可以使用,这个具体我们后续慢慢讲来。