基于 Rational Team Concert 和 Maven 的差分发布

越来越多的项目选择 Rational Team Concert(RTC)来进行代码管理,项目构建等。Maven 是 Apache 提供的一个开源的项目管理工具。而本文介绍了如何在 RTC 调用 maven 进行差分构建。

王重明, 软件工程师, IBM

王重明是 IBM 中国软件开发实验室的软件工程师。在应用软件开发方面有多年的经验。



颜 晓超, 软件工程师, IBM

颜晓超,软件工程师,来自 IBM 中国软件开发中心的 GPS 部门。目前主要从事 IBM Global Process Service 开发测试工作。对 Java、自动化测试、软件过程比较感兴趣。您可以通过 developerWorks 社区与颜晓超进行交流。



刘 慧, 软件工程师, IBM

刘慧,软件工程师,来自 IBM 中国软件开发中心的 GPS 部门。目前主要从事 IBM Global Process Service 开发测试工作。对 Java、Maven 有浓厚的兴趣。



2012 年 7 月 31 日

下载:IBM® Rational® Team Concert 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

引言

Maven 是 Apache 组织众多开源项目中颇为成功的一个。Maven 是一款跨平台的项目管理工具,主要服务于基于 Java 平台的项目构建(Build)、依赖管理(Dependency Management)和项目信息管理(Information Management)。

IBM Rational Team Concert(RTC)是基于 Jazz 技术平台的产品之一,基于团队协作开发,RTC 提供了代码管理、项目构建、工作报表等一系列项目管理功能。

强大的项目管理功能吸引了越来越多的用户使用 RTC 来进行项目管理。当项目进入维护阶段,修复产品缺陷或者对应客户新的需求时,只需要发布个别修改过的文件,此时如果我们采用差分发布,就会减少发布全部文件而带来的风险。本文将介绍和探讨如何基于最新发布的 RTC,即 Rational Team Concert 3.0/4.0,结合开源工具项目管理工具 Maven 进行差分构建(Build)以达到差分发布。


构建环境概述

RTC

使用 IBM 提供的标准RTC 3.0/4.0。

Maven

Maven 是 Apache 组织的提供的开源工具,目前最新的版本是 3.0.4。


适用的项目结构描述

图 1. 项目结构图
图 1. 项目结构图

大多数的项目都是由多模块构成的,例如项目中包含了需要编译的 java 工程,不需要编译的 Web 工程以及进行批处理数据的 batch 程序。

① build:本文主要的脚本都放在该目录下进行管理。

② batch:批处理文件目录。在实际项目中可以是不需要编译的其他文件的目录。

③ java:该目录代表 java 工程,各个子工程下的文件需要编译成单独的 jar/war 等,jar/war包才是我们的发布对象。

④ web:该目录下是一些不需要编译的文件,如网页相关的 html 文件或者图片等,可以直接发布。


构建 Build 属性

RTC Build Engine 简介

如果您有自己的 RTC Server,可以为自己的项目构建一个 build engine。

图 2. Build Engine 属性
图 2. Build Engine 属性

RTC Build Definition 详述

构建定义(Build Definition)为一次构建提供了描述信息,如此次构建所使用的 JDK 的路径,构建的目标项目,构建所需要的参数等。

在实际应用中,项目后期可能会集中较多的缺陷(bug)的修改,在进行 IT 测试或者 UAT 测试时,我们需要发布的文件应该只针对某一个缺陷。为了便于发布版本的管理,我们推荐针对一次发布新建一个 Build Definition。这样当多个人同时进行构建时不会造成混乱。下面我们就 RTC Build Definition 中较为关键的内容进行详细的描述,您可以根据自己的项目需求对其中几项进行配置。

图 3. RTC Build Definition——Overview
图 3. RTC Build Definition——Overview

图 3 大图

ID:区别各个 Build Definition,最好与发布版本号想关联,这样便于区别与管理。

Project or Team Area:目标项目所属的项目组或者团队。

Supporting Build Engines:指定项目的 Build Engine。

图 4. RTC Build Definition——Schedule
图 4. RTC Build Definition——Schedule

用户可以定义 Build On Schedule。一般没有定期每天或者定期需要构建的话,可以不选 Enabled 选项。

图 5. RTC Build Definition——Jazz Source Control
图 5. RTC Build Definition——Jazz Source Control

在 Build Workspace 可以指定构建的源代码所属的 workspace,Load Option 指定在 Build Server 上构建源代码的下载路径等信息,以控制项目的代码。

Maven的构建结构

该项目的结构可以根据项目需要自己搭建,如果您的项目也是有多个子项目(project)构成,为了构建结构清晰,可以参照下面的目录结构,以便于管理。

