敏捷软件开发实践-Release Process/Release Plan(转)
介绍:
因为我们的开发周期是迭代进行的,以Sprint为单位,我们每个 Sprint如何去和客户说我们的成果呢,那么我就需要Demo和release一些新功能,或者一些bug fixing。Demo我这里不讨论了, 大体上就是部署都服务器上然后运行下给meeting的所有人看下,我们这里主要讨论和发布(release)有关的话题。
实现方式:
话题1:我们如何让发布者知道我们这个Sprint做的功能?因为就像jdk一样,它的每次大的release和小的release都有一些评注来说明他们这次发布有哪些功能,或者哪些修正,我们一样,我们的做法是:
在每个Sprint的结束日,如果对项目有任何变更(功能改变/修正) ,都会在项目中加一个release note.
具体的做法是:我们采用了maven-site-plugin,然后每次我们都会更新site folder,在site.xml中加一个条目到"Release Notes"中:

然后我们加一个apt文件,并且在其中加上release notes

现在我们用mvn site,就可以显示这些我们写入的release notes 了。
话题2:选择合理的release plan
我 们何时去release artifact,这是一个很困难的问题。也许有人想简单了,这不就是把版本号升级下,然后build一下不就完事了么?你差的远呢。 因为你要发布一个项目,不是操作那么简单,你必须对于这个项目的质量有很严格的把关,也就是说你要确保它的正确性,所以我们必须先把产品在某些环境上做 Regression ,如果Regression没问题,我们还要往更高层的环境上做Regression ,直到几个环境的Regression 都没问题了,我们才可以放心大胆的去Release. 具体说,我们有4套环境,分别是Dev, DevInt,QA ,Production,我们必须一层层往上走,都没问题了,我们才可以最后的Release并且发布都Production环境中。那么问题来了,因为 Release要动代码仓库,而我们的开发是迭代进行的并且是时刻不停的,如果Release团队发布项目时候开发人员又对同一个仓库提交了代码,就会导 致代码的不一致性导致发布失败。我们现在也没有严格的code freeze制度,因为这种制度多半是在瀑布模型中的,我们的开发不能停,那么如何选择恰当的Release时间点呢?这就是Release Plan要解决的问题。
这个问题很复杂,当时我应邀去设计Release Plan时候,我足足想了2天才拿出一个合理的方案,这里毫无保留的共享下,具体结构如下:

