基于 IBM Rational Build Forge 实现敏捷开发过程中的持续构建
 

2009-07-24 作者:曾文丽 来源:IBM

 
本文内容包括:
在敏捷开发过程中,软件构建周期以及自动化程度直接影响开发的速度和质量。本文结合具体的软件开发项目,描述如何利用 IBM Rational Build Forge 在敏捷开发过程中实现完全自动化的软件构建,产品安装以及单元测试,进行每天持续快速构建,提高开发团队的效率,改进产品和开发质量。

概述

敏捷开发(Agile development)是一种以人为核心、迭代、循序渐进的开发方法,开发周期一般是两星期到四星期。敏捷开发的一大原则是尽早的、持续的交付有价值的软件来使客户满意,交付的间隔时间越短越好。如何才能在很短的时间内实现产品的交付呢?每天持续构建能为实现短时间交付软件提供很好的质量保证。

由于开发过程中每天都会有大量的代码在修改,这些改动可能会给产品带来潜在的问题。因此,为了尽早发现开发中存在的问题,代码需要不断地集成,并频繁地进行构建(Build)、测试以及提交。如果构建不能够完全自动化,频繁的构建就需要花费大量的人力和时间。但是实现构建自动化的过程也是一项繁琐,复杂的工作。IBM Rational Build Forge 提供了很好的持续构建框架,可以实现端到端流程的自动化。它不仅可以使用自有的脚本,还可以集成用户现有的脚本和工具,因此可以有效利用现有的资源,同时它具有任务定制功能,可以周期性启动所需的构建工程,提供一个可重复的、可靠的应用开发生命周期流程。

本文结合具体的开发项目(该项目在本文的代号为项目R),描述如何利用 IBM Rational Build Forge 在敏捷开发过程中实现每天持续的自动化软件构建。

持续集成过程

2.1 典型的持续集成过程

持续集成过程中一般存在两种构建:本地构建和集成构建。本地构建一般是开发人员完成代码修改后,在自己的本机完成;集成构建一般是集成了所有开发人员的代码,由专业的构建工程师完成。典型的持续集成过程如图 1 所示,开发人员获得开发代码,开发人员进行开发工作后,各自进行本地构建。经过一定的开发时间,合并团队开发成果,再次进行本地构建,如果该本地构建成功,开发人员就可以提交代码到集成分支,构建工程师进行集成构建并进行发布。

图 1. 典型的持续构建流程
典型的持续构建流程

项目 R 根据典型的持续构建过程,结合敏捷开发方式,对此典型的持续集成过程进行适当的修改。

2.2 项目 R 的持续集成过程

项目 R 的敏捷开发采用 Scrum 开发方式,一个版本的开发分为若干个 Sprint,一个 Sprint 一般为期四周。在每个 Sprint 中,需要三至四个集成构建,期间每天需要三个本地构建。根据项目提出的构建需求,项目 R 的构建采用了本地构建与集成构建相结合的持续构建方式,使用 Build Forge 的任务定制功能实现每天三个本地构建。

为了适应敏捷开发以及持续构建的需求,我们对项目的开发模式、代码配置管理和构建流程进行相应的修改。项目R使用的代码配置管理工具是 ClearCase(以下简称 CC)。在进行敏捷开发之前,每个开发人员都有单独的开发流(Stream),每次做集成构建之前,各开发人员需要把代码提交到集成流里,然后创建基线(Baseline),构建工程师从最新的基线里面检出代码,进行集成构建。如果开发人员之间的程序具有相互依赖关系,但又没有及时沟通,往往会导致集成构建的失败。采用敏捷开发以后,为了开发人员更方便获取其它开发人员的代码,建立了一个统一的开发流,所有的开发人员都基于该流进行开发,每天在该流上进行 3 个本地构建以尽快发现各种问题。通过本地构建,确认代码正确以后,才提交代码到集成流,创建基线,进行集成构建。采用敏捷开发方式以后的 CC 策略如图 2 所示。

图 2. ClearCase 简化的开发分支策略示意图
ClearCase 简化的开发分支策略示意图

CC 的开发策略修改以后,项目R采用的持续构建过程如图 3 所示。开发人员在开发流上进行开发活动,本地构建根据定制任务的时间周期性地启动。如果本地构建成功,并且需要进行集成构建时,开发人员提交代码并创建基线进行集成构建。

图 3. 项目 R 持续集成过程
项目 R 持续集成过程

2.3 项目 R 的构建过程

项目 R 的构建主要由以下几个部分组成:构建环境恢复,检出代码,自动构建,测试环境恢复,自动部署和测试以及构建状态通知,由于项目同时支持三个数据库,需要在三个数据库中进行测试。项目 R 的一个构建过程如图 4 所示。

图 4. 项目 R 构建步骤
项目 R 构建步骤