图 6. Maven 构建结构
图 6. Maven 构建结构

build:差分 build 的主要工作目录。

需要指出的是,每个构建的模块下都会有一个单独的 pom 文件来描述其构建定义。

以上是项目中的实际应用,您可以根据自己项目的需求和特点自己构建文件结构,只要将各个pom 文件之间的调用关系指明,让 maven 可以顺序顺利执行即可。

RTC 和 Maven 通信

由于我们是差分发布,不需要构建全部的 module,那么如何控制 maven 只构建我们需要的module 呢?在主 pom 文件中,我们通过 activation 属性控制该 module 的活性,而该属性是否被激活,可以在 Build Definition 中定义。

首先在 Build Definition 的 Properties 标签页中定义要传递给 maven 的变量,并赋予值。

图 7. RTC Build Definition——Properties
图 7. RTC Build Definition——Properties

图 7 大图

真正将这些变量的值传递给 maven 的属性是在 Build Definition 的 Maven 标签页中实现的。在 goals 项目栏中,maven 脚本中用到的属性与定义的被传递给 maven。

图 8. RTC Build Definition——Maven
图 8. RTC Build Definition——Maven

其中,Maven home 和 Java home 是指 build server 上的环境路径。

构建 Maven 脚本

build/pom.xml 分析

差分发布的时候,我们经常会遇到只需要构建其中一个或几个工程项目,而不是整个工程内的所有项目。build/pom.xml 就是用于指定针对某一个发布我们需要构建的项目。以及各个module依赖的repositories仓库。

清单 1. build/pom.xml 代码片段
<profiles>
<profile>
 <id>project1</id>
 <activation>
    <property>
        <name>rp.project1</name>
        <value>true</value>
    </property>
  </activation>
  <modules>
	<module>../java/project1</module>
  </modules>
</profile>
……
<profile>
 <id>install</id>
      <activation>
	<property>
          <name>rp.install</name>
          <value>true</value>
        </property>
      </activation>
  <modules>
	<module>zip</module>
	<module>install</module>
  </modules>
</profile>
<profiles>
<repositories>
<repository>
<id>csdpFtpRepository</id>
   <name>CSDP Maven Repository</name>
   <url>
       http://ausgsa.ibm.com/projects/c/csdpbuildrepository/maven/repository
   </url>
</repository>
……
</repositories>
……

Module:指定各个子项目。需要特别指出的是 Maven 构建是按顺序执行的,差分构建用的 install 模块应该是在其他模块构建结束后执行,在结构上,install 模块在最后加载。

Activation:这里我们用了 Activation 属性来控制各个子 module 是否被激活。当 RTC 传给maven的属性rp.install的值不是预期的true时,该模块不被激活,即build时不build该模块中包含的项目;反之,则该模块被激活。

Repository:指定项目中的相关依赖。

../zip/pom.xml 分析

自定义打包用的 pom 文件,该文件是差分构建的一个关键,我们利用了 maven 提供的一个插件 maven-assembly-plugin,通过该插件我们可以将一次构建的对象自动构建到一个包内,以减少手动作业过程中的 mis s的概率。

在该 pom 文件内需要指定此次发布时打包描述文件,即本例中的 ../releaseFile/${packageFileName}.xml。

为了提高代码的重用率,该pom文件中指定的 package 文件名时可以使用变量,该变量在定义build definition时指定即可。如本例中,${packageFileName} 是一个变量,其值的传递方式请参照 RTC 与 Maven 通信的章节。

清单 2. ../zip/pom.xml 代码片段
<plugin>
   <artifactId>maven-assembly-plugin</artifactId>
   <configuration>
   <appendAssemblyId>false</appendAssemblyId>
   <descriptors>
   <descriptor>../releaseFile/${packageFileName}.xml</descriptor>
   </descriptors>
   </configuration>
   <executions>
   <execution>
   <id>make-assembly</id>
   <phase>package</phase>
   <goals>
   <goal>single</goal>
   </goals>
   </execution>
   </executions>
</plugin>

Plugin:需要特别指出的是,maven除了提供了jar和war常规文件的打包的插件以外,也为我们提供了maven-assembly-plugin 插件,以支持其他的非标准文件打包。maven-assembly-plugin支持的文件格式包括jar,zip,tar,tar.gz,rar,ear等。

Descriptor:指定打包描述文件。

../releaseFile/${packageFileName}.xml 分析

具体指定此次发布的文件集合,这些文件包含了已经生成的jar/war,以及不需要编译的文件。