这张图中,黄色的状态条代表了开发团队,绿色的状态条代表了测试团队,在每个Sprint中,我吧10天分成了N+1到N+10,其中N代表在第N个Sprint,蓝色文字代表开发团队的动作,紫色文字代表测试团队的动作,红色文字代表release的人的动作。
所 以从上图不难发现,对于开发团队来说,他们的主要开发日期是从(N+3)到(N+9),一共7天,这七天他们做开发,所以会去碰代码仓库,而对于前2天 (N+1),(N+2)和最后一天(N+10),他们都是做一些和代码无关的事情,所以不会去影响到代码仓库。所以我的建议是,让release的人在 Dev和DevInt上做release和Regression的时间控制在(N+1)和(N+2),因为这两天代码仓库的稳定性是可以保证的,然后当开 发人员从N+3开始提交代码后,releaser做QA和Production环境的release和regression,这样不会影响开发团队提交代 码。
风险和经验分享:
其实最大的风险是对于开发团队,万一API或者UX Spec不是很明确,或者不稳定,这样他们的开发时间就会推迟,也许不一定从(N+3)开始了,对于这些情况,我的建议是,如果在(N+1)天遇到了这些 各种开发的不利因素,那么尽可能在(N+3)之前全部解决,如果能解决,那么最好,如果不能解决,那么scrum master可以砍掉一些story,这样至少可以保证开发团队的按时交付。
还有,就是万一release失败了怎么处理?我的建议是:如 果release或者regression失败了,那么代码会返回到开发团队的手里,然后变成一个urgent fix 的活动。如果开发团队足够给力,他们可以在N+1就解决了,那么万事大吉,如果到N+2才解决,那么开发团队就要推迟一天开发,从N+4到N+9,这就需 要他们适当提高效率,事实上我们在工作量预估时候也都加了很多buffer时间。如果到N+3了还没解决,那么releaser就停止release,并 且宣告N-1迭代的release 失败,然后等2星期再进行新一轮的release. 只有这样,才能保证整个流程的顺畅。
总结:
Release是一个非常重要的步骤,我们必须把好这一关。
(1)Release的过程我们可以用release插件并且加好足够详细的notes方便以后去追踪项目的演化。
(2)设计一个非常行之有效的release plan非常重要,关键立足点是各种角色之间要不交叉,不相互block,没有plan的release会让项目弄的一团糟。
本文出自 “平行线的凝聚” 博客,http://supercharles888.blog.51cto.com/609344/1262090
敏捷软件开发实践-Release Process/Release Plan(转)的更多相关文章
- 敏捷软件开发实践-Code Review Process(转)
介绍: 在敏捷软件开发中,从代码的产生速度上来看,要比 传统Waterfall产生速度高很多.因为我们把时间安排的更加紧凑了.那么这么多的代码,如何能保证这些代码质量呢?很多人可能直接想到静态代码检测 ...
- 敏捷软件开发实践-Sprint Retrospective Meeting(转)
介绍: 在敏捷开发模式中,Sprint Retrospective Meeting 也是一个必不可少的环节,它通常发生在每个Sprint的结尾,其主要作用是对于当前的迭代周期做一个阶段性的总结,包括好 ...
- 敏捷软件开发:原则、模式与实践——第14章 使用UML
第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...
- 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则
第10章 LSP:Liskov替换原则 Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...
- 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则
第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...
- 【Scrum】-NO.40.EBook.1.Scrum.1.001-【敏捷软件开发:原则、模式与实践】- Scrum
1.0.0 Summary Tittle:[Scrum]-NO.40.EBook.1.Scrum.1.001-[敏捷软件开发:原则.模式与实践]- Scrum Style:DesignPattern ...
- 《敏捷软件开发-原则、方法与实践》-Robert C. Martin读书笔记(转)
Review of Agile Software Development: Principles, Patterns, and Practices 本书主要包含4部分内容,这些内容对于今天的软件工程师 ...
- 敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述
第13章 写给C#程序员的UML概述 UML包含3类主要的图示.静态图(static diagram)描述了类.对象.数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构.动态图(dy ...
随机推荐
- 使用select处理任意数目个客户的单进程程序
改写http://www.cnblogs.com/nufangrensheng/p/3587962.html中的TCP回射服务器程序,把它重写成使用select来处理任意数目个客户的单进程程序,而不是 ...
- MyEclipse中出现Address already in use:JVM_Bind:8080
今天在搭建环境,跑以前的一个项目时,出现了Address already in use 的错误,这显然是tomcat的端口号被占用了,我的机子上安装了appache和appache Tomcat: 我 ...
- Android获取手机位置代码实现
1.项目Src下创建...service包,然后新建GPSService类 package com.zebra.mobilesafe.service; import java.io.IOExcepti ...
- 怎样线程安全地遍历List:Vector、CopyOnWriteArrayList
遍历List的多种方式 在讲怎样线程安全地遍历List之前,先看看通常我们遍历一个List会採用哪些方式. 方式一: for(int i = 0; i < list.size(); i++) { ...
- Mybatis 通过扫描 自动生成别名
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...
- centos6.5下使用yum完美搭建LNMP环境(php5.6,mysql5.5,nginx1.10)
准备工作 配置防火墙,开启80端口.3306端口 不用执行这句:rm -rf /etc/sysconfig/iptables 直接进入修改:vi /etc/sysconfig/iptables 添加8 ...
- tp模型和数据库操作方法
一.新建的模型名和表名一样,采用驼峰式,如表名user_type模型取名为UserType namespace app\index\model;use think\Model;class UserTy ...
- 如何让maven 将工程依赖的jar 复制到WEB-INF/lib 目录下
1.在默认生命周期的compile阶段执行 maven-dependency-plugin:copy-dependencies命令即可:<plugin><groupId>org ...
- java开发常用到的jar包总结
commons-io.jar: FileUtils 读取文件所有行 File file = new File("c:\\123.txt"); List<String> ...
- 逆向project第005篇:跨越CM4验证机制的鸿沟(下)
一.前言 本文是逆向分析CM4系列的最后一篇,我会将该游戏的序列号验证机制分析完成,进而编写出注冊码生成器. 二.分析第二个验证循环 延续上一篇文章的内容,来到例如以下代码处: 图1 上述代码并没有特 ...