研发模式主要有三种,演进顺序为瀑布模式 -> 迭代模式 -> 敏捷模式,现在我们逐一看下
1、瀑布模式
在早期阶段,软件研发普遍采用的是瀑布模式,像我们熟知的 RHEL、Fedora 等系统就是采用瀑布模式
瀑布模式按照预先规划好的研发阶段来推进研发进度。比如,按照需求阶段、设计阶段、开发阶段、测试阶段、发布阶段、运营阶段的顺序串行执行开发任务。每个阶段完美完成之后,才会进入到下一阶段,阶段之间通过文档进行交付。整个过程如下图所示 :
瀑布模式最大的优点是简单。它严格按照研发阶段来推进研发进度,流程清晰,适合按项目交付的应用
- 只有在项目研发的最后阶段才会交付给客户。交付后,如果客户发现问题,变更就会非常困难,代价很大
- 研发周期比较长,很难适应互联网时代对产品快速迭代的诉求
为了解决这两个问题,迭代式研发模式诞生了
2、迭代模式
迭代模式,是一种与瀑布式模式完全相反的开发过程:研发任务被切分为一系列轮次,每一个轮次都是一个迭代,每一次迭代都是一个从设计到实现的完整过程。它不要求每一个阶段的任务都做到最完美,而是先把主要功能搭建起来,然后再通过客户的反馈信息不断完善
迭代开发可以帮助产品改进和把控进度,它的灵活性极大地提升了适应需求变化的能力,克服了高风险、难变更、复用性低的特点
但是,迭代模式的问题在于比较专注于开发过程,很少从项目管理的视角去加速和优化项目开发过程。接下来要讲的敏捷模式,就弥补了这个缺点
3、敏捷模式
敏捷模式把一个大的需求分成多个、可分阶段完成的小迭代,每个迭代交付的都是一个可使用的软件。在开发过程中,软件要一直处于可使用状态
敏捷模式中具有代表性的开发模式,是 Scrum 开发模型。Scrum 开发模型网上有很多介绍,你可以去看看
在敏捷模式中,我们会把一个大的需求拆分成很多小的迭代,这意味着开发过程中会有很多个开发、构建、测试、发布和部署的流程。这种高频度的操作会给研发、运维和测试人员带来很大的工作量,降低了工作效率。为了解决这个问题,CI/CD 技术诞生了
3.1、CI/CD:自动化构建和部署应用
CI/CD 技术通过自动化的手段,来快速执行代码检查、测试、构建、部署等任务,从而提高研发效率,解决敏捷模式带来的弊端
CI/CD 包含了 3 个核心概念
- CI:Continuous Integration,持续集成
- CD:Continuous Delivery,持续交付
- CD:Continuous Deployment,持续部署
CI 容易理解,但两个 CD 很多开发者区分不开。这里,我来详细说说这 3 个核心概念
首先是持续集成。它的含义为:频繁地(一天多次)将开发者的代码合并到主干上。它的流程为:在开发人员完成代码开发,并 push 到 Git 仓库后,CI 工具可以立即对代码进行扫描、(单元)测试和构建,并将结果反馈给开发者。持续集成通过后,会将代码合并到主干
CI 流程可以使应用软件的问题在开发阶段就暴露出来,这会让开发人员交付代码时更有信心。因为 CI 流程内容比较多,而且执行比较频繁,所以 CI 流程需要有自动化工具来支撑
其次是持续交付,它指的是一种能够使软件在较短的循环中可靠发布的软件方法
持续交付在持续集成的基础上,将构建后的产物自动部署在目标环境中。这里的目标环境,可以是测试环境、预发环境或者现网环境
通常来说,持续部署可以自动地将服务部署到测试环境或者预发环境。因为部署到现网环境存在一定的风险,所以如果部署到现网环境,需要手工操作。手工操作的好处是,可以使相关人员评估发布风险,确保发布的正确性
最后是持续部署,持续部署在持续交付的基础上,将经过充分测试的代码自动部署到生产环境,整个流程不再需要相关人员的审核。持续部署强调的是自动化部署,是交付的最高阶段
我们可以借助下面这张图,来了解持续集成、持续交付、持续部署的关系
持续集成、持续交付和持续部署强调的是持续性,也就是能够支持频繁的集成、交付和部署,这离不开自动化工具的支持,离开了这些工具,CI/CD 就不再具有可实施性。持续集成的核心点在代码,持续交付的核心点在可交付的产物,持续部署的核心点在自动部署
3.2、DevOps:研发运维一体化
CI/CD 技术的成熟,加速了 DevOps 这种应用生命周期管理技术的成熟和落地
DevOps(Development 和 Operations 的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序 / 软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。这 3 个部门的相互协作,可以提高软件质量、快速发布软件。如下图所示:
要实现 DevOps,需要一些工具或者流程的支持,CI/CD 可以很好地支持 DevOps 这种软件开发模式,如果没有 CI/CD 自动化的工具和流程,DevOps 就是没有意义的,CI/CD 使得 DevOps 变得可行
听到这里是不是有些晕?你可能想问,DevOps 跟 CI/CD 到底是啥区别呢?其实,这也是困扰很多开发者的问题。这里,我们可以这么理解:DevOps != CI/CD。DevOps 是一组过程、方法和系统的统称,而 CI/CD 只是一种软件构建和发布的技术
DevOps 技术之前一直有,但是落地不好,因为没有一个好的工具来实现 DevOps 的理念。但是随着容器、CI/CD 技术的诞生和成熟,DevOps 变得更加容易落地。也就是说,这几年越来越多的人采用 DevOps 手段来提高研发效能
随着技术的发展,目前已经诞生了很多 Ops 手段,来实现运维和运营的高度自动化。下面,我们就来看看 DevOps 中的四个 Ops 手段:AIOps、ChatOps、GitOps、NoOps
3.2.1、AIOps:智能运维
在 2016 年,Gartner 提出利用 AI 技术的新一代 IT 运维,即 AIOps(智能运维)。通过 AI 手段,来智能化地运维 IT 系统。AIOps 通过搜集海量的运维数据,并利用机器学习算法,智能地定位并修复故障
也就是说,AIOps 在自动化的基础上,增加了智能化,从而进一步推动了 IT 运维自动化,减少了人力成本
随着 IT 基础设施规模和复杂度的倍数增长,企业应用规模、数量的指数级增长,传统的人工 / 自动化运维,已经无法胜任愈加沉重的运维工作,而 AIOps 提供了一个解决方案。在腾讯、阿里等大厂很多团队已经在尝试和使用 AIOps,并享受到了 AIOps 带来的红利。例如,故障告警更加灵敏、准确,一些常见的故障,可以自动修复,无须运维人员介入等
3.2.2、ChatOps:聊着天就把事情给办了
随着企业微信、钉钉等企业内通讯工具的兴起,最近几年出现了一个新的概念 ChatOps
简单来说,ChatOps 就是在一个聊天工具中,发送一条命令给 ChatBot 机器人,然后 ChatBot 会执行预定义的操作。这些操作可以是执行某个工具、调用某个接口等,并返回执行结果
这种新型智能工作方式的优势是什么呢?它可以利用 ChatBot 机器人让团队成员和各项辅助工具连接在一起,以沟通驱动的方式完成工作。ChatOps 可以解决人与人、人与工具、工具与工具之间的信息孤岛,从而提高协作体验和工作效率
ChatOps 的工作流程如下图所示(网图):
开发 / 运维 / 测试人员通过 @聊天窗口中的机器人 Bot 来触发任务,机器人后端会通过 API 接口调用等方式对接不同的系统,完成不同的任务,例如持续集成、测试、发布等工作。机器人可以是我们自己研发的,也可以是开源的。目前,业界有很多流行的机器人可供选择,常用的有 Hubot、Lita、Errbot、StackStorm 等
使用 ChatOps 可以带来以下几点好处
- 友好、便捷:所有的操作均在同一个聊天界面中,通过 @机器人以聊天的方式发送命令,免去了打开不同系统,执行不同操作的繁琐操作,方式更加友好和便捷
- 信息透明:在同一个聊天界面中的所有同事都能够看到其他同事发送的命令,以及命令执行的结果,可以消除沟通壁垒,工作历史有迹可循,团队合作更加顺畅
- 移动友好:可以在移动端向机器人发送命令、执行任务,让移动办公变为可能
- DevOps 文化打造:通过与机器人对话,可以降低项目开发中,各参与人员的理解和使用成本,从而使 DevOps 更容易落地和推广
3.3、一种实现云原生的持续交付模型
GitOps 是一种持续交付的方式。它的核心思想是将应用系统的声明性基础架构(YAML)和应用程序存放在 Git 版本库中。将 Git 作为交付流水线的核心,每个开发人员都可以提交拉取请求(Pull Request),并使用 Git 来加速和简化 Kubernetes 的应用程序部署和运维任务
通过 Git 这样的工具,开发人员可以将精力聚焦在功能开发,而不是软件运维上,以此提高软件的开发效率和迭代速度
使用 GitOps 可以带来很多优点,其中最核心的是:当使用 Git 变更代码时,GitOps 可以自动将这些变更应用到程序的基础架构上。因为整个流程都是自动化的,所以部署时间更短;又因为 Git 代码是可追溯的,所以我们部署的应用也能够稳定且可重现地回滚
我们可以从概念和流程上来理解 GitOps,它有 3 个关键概念
- 声明性容器编排:通过 Kubernetes YAML 格式的资源定义文件,来定义如何部署应用
- 不可变基础设施:基础设施中的每个组件都可以自动的部署,组件在部署完成后,不能发生变更。如果需要变更,则需要重新部署一个新的组件。例如,Kubernetes 中的 Pod 就是一个不可变基础设施
- 连续同步:不断地查看 Git 存储库,将任何状态更改反映到 Kubernetes 集群中
GitOps 的工作流程如下:
首先,开发人员开发完代码后推送到 Git 仓库,触发 CI 流程,CI 流程通过编译构建出 Docker 镜像,并将镜像 push 到 Docker 镜像仓库中。Push 动作会触发一个 push 事件,通过 webhook 的形式通知到 Config Updater 服务,Config Updater 服务会从 webhook 请求中获取最新 push 的镜像名,并更新 Git 仓库中的 Kubernetes YAML 文件
然后,GitOps 的 Deploy Operator 服务,检测到 YAML 文件的变动,会重新从 Git 仓库中提取变更的文件,并将镜像部署到 Kubernetes 集群中。Config Updater 和 Deploy Operator 两个组件需要开发人员设计开发
3.4、NoOps:无运维
NoOps 即无运维,完全自动化的运维。在 NoOps 中不再需要开发人员、运营运维人员的协同,把微服务、低代码、无服务全都结合了起来,开发者在软件生命周期中只需要聚焦业务开发即可,所有的维护都交由云厂商来完成
毫无疑问,NoOps 是运维的终极形态,在我看来它像 DevOps 一样,更多的是一种理念,需要很多的技术和手段来支撑。当前整个运维技术的发展,也是朝着 NoOps 的方向去演进的,例如 GitOps、AIOps 可以使我们尽可能减少运维,Serverless 技术甚至可以使我们免运维。相信未来 NoOps 会像现在的 Serverless 一样,成为一种流行的、可落地的理念
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。