求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
基于 Rational Team Concert 实现持续集成
 
作者 魏进锋,火龙果软件    发布于 2013-11-22
 

随着软件开发的发展,越来越多的机构都开始使用 Rational Team Concert(RTC)来管理和开发项目。持续集成是敏捷开发方法中非常重要的实践,本文希望通过介绍笔者在项目中使用 RTC 进行持续集成的实践和经验,来为使用 RTC 的人员进行项目开发提供一些方法和建议。本文将首先介绍持续集成和 RTC 的相关概念,然后再具体介绍项目中使用 RTC 来实现持续集成方法,包括:源代码管理、构建定义、多环境扩展、自动部署等方面。

简介持续集成简介

在如今敏捷开发方法已成为主流的软件开发市场,周期性快速交付已被业界所广泛接受并认可。在这种模式下持续集成可以最大化地发挥它的产能。持续集成是持续地进行软件自动化构建,帮助开发者尽早发现和解决缺陷从而进行高质量交付的一套开发原则和实践,同时持续集成也是敏捷项目开发周期性快速交付的基础保证。持续集成不仅仅是指软件构建的过程,更是一个旨在提升软件质量的流程自动化框架,例如自动化的版本构建,单元测试,代码静态分析,版本部署及验证,反馈机制等。

自动化是持续集成所强调的重点所在,自动化也是符合软件开发的趋势,通过计算机将人工劳动力从重复低级的工作中解脱出来投入到更智慧的工作中去,从而提高效率降低错误风险。提升软件质量是持续集成的终极目标,持续集成本身并没有限定通过何种方式来提升软件质量,它自身也是一个开放性的框架,任何对提升软件质量好的实践均有可能纳入其中,但是它确实建议了很多也被业界公认的实践,例如将单元测试,代码分析纳入发布流程等。

常言道:工欲善其事,必先利其器。企业在实施持续集成之前首先需要选择合适的工具来支撑,目前业界常用的持续集成工具有 Apache's Continuum、Cruise Control,IBM 的 BuildForge 以及 Rational Team Concert 等。在本文中我们将以 IBM Rational Team Concert 为例来详细介绍 IBM 中国开发中心某产品团队是如何使用该工具来实现定制化的持续集成解决方案。

Rational Team Concert

IBM Rational Team Concert(RTC)是构建在 IBM Rational 面向软件交付技术的下一代协作平台 Jazz 上的第一个商用产品。何为 Jazz?在爵士乐队演奏一首乐曲时,需要乐队中的每位成员既分工明确又互相关注,默契配合。软件开发过程与之类似,软件开发通常由一组职责分明的团队人员共同承担完成,他们为了一个共同的目标交付高质量软件产品而一起工作,这是一个相互协作共同努力的过程。因此,IBM 把其推出的这套用于提高软件开发效率的软件平台称为 Jazz。从广义上来说,我们现在所说的 Jazz, 是指包括 Jazz 技术平台及其基于该平台的系列工具在内的 Jazz 大家族。Jazz 技术平台是一个基于团队协作模式,以提高软件开发效率为宗旨,以 Eclipse client 端的插件技术,Web 客户端的 Dojo Ajax 技术,Web 服务器端的 REST service 技术和基于 EMF 存储模型为核心的,可伸缩、可扩展的平台。目前,以 Jazz 平台为基础的工具主要有 RTC(Rational Team Concert)、RQM(Rational Quality Manager)和 RRC(Rational Requirements Composer)。RTC 构建于可扩展的 Jazz Foundation 上,提供了从任何基于 Jazz 的工具到任何其他基于 Jazz 的产品工具的无缝链接。

RTC 是一个可实时相互协作的软件交付环境,可以帮助跨地域分布的开发团队简化协作开发过程,并使其软件交付过程实现自动化管理。是一个针对各种软件开发人员,包括系统架构师,项目经理,软件开发工程师等的团队协作平台。它覆盖整个软件开发生命周期,提供对包括过程管理,以敏捷开发技术 ( 如 Scrum 和 Eclipse Way)为模板的项目计划、构建管理、源码版本控制等各个方面的支持,并以 work item 机制跟踪协调每个开发人员的任务和工作流程。 RTC 在项目规划和工作项评估方面具有强大的团队协作能力,能加快项目的执行速度,同时能提供卓越的项目透明性。RTC 集成了源代码控制、工作项管理和构建管理等强大功能,是一个可伸缩、轻量级的应用生命周期管理解决方案,是面向企业中敏捷开发团队的协作式开发平台,可以大大提升软件开发团队的协作能力、创新能力和生产率。

