敏捷:你能区分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 ...
随机推荐
- scrapy抓取中国新闻网新闻
目标说明 利用scrapy抓取中新网新闻,关于自然灾害滑坡的全部国内新闻:要求主题为滑坡类新闻,包含灾害造成的经济损失等相关内容,并结合textrank算法,得到每篇新闻的关键词,便于后续文本挖掘分析 ...
- 数据表与简单java类映射转换
简单的Java类的定义来源于数据表的结构, 例如:雇员信息表.部门信息表描述的就是雇员或部门的信息, 在实际的开发之中,数据表和简单java类之间的映射关系如下: 1. 数据实体表设计 = 类的定义: ...
- 测试访问apiserver状态
目录 前言 创建admin证书和私钥 分发kubeconfig文件 检查集群信息 授权kube-apiserver访问kubelet API的权限 前言 到这里,ETCD集群.kube-nginx + ...
- NetScaler内网外网ip映射的配置
- 【Python成长之路】从零学GUI -- 制作智能聊天机器人
[写在前面] 鹏哥:最近老惹小燕同学不开心,结果都没人陪我聊天了.哎,好无聊呀! 肥宅男:女朋友什么的最无聊了,还没我的图灵机器人好玩. 鹏哥:图灵?好巧,和我部门同名. [效果如下] [实现过程] ...
- 3Sum Time Limit Exceeded HashMap 优化过程
昨晚,在做leetcode上的3Sum题目时,感觉这道题目和2Sum很像,当时解决2Sum时,思路如下: 用HashMap的key存储 num[i],value存储下标 i,之后在遍历数组num时,判 ...
- springboot+mybatis sql 打印在控制台
第一种方法 在mybatis文件夹下新建mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ? ...
- 使用Python进行防病毒免杀
很多渗透工具都提供了权限维持的能力,如Metasploit.Empire和Cobalt Strike,但是都会被防病毒软件检测到这种恶意行为.在探讨一个权限维持技巧的时候,似乎越来越多的人关注的是,这 ...
- NSURLSession使用(整理版)
NSURLSession使用 1.NSURLSession诞生于2013年,但其在前几年一直生活在NSURLConnection的阴影下,直到iOS9的出现,NSURLConnection被官方宣布弃 ...
- iOS 弹窗alertView使用详解
转自:http://blog.it985.com/4321.html alertView是iOS自带的弹窗通知框,我们来看下默认样式的效果图 下面直接上代码 1 2 3 4 5 - (void)del ...