这几个部分的完全自动化是实现持续构建的基础,3.2 节主要针对构建的几个部分,描述如何在 Build Forge 上实现持续构建。

基于 Build Forge 实现持续构建

结合敏捷开发对构建的需求以及 Build Forge 的特性,项目 R 在 Build Forge 中的持续集成采用定时触发机制,其流程如图 5 所示。

图 5. 项目 R 在 Build Forge 上的持续构建过程
项目 R 在 Build Forge 上的持续构建过程

项目 R 的构建在 Build Forge 上定时触发本地构建,如果构建成功,测试团队就可以开始测试,如果失败,构建和开发团队及时修复问题,启动下一个的构建或者等待下一次的触发。在持续集成过程中,构建过程的完全自动化是必不可少的。此外,构建状态及时更新和构建错误的快速修复影响着持续构建的效率。Build Forge 为构建状态通知提供了很好的模板。

下面主要介绍项目 R 的集成构建在 Build Forge 上实现过程,首先介绍项目 R 的构建在Build Forge 中的配置,接着详细介绍实现一个构建工程的运行步骤,然后介绍构建任务的制定,最后介绍构建通知。

3.1 Build Forge 的构建配置

在 Build Forge 中配置一个自动化的构建,一般需要以下几个对象:服务器对象,环境变量对象和工程/库对象。服务器对象是安装了代理(Build Forge Agent)的逻辑机器,构建是在服务器对象上完成的;环境变量包括工程环境变量和服务器环境变量,工程运行的时候,会结合这两种环境变量;工程/库对象是由一系列的步骤组成,每一步的成功和失败都可以给指定组成员发送邮件通知,因此合适粒度的步骤定义将有利于分析构建过程中出现的问题以及通知相关人员修复问题。项目 R 在 Build Forge 中的构建工程对象如图 6 所示。工程 R_LocalBuild 引用的环境变量是工程环境变量 LocalBuildEnv,服务器是 Rdbx。

图 6. 项目 R 的构建对象示意图
项目 R 的构建对象示意图

3.2 项目 R 在 Build Forge 上的构建步骤

项目 R 的本地构建和集成构建除了获取代码的方式不同,其它的步骤都是一样的。本地构建通过更新视图(UpdateView)获取最新代码,集成构建通过 Rebase 获得最新基线的代码,本章以本地构建为例详细介绍项目 R 在 Build Forge 中的构建步骤。

如 2.3 节所介绍,项目 R 的持续构建主要由以下几个部分组成:构建环境恢复,检出代码,自动构建,自动测试环境恢复,自动部署和测试以及构建状态通知。

一、构建环境恢复:主要是为构建做一些准备工作,确保构建的顺利进行,一般包括环境检查,磁盘空间的清理等。项目 R 在 Build Forge 上的准备步骤包括设置标签,删除旧的安装文件以及重新启动 CC 客户端服务。

  1. Prepare_BuildTag
.retag $BuildLevel

步骤一是准备构建的标签以及给相应的组发送构建开始的邮件通知。由于每天的构建是自动启动的,人为输入是不现实的。但是 Build Forge 的默认标签是阿拉伯数字,不便于标识。因此在每次构建之前都需要重新打一下标签。使用的命名规则是“项目名称+当前日期”,这个可以在 Build Forge 的 Environment 中进行定义。

  1. Prepare_delete_Old_Driver
cd /d cd $BuildScriptHome  perl deleteOldDrivers.pl

步骤二是删除以前构建出来的安装文件。由于系统空间有限,不可能保存所有的安装文件,只能保存最新的一些文件。因此,在每此构建之前都要判断所存的安装文件数目是否已经超过预定义的数目,如果超过,即删除较早的安装文件。

  1. Prepare_restart_ClearCaseServices
cd /d cd $BuildScriptHome  CC_Services.bat

步骤三是重新启动 ClearCase 客户端服务。由于各种原因,CC 客户端服务有的时候会停止。为了防止在构建过程中出现错误,因此重新启动该服务确保 CC 客户端服务处于运行状态的。

二、检出代码:获取最新的代码,然后拷贝到构建的工作空间。

  1. Prepare_updateView
cd $BuildScriptHome
perl UpdateCCView.pl $BuildLevel
.push ChangeFiles \IRM_Report\ChangeFile.log

步骤四是更新视图,同时把本次构建修改的文件加入到变量 ChangeFiles,等构建完成后,同时发送给开发人员,以便开发人员确认自己修改的代码是否已经加入到该构建中。同时,当构建失败的时候,便于分析构建失败的原因。

  1. Prepare_SouceCode
cd $BuildScriptHome  perl PrepSourceCode.pl

步骤五是准备代码。需要把上一次构建的代码删除,把最新更新的代码拷贝到构建工作区,同时创建构建所需要的目录结构。

