敏捷:你能区分DevOps中的“集成、部署、交付、上线、发布”吗?
在DevOps中,你可能经常会听到类似这样的一些话:
功能还没集成进来。
功能还没部署上去。
功能还没交付。
功能还没上线。
功能还没发布。
请问,以上“集成”、“部署”、 “交付”、“上线”、“发布”这几个概念,表达的是同一个意思吗?如果不是,它们有什么区别呢?
我相信大多数人都会为此而迷茫,本人也常常被这几个术语搞晕。
也许你会说,上面的例子太简单,难于判断。好吧,下面再给你一些更多的例子(均来自DOM【DevOps Master,简称DOM】认证课程的权威教材):
还要再花几天才能把这个新版本发布到UAT环境中。
上次发布新版本到生产环境时,你花掉了整个周末的时间。
一行代码的改动需要花多长时间才能部署上线。
每次提交代码都可能产生一个可发布的版本。
很多公司都会在一天内发布很多次。
遵循极限编程的座右铭:如果它令你很受伤,那么就做更多的练习(If it hurts, do it more often)。合乎逻辑的极限就是每当有版本通过自动化测试之后,就将其部署到生产环境中。这种技术叫做“持续部署”,Timothy Fitz发明的一个术语。
持续交付指的是应用程序的构建、部署、测试和发布的自动化流程。
由良好的金丝雀发布系统提供的这层安全网让持续部署的风险甚至更小。
有些人反对持续部署,在直觉上,这么做的风险太高。但如前所述,越频繁的发布会让发布风险越低。
根据我们的经验,做这件事的最佳方法就是尽可能频繁地发布(即持续交付)。
持续交付目标是让应用程序保持在可发布状态。
对于组织来说,持续交付不仅仅是一种部署方法。
现在,你是否能区分开“集成”、“部署”、“交付”、“上线”、“发布”这几个概念了呢?
一头雾水!对,至少我自己仍然还不明白它们的区别。为此,我查阅了一些资料,但仍然不得解。网上的各种文章里有各种不同的解释,但要么是局限在特定的上下文环境中,要么是混淆使用,总是经不起推敲。
造成以上的混乱,我觉得可能是缺少对上述术语的标准定义和准确的描述。
怎样才能不被“绕晕”?我在不断的思考,也与一些同行探讨过,甚至曾经尝试使用表格的方式,从这几个术语所代表的活动操作执行者、执行时间、执行对象、执行环境、执行方法/方式、产出物、接收者(受众)等多个维度进行对比和区别,但最后又成功的把自己“绕”晕了。
在第五空间学习中心的DevOps Master课堂上,受许峰老师关于DoD(Done of Definition,简称DoD,指完成的定义)的启发,我觉得这些术语都代表了一种活动,活动之间会存在某种联系或依赖,所以下面尝试从DoD的角度(用下游的活动来确认上游活动是否真正完成)来解释和区分下这些术语。
集成(Integrate)
定义:将组成部分(部件)收集、归拢,并建立它们之间的联系或依赖关系,构建形成一个整体。
DoD:通过验证(验收)测试,确认集成的结果是正确的。
说明:为了验证集成的结果是正确的,需要对它(集成的结果)进行验证(验收)测试,而为了做验证(验收),需要将它(集成的结果)部署到一个环境中。但验证(验收)测试、部署,这些活动并不是集成,它们只是为了验证集成达到了期望的结果。如果你能保证集成没有问题,那么可以不做部署和验收测试这2个动作。
特征:将分散的东西合并到一起,形成一个整体。
举例:多个单元代码通过集成,形成一个组件。多个组件或模块通过集成,形成一个系统。多个系统通过集成,形成一个整体解决方案。
部署(Deploy)
定义:安装、配置(如有)。
DoD:通过验证(验收)测试,确认部署的结果是正确的(成功部署)。
说明:为了验证部署的结果是正确的,需要对它(部署的结果)进行验证(验收)测试。但验证(验收)测试并不是部署,它只是为了验证部署达到了期望的结果。如果你能保证部署没有问题,那么可以不做验收测试这个动作。
特征:将软件“放置”到某个环境中。
举例:部署人员将测试版本部署测试环境。将某个版本部署到试运行环境。将正式版本部署到生产环境。将一个模块部署到系统中。
交付(Delivery)
定义:交给、付出、移交,指物(如软件安装包的光盘)或权(软件的管理权、使用权、所有权等)在人与人之间的转移、传递或接管。
DoD:接收方确认收到(如签收、同意)。
说明:接收方可能会对收到的物或权进行验收测试,然后才签收。但验收测试、签收并不是交付,它只是为了验证交付的东西是期望的东西,它们是交付的下游动作。如果能保证交付物没有问题,那么可以不做验收测试、签收这样的动作。
特征:交付物或权的拥有者发生了“转移”。
举例:开发人员将测试版本交付給了测试人员。测试人员将正式版本交付给了运维人员。测试人员错误的将测试版本交付给了运维人员。IT团队将系统交付给了业务部。某公司将软件产品交付给了零售商。商店将软件光盘交付给了用户。这次只交付了一个模块。
上线(Go-live / Ship)
定义:上到生成线,即部署到生产线上(生成环境中)
DoD:在生产环境中可以看到,并可以使用。
说明:上线后,可以使用系统,也可以不使用系统。如果使用系统,开始创造业务价值,那么也叫投产(即投产=上线+使用系统)。如果上线后,不使用系统,那么表示系统还没有“开工”,它并不影响上线这个动作。“使用系统”这个动作是上线后的下游活动,它不是“上线”活动的一部分。
特征:一定是部署到生成环境中(不是其它环境),即生产线上。上线 = 在生产环境上的部署。
举例:IT部门上线了一个演示版。正式版刚刚上线,还没有用户访问。某系统上线了半年,还没有投产,某系统刚上线1个月,公司业绩就得到了大幅提升。
发布(Release)
定义:将集成(构建)出来那个整体(发布对象),打上一个发布标签,提供出来,受众可以获得。
DoD:提供出来,受众可以获取到。
说明:发布的版本未必是正式版,比如发布测试版(如Beta版)、试用版、演示版。发布之后,受众可以获得软件,但不一定就使用它。发布的软件可以存储在VCS(版本控制系统)中或制品库中,也可以存储在光盘等介质上。受众获得软件之后的下游动作,不一定是部署,也可能是其他动作(如交付或其他)。如:
发布测试版-->部署到测试环境-->交付给测试人员做验收测试。
发布正式版-->部署到生产环境-->交付给用户使用。
发布正式版产品(如windows安装盘)-->(售卖)交付给用户 --> 部署 -->上线使用。
特征:发布物有(标签)标识,提供出来可以获得。
举例:开发人员发布了一个测试版。开发团队在每个月都会发布一个演化版。某产品发布了新的版本,用户需要重新购买后,才能部署升级。某云平台发布了新的版本,不需要用户部署就可以使用新的功能。本次版本发布了,但没有人使用。
按照以上的定义,那么开头的那段话,就可以这样来解读,做出区分:
功能还没集成进来 --> 功能还没有被合并到一起,没有形成一个整体。
功能还没部署上去 --> 功能还没有安装、配置到指定的环境中。
功能还没交付 --> 功能还没有“转移”给使用者。
功能还没上线 --> 功能还没有部署在生成环境。
功能还没发布 --> 功能还没有提供出来,不可以获得。
至于它们的依赖关系,即谁先谁后,除了集成是首先要完成的,其它几个活动没有固定的依赖关系,它们的先后顺序需要根据具体的应用场景,例如:
场景1
某乙方公司为甲方公司开发了一个web应用,需部署到生产环境,再发布给甲方公司,交付给使用部门(用户),使用部门才能投产使用(上线),那么它们的先后顺序就是:
集成—>部署—>发布—>交付—>上线。
场景2
A公司开发了一个商用软件,发布到网上,B公司通过购买获得,由A或B公司的技术员将软件部署到B公司的生产环境,交给B公司的使用部门(用户),使用部门才能投产使用(即上线),那么它们的先后顺序就是:
集成—>发布—>部署—>交付—>上线。
场景3
早年,微软发布了Window XP(存储在光盘中),交付给用户,用户再部署到生产环境,然后投产使用(上线)。现在的很多单体软件,大多也是这样的流程。那么它们的先后顺序就是:
集成—>发布—>交付—>部署—>上线。
场景4
A公司开发了一个SaaS应用,部署到生产环境,交付给B公司,B公司再加入自己公司的基础数据后上线了该SaaS应用,发布给使用部门(用户)使用,那么它们的先后顺序就是:
集成—>部署—>交付—>上线—>发布。
还有更多场景,就不列举了。
通过以上分析,你对“集成”、“部署”、“上线”、“交付”、“发布”的概念的理解是否清晰了?如果还不清晰,请再读一遍。
作者介绍:
王映红:专注于软件质量及过程改进的咨询师和技术顾问,超过20年的IT行业经验。是PMI组织认定的PMPer,国家信息系统项目管理师,TMMi Professional专家,持有ISTQB AM,Scrum敏捷教练CSP、CSM、CSD等认证,熟悉PMBOK、TMMi、TPS、DevOps、Scrum、Agile、Lean、ITSM、ITIL、COBIT、CMMI等领域知识。。
敏捷:你能区分DevOps中的“集成、部署、交付、上线、发布”吗?的更多相关文章
- [dotnet core]落地微服务特色的DevOps管道,持续集成/部署到kubernetes。
目录 前言 目标 工具 - 最小的学习成本 方案 - 愿景 1. 持续集成 - CI 2. 持续部署 - CD 部署环境 1. 部署gitlab-runner 2. 注册gitlab-runner 搭 ...
- 如何在DevOps中实施连续测试
在过去的十年中,对软件开发的需求已急剧发展.软件已成为公司获得竞争优势的关键优势,特别是如果您的公司属于SaaS范畴.通过在SDLC中实施瀑布等传统流程,组织现在正在向敏捷过渡,以便以更快的速度在市场 ...
- 研发过程及工具支撑 DevOps 工具链集成
https://mp.weixin.qq.com/s/NYm63nkCymIV3DbL4O01dg 腾讯重新定义敏捷 |Q推荐 小智 InfoQ 2020-09-03 敏捷开发奠基人 Robert C ...
- 如何将Azure DevOps中的代码发布到Azure App Service中
标题:如何将Azure DevOps中的代码发布到Azure App Service中 作者:Lamond Lu 背景 最近做了几个项目一直在用Azure DevOps和Azure App Servi ...
- Jenkins自动化构建系列:01敏捷开发、自动化构建与持续集成
<SVN与TortoiseSVN实战系列>已写完,今天新开一个<Jenkins自动化构建系列>,上周听了Bob Jiang老师的Agile1001公开课,一直想写个总结,这篇关 ...
- Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成--部署方案优化 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个 ...
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- Atitit.mybatis的测试 以及spring与mybatis在本项目中的集成配置说明
Atitit.mybatis的测试 以及spring与mybatis在本项目中的集成配置说明 1.1. Mybatis invoke1 1.2. Spring的数据源配置2 1.3. Mybatis ...
- 在Windows系统中安装集成的PHP开发环境
原文:在Windows系统中安装集成的PHP开发环境 刚想学php的,又不会配置复杂php的环境,可以使用集成的,目前网上提供常用的PHP集成环境主要有AppServ.phpStudy.WAMP和XA ...
随机推荐
- 01_Numpy基本使用
1.Numpy读取txt/csv文件 读取数据 import numpy as np # numpy打开本地txt文件 world_alcohol = np.genfromtxt("D:\\ ...
- 20190908write from memory
JavaScript_Chapter1 文档名:first.js document.write("你好,今天天气凉爽"); 文档名:js_demo1.js /*1.定义js的变量语 ...
- CCNA 之 六 路由协议 二 EIGRP
EIGRP(Enhanced IGRP) 增强型内部网关路由协议 注意:这是cisco私有协议:也就是说,该协议只能运行在思科的设备上,如果有其他的厂家的设备,则不能保证能运行此协议: EIGRP的特 ...
- centos7安装fail2ban
fail2ban是一款非常实用的安全软件,通过监视系统日志,设置错误登陆次数,可阻挡暴力密码攻击. 1.安装epelyum install epel-release -y 2.安装fail2banyu ...
- unity3D 游戏物体同时绑定单击、双击事件
前言 在unity中我们常用的获取鼠标点击的方法有 在3D场景中,一般用在Update方法中,每一帧调用 void Update(){ )){ Debug.log("鼠标左键点击" ...
- idea 使用下Java JDK安装
下载idea 百度云: 链接:https://pan.baidu.com/s/1pmDTH-W1_BhSYJAlcAvljQ 提取码:sgmk 下载Java1.8(jdk-8u181 ...
- Apache ServiceComb 开源两周年,聊聊其与微服务的前世今生
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- luogu P2863 [USACO06JAN]牛的舞会The Cow Prom |Tarjan
题目描述 The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their ...
- 2018 ACM/ICPC 南京 I题 Magic Potion
题解:最大流板题:增加两个源点,一个汇点.第一个源点到第二个源点连边,权为K,然后第一个源点再连其他点(英雄点)边权各为1,然后英雄和怪物之间按照所给连边(边权为1). 每个怪物连终点,边权为1: 参 ...
- Spring源码加载BeanDefinition过程
本文主要讲解Spring加载xml配置文件的方式,跟踪加载BeanDefinition的全过程. 源码分析 源码的入口 ClassPathXmlApplicationContext构造函数 new C ...