在初步了解了 RTC 的基本特点和强大功能之后我们来看在实际项目中如何有效的使用 RTC 来实现持续集成。

持续集成案例实现

RTC 有着非常强大的自动构建能力,它可以提供工作任务的管理,项目计划的安排,代码版本管理控制,自动构建可用版本,生成构建结果报告等,这些过程构成了项目的持续集成过程。RTC 提供了构建引擎(build engine)来负责构建(build),首选,启动构建引擎,并和 RTC 服务器建立了连接。再定义在构建引擎上运行的构建定义(Build Definitions),在这个定义中,需要设定编译哪些模块的代码,需要调用哪个 ANT 文件来启动编译,和一些编译过程中的参数的设定。

通过在构建定义上,点击请求构建,就可以发起一个构建请求(Build Request),触发一次构建过程。在这里选择需要的构建参数,这个过程就会在后台运行。每一个开发人员,只要做了任何的代码改变和提交,都可以请求触发新的构建过程,来保证我们代码的有效性。申请一个新的构建如下图所示:

图 1. 请求构建

可以定义一些开关变量,在每次构建开始之前,通过设置开关的 true/false 值来控制构建步骤。

图 2. 构建参数配置

当构建结束后,RTC 服务器会提供构建结果报告,开发人员可以追踪到这次构建的详细信息,例如:构建包含的变更集,有哪些新的源代码参与了构建,关联在哪一次项目发布(Releases)中等。此外,RTC 还提供创建详细 BOM 信息(bill of materials),以确保构建重现能力(build reproducibility)。

图 3. 构建报告

该项目使用 RTC 来进行产品的从开发到版本交付端到端流程管理,项目中整体的构建流程定义如下:

(1) 初始化构建环境,从 RTC 检出最新的项目源代码;

(2) 调用 ant 脚本完成项目代码的编译;

(3) 对 java 代码运行单元测试;

(4) 对 SQL 脚本运行单元测试;

(5) 将编译后的代码进行打包;

(6) 自动部署产品;

(7) 部署验证;

(8) 发送构建通知

持续集成实现简介

源代码管理

RTC 设计了组件(Component)来存放开发中的工件,很好地与系统架构的组件相对应;变更集体现了组件的变更历史。RTC 提供了工作空间(Repository Workspace)和流(Stream)实现个人和团队工作的独立性,实现团队级别的并行开发;同时 RTC 还提供了先进的挂起(Suspend)和继续(Resume)功能,给个人提供工作级别的并行。另外,RTC 还支持并行开发出现的冲突(Conflicts)解决;提供基线(Baseline)支持等。

例如,该项目中,使用了 2 个 component。一个叫 SQO-Core,另一个叫做 SQO-Optional。常用的和构建相关的 projects 会放在 SQO-Core 里,和构建不相关的 projects 可以放到 SQO-Optional 这个 component 里。这样可方便在构建过程中指定 component,引擎只加载此 component 下的所有 projects,甚至可以通过在 build definition 里定义一些 rule,来具体指定此 component 下的哪几个 projects,从而加快构建过程。

构建步骤

Jazz 构建系统提供了集成的构建平台以方便快捷地实现项目构建和持续集成。Jazz 本身并没有真正的构建的能力,但是它却提供了一整套框架藉由构建脚本来实现项目构建。

通过 Jazz 构建系统,可以实现与 Jazz 源代码管理器的无缝结合,并可方便的追踪到构建中的变更集,制定构建计划,生成构建日志以及发送构建结果通知。

要实现项目构建,首先需要以下几个步骤:

实现构建脚本

制定构建定义以调用构建脚本

定义构建引擎来运行构建

启动构建引擎

实现构建脚本

RTC 支持多种脚本语言,本文描述的工程选用的 ANT 脚本。

可以根据工程的大小,编写合适的脚本,可以放在一个文件中,也可以通过文件进行调用。

下面是一个 ANT 脚本的例子。