清单 3. ../releaseFile/${packageFileName}.xml 代码片段
<assembly xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 http://maven.apache.org/xsd/assembly-1.0.0.xsd">
<id>package</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>true</includeBaseDirectory>
<files>
<file>
<source>/java/project1.jar</source>
<outputDirectory>/source/java/</outputDirectory>
</file>
……
</files>
<fileSet>
<directory>/web/html/</directory>
<outputDirectory>/source/web/html/</outputDirectory>
</fileSet>
</fileSets>
</assembly>

Format:指定最终生成的文件的格式。

File:发布的目标文件,以单个的文件为单位。source 指定需要被发布的文件,outputDirectory指定输出目录名称。

FileSet:发布的目标文件夹。当需要发布整个文件夹下的文件及其子文件夹时,使用该属性较为便利。Directory 指定需要被发布的文件夹,outputDirectory 指定输出目录名称。

../install/pom.xml 分析

通过 RTC 的 build engine 打包的最终文件需要拷贝到一个我们可以访问的 server 去下载下来,该 pom 文件就是用来指定下载服务器及其路径的。

清单 4. ../install/pom.xml 代码片段
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
      <execution>
      <phase>install</phase>
      <goals>
      <goal>run</goal>
      </goals>
      <configuration>
      <tasks>
      <mkdir dir="${basedir}/target/images"/>
      <copy file="../zip/target/source-${releaseVersion}.${buildLabel}.zip" 
        todir="${basedir}/target/images/" />
      </tasks>
      </configuration>
      </execution>
    </executions>
</plugin>

这里使用的是 maven-antrun-plugin 插件,实际该插件提供了 an 的一些功能,这里我们用到了做成一个路径 mkdir 功能,copy file 的拷贝功能。maven-antrun-plugin 插件还提供一些删除文件等功能,可以根据您项目的需要灵活应用。

java/project1/pom.xml 分析

单独的一个 java 模块的打包描述。

构建 差分文件list 脚本

差分发布中较为关键的是使用 maven-assembly-plugin 插件时指定的 package 文件,package 中源文件的路径是 RTC server 上该文件的相对路径,输出路径可以自由指定,一般可以是 product 环境的相对路径。当然如果想要一个全代码发布的构建,只要提供全代码指定的 package 文件即可。

由于源文件在 RTC 上的路径相对是固定且有规律可循的,我们利用 excel 结合简单的 vba 编程,制作了一个简单的工具来生成 package 文件。这个小工具会以附件的形式提供给读者,以作为参考资料。

另外,RTC 在管理代码的时候,一般每一个 Defect 和 CR 的代码修改都会关联相关的 workiteam,我们也可以调用 RTC 的 API,通过 workiteam 的 id 来得到对应代码的文件路径,从而生成差分文件的 list 脚本。这个将会单独在下一篇中介绍。


小结

本文描述了在实际项目应用中如何结合 RTC 和 maven 进行差分构建,将一次发布需要的 jar/war 包以及不要编译的文件利用 maven 构建在一个 zip 文件里,以减少项目中全文件发布带来的风险。


下载

描述名字大小
示例 package 文件package-demo.xml1 KB
示例 Excel 文件release_package_generate.xls90 KB

参考资料

学习

获得产品和技术

  • 访问 Rational Team Concert 学习路线图,这个 RTC 学习路线图可帮助您从入门开始了解 RTC 和 Jazz 技术,并将这一全新的软件开发协作体验,及其相关技能落实到您日常的软件开发当中。
  • 访问 Rational Tean Concert 产品专题,了解最新的 IBM Rational AppScan 产品文档和产品信息,获得关于 IBM Rational AppScan 及与 Web 应用安全相关的技术文档和参考资源,还可以查阅产品概览、产品手册、产品技术支持、试用版下载,以及相关文章、教程、多媒体课堂和产品演示等信息。
  • 下载:IBM Rational Team Concert 试用版
  • 获取免费的 Rational 软件工具包系列,了解最新的 IBM Rational 软件开发工具技术文档和资源。
  • 下载更多免费的 IBM Rational 试用版软件,了解 IBM Rational 软件的最新特性。
  • 获取更多 IBM 试用版软件,并熟练掌握来自 DB2®、Lotus®、Tivoli®,以及 WebSphere® 的开发工具和中间件产品,用这些试用版软件开发您的下一个项目。这些试用版软件可以免费直接从 developerWorks 下载。

讨论

  • 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
  • 访问 developerWorks 社区上的 Jazz 技术小组,这里汇集了丰富的 Jazz 平台中文技术资源。 您可以通过这里了解更多关于 Jazz 平台和 Jazz 技术发展趋势的最新信息。
  • 加入 IBM 软件下载与技术交流群组,参与在线交流。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=828397
ArticleTitle=基于 Rational Team Concert 和 Maven 的差分发布
publish-date=07312012