三、自动构建:这是构建的主要过程,主要包括修改版本号,编译工作区代码,分部件构建,然后打安装包。项目 R 有 Engine,DataLoader,UI,Database,Install五个部件。

  1. Prepare_ChangeVersion
cd $BuildScriptHome  perl updateVersionNum.pl $BuildVersion

步骤六是修改版本号

  1. Prepare_CompileWorkSpace
cd $BuildScriptHome  perl prepCompile.pl

步骤七是刷新和预先编译整个工作区。预编译整个工作区有利于尽快发现编译的错误,防止在各部件生成 jar 文件时候才出现编译的问题。

  1. Engine_Build:
cd $BuildScriptHome
perl IRMBuild.pl $BuildLevel -TASK "RAD" -RAD_COM "BLL"
  1. DataLoader_Build
cd $BuildScriptHome
perl IRMBuild.pl $BuildLevel -TASK "RAD" -RAD_COM "BDL"
  1. UI_Build
cd $BuildScriptHome
perl IRMBuild.pl $BuildVersion -TASK "RAD" -RAD_COM "UI"
  1. Database_Build
cd $BuildScriptHome
perl IRMBuild.pl $BuildLevel -TASK "RAD" -RAD_COM "DB"
  1. Install_Build
cd $BuildScriptHome
perl IRMBuild.pl $BuildLevel -TASK "RAD" -RAD_COM "INST"

步骤八至步骤十二都是各部件的构建,主要是生成各种 jar 包,ear 包等中间文件

  1. Package_Windows:
cd $BuildScriptHome
perl IRMBuild.pl $BuildLevel -TASK "PG" -PG_OS "WIN32"

步骤十三是生成 Windows 的安装包

四、测试环境恢复:主要是为部署和测试做准备,清空当前的环境,恢复到系统未安装的初始状态。

  1. Prepare_Install_Env and BVT_Env

从本步骤开始,进入测试阶段。步骤十四是测试前进行环境清空,还原到未安装系统的初始化状态。

五、自动部署和测试

Build Forge 同时还支持具有层次结构的工作链。该项目采用了工程和库结合的方式测试项目 R 的三种不同的数据库,如图 7 所示。

图 7. 项目 R 单元测试结构图
项目 R 单元测试结构图
 
  1. Engine_Install

步骤十五是安装引擎。

  1. DB2_Install_JUnitTest

步骤十六是在 DB2 上安装项目 R 数据库,进行单元测试和存储测试报告

  1. ORA_Install_JUnitTest

步骤十六是在 ORACLE 上安装项目 R 数据库,进行单元测试和存储测试报告

  1. SQL_Install_JUnitTest

步骤十六是在 SQLServer 上安装项目 R 数据库,进行单元测试和存储测试报告

  1. Save_JUnitTest_Logs

步骤十九是在保存测试结果

3.3 Build Forge 构建定制

以上是本地构建工程定义的所有步骤,启动该工程就可以运行本地构建。在敏捷开发中,为了能够尽早发现存在的问题,需要频繁地进行构建。手动启动构建工程会造成大量的工作,或者导致人为原因延误构建时机。Build Forge 为构建任务预订提供了灵活的机制,可以设置每天/每周/每月等周期启动构建,也还可以根据几小时等时间间隔进行设置。本项目在开发周期之内每天运行三次本地构建,分别是 02:30,12:00 和 16:00 。图 8 所示是在 Build Forge 中设置周一到周五每天运行三次的时间表。

图 8. Build Forge 构建时间表
Build Forge 构建时间表
 

3.4 构建结果通知

运行构建的过程中难免会出现错误,及时有效的事件通知可以提高构建失败处理的反应速度,提高构建效率。Build Forge 提供了强大的邮件通知功能,可以根据项目的需求制定邮件模板,可以把修改的文件列表,构建失败的日志等有效信息加入到邮件中。不但是工程的成功和失败可以发送邮件通知,工程中的每一个步骤都可以设定邮件发送通知组。通常不同的步骤是由不同的人负责的,这样,相关人员就能在第一时间内获得构建失败的信息,失败的构建能够迅速得到修复。

在 Build Forge 中启用邮件通知,首先需要设置 SMTP 服务器,设置的选项如下:Administration->System->SMTP Server。关于邮件通知模板,可以根据系统模板的格式,添加自己所需要的信息。在本项目中,邮件通知模板设置包括:构建状态(成功,失败,警告),安装包下载链接,单元测试结果链接,更改文件列表,单元测试总结。对于构建失败的模板,可以增加构建失败日志,便于相关人员快速定位错误。

总结

本文结合项目 R 的敏捷开发需求,描述了该项目基于 Build Forge 的持续集成构建的全过程,包括软件配置框架,详细的构建步骤以及相应的信息反馈。Build Forge 的使用,极大地提高了构建的速度和质量,为敏捷开发提供很好的构建保证。

参考资料

学习 获得产品和技术 讨论

火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织