清单 1. ANT 脚本示例

<?xml version="1.0" encoding="UTF-8"?>
<project name="shared-master" default="all" basedir=".">

<taskdef name="startBuildActivity"
classname="com.ibm.team.build.ant.task.StartBuildActivityTask" />
<taskdef name="completeBuildActivity"
classname="com.ibm.team.build.ant.task.CompleteBuildActivityTask" />

<!-- ************ build process definition ************ -->
<target name="all" depends="init">
<condition property="run_build_condition">
<istrue value="${run_build}" />
</condition>
<condition property="run_unit_test_condition">
<istrue value="${run_java_unit_test}" />
</condition>
<condition property="run_sql_test_condition">
<istrue value="${run_sql_unit_test}" />
</condition>
<condition property="run_unpack_condition">
<istrue value="${run_unpack}" />
</condition>
<condition property="run_upload_condition">
<istrue value="${run_upload}" />
</condition>
<condition property="run_release_condition">
<istrue value="${run_release}" />
</condition>

<antcall target="build" />
<antcall target="quote_unit_test" />
<antcall target="quote_sql_test" />
<antcall target="unpack" />
<antcall target="upload" />
<antcall target="release" />
</target>

......//省略文件主体,详见下载部分。

</project>

省略文件主体,详见下载部分。

构建定义

在进行构建之前,需要为工程制定构建定义,下图是一个构建定义的例子。

图 4. 构建定义

在构建定义中,需要为其指定构建引擎,如果没有的话需要创建新的构建引擎,具体过程会在步骤 3 中详述。
在 Jazz 源码控制选项卡里可以为构建定义选择或创建构建工作空间,通过此工作空间,指向源代码流,继而可以获取项目源代码并进行构建。另外,还可以在此工作空间上方便的进行快照操作和基线操作。在构建定义中还可以指定源代码的装载地址、从源代码中增加或是排除程序组件。

图 5. 构建定义源代码选项

调用 Ant 脚本

在构建定义中 Ant 选项卡里可以指定调用的 Ant 文件。并可以指定 Ant 参数和 JVM 参数。在构建文件路径中可以用 ${arg} 来用参数来替换其中的值。替换值可以使构建引擎定义中的值或者是构建定义中的自定义属性。 构建引擎定义中的值或者是构建定义中的自定义属性会在后面进行详细介绍。

图 6. 构建定义 Ant 属性

定义构建引擎

构建定义是需要运行在构建引擎上的,可以为构建定义指定多个构建引擎,这样,如果一个构建引擎不能用的时候,可以自动转移到其它的构建引擎上执行。

图 7. 构建引擎定义

下面是一个构建引擎的定义,可以给构建引擎设定自定义属性,填写相应的名称和值。这样,所有应用此构建引擎的构建定义都可以获取到此属性值。所以,可以把一些构建引擎公用的属性定义在构建引擎的属性定义中。

图 8. 构建引擎属性定义

启动构建引擎

启动构建引擎需要执行一个外部命令,格式如下:

jbe -repository https://localhost:9443/jazz 
-engineId default -userId myUser -pass myPass -sleeptime 1

下面是一个实际的启动构建引擎的例子:

/opt/IBM/java/java_1.6/current/sdk/jre/bin/java 
-jar /opt/IBM/RTC/CLM_3.0.1_Build/jazz/buildsystem/buildengine/eclipse/plugins/
org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
-repository https://igartc03.swg.usma.ibm.com/jazz/
-userid jhma@cn.ibm.com
-passwordFile /net/rpo-fs015/vol/homes/cvtbld/EdwardJazzPassword.txt
-engineId CVT-DSW-SQO

图 9. 构建引擎启动状态

多环境扩展

为了能够支持多环境下构建的需要,我们采用通过 Ant 脚本和构建定义的自定义属性来实现对多环境下的构建工作。

图 10. 构建属性定义

在该项目中,不同环境的构建是通过给 deploy_target 和 env 传递不同的参数值来实现。通过给参数传递不同的值,如功能测试环境(FVT)、用户测试(UAT)PS 来通过脚本实现不同环境的构建和部署。具体实现方式如下图所示:
首先将参数传递给构建脚本:

图 11. Ant 脚本定义

然后根据不同的参数,调用不同的脚本片段 :

图 12. 多环境扩展实现

WAS 下自动部署

图 13. 动构建到部署流程介绍

构建 ear 包:一般启动一个 Build Definition 就可以开始构建 ear 包。可以通过计划来启动 Build Definition,也可以通过手工方式来启动。

传送 ear 包到 WAS 的 Deployment server 上:ear 包将被部署脚本使用来更新当前的应用。

通过部署脚本部署 ear 包:这个步骤是通过远程调用部署脚本来部署新构建的 ear 包。

通知相关 members:这个步骤是通过 Jazz RTC 的一个功能特性来通知需要关注 build 和 deploy 结果的成功。后续"报告和通知"章节将详细介绍。

WAS 部署脚本设置

图 14. 部署脚本

Quote.properties 是该项目设置部署脚本属性的文件,包含的属性有:cell, profile, cluster, node, server, ear, application。wsadmin.sh 是包含具体部署脚本的程序文件,该文件通常位在 WAS 的安装目录下。

wsadmin.sh 文件在项目中位于:/usr/WebSphere/AppServer/profiles/DSWNode/bin/wsadmin.sh

远程调用脚本设置

图 15. 脚本调用

在该项目中,构建引擎通过 ssh 命令来远程调用部署脚本。

<target name="fvtForSQO" depends="init">
<sshexec username="${fvt.user}" password="${fvt.pwd}"
host="${fvt.host}" trust="true" command="/deploy/ant/apache-ant-1.8.1/bin/ant
-f /deploy/codedrop/appupdate/build.xml updateAndRestart
-Dprop.file=/deploy/codedrop/appupdate/fvt/Quote.properties
-Dwsadmin.user=${wsadmin.user} -Dwsadmin.pw=${wsadmin.pw}" />
</target>

计划任务

一般来说,项目都会有定时构建的需求。例如,项目期望公用 jar 包每隔 1 个小时自动检测是否有代码修改,如果有修改就构建出新的 jar 包。这种情况下就可以使用 Jazz 的计划任务特性,下面以该项目中的实际使用为例来介绍如何设置并启动自动任务执行。

1、打开该项目构建定义中的定时任务 (schedule) 选项卡;

图 16. Schedule 设置

2、设置间隔时间,执行天数等;

3、切换到源代码管理 (Jazz Source Control) 选项卡,选中"Build only if there are changes accepted"选项。这个选项的作用就是只有构建引擎检测到有代码变更时才开始自动构建,这样就避免了很多次无效的构建出现。

图 17. Jazz Source Control 设置

报告和通知

如果希望在构建结束后,收到邮件通知,则可以使用 Jazz 的邮件通知功能。下面以该项目中的使用为例来介绍设置步骤。

1、打开该项目构建定义中的邮件通知(Email Notification)选项卡;

图 18. Email Notification 设置

2、点击添加,打开邮件通知编辑窗口,输入标题名称以及邮件地址;

图 19. Edit Email Notification Criteria 设置

3、点击确定,回到构建定义页面,保存以上设置。

总结

综上所述,项目团队可以使用 RTC 提供的构建能力来实现按需构建,自动构建,定时构建,进而很好的进行项目的持续集成。

相关文章

为什么要做持续部署?
剖析“持续交付”:五个核心实践
集成与构建指南
持续集成工具的选择-装载
相关文档

持续集成介绍
使用Hudson持续集成
持续集成之-依赖管理
IPD集成产品开发管理
相关课程

配置管理、日构建与持续集成
软件架构设计方法、案例与实践
单元测试、重构及持续集成
基于Android的单元、性能测试
 
分享到
 
 


集成与构建指南
项目管理:Maven让事情变得简单
持续集成工具hudson
持续集成
Maven权威指南
程序集(UML中的包)之间循环
更多...   


产品发布管理
配置管理方法、实践、工具
多层次集成配置管理
使用CC与CQ进行项目实践
CVS与配置管理
Subversion管理员


海航股份 重构及持续集成
电研华源 设计原理、建模与重构
软件配置管理日构建及持续集成
单元测试、重构及持续集成
中国软件研发中心 单元测试与重构
单元测试、重构和持续集成实践
罗克韦尔 C++单元测试+重构+Gtest
更多...