总览
随着越来越多的软件开发团队使用基于Web的IBM®Rational Team Concert™基于Web的协作软件来管理整个软件开发生命周期,对迁移历史数据的担忧可能成为一个考虑因素。 使用许多其他软件配置管理(SCM)系统的许多项目已经运行了多年。 因此,那些SCM系统中有大量的历史数据。 对于那些项目团队来说,如何将数据迁移到Rational Team Concert是一个最大的挑战。
本教程基于我们在将历史数据从Configuration Management版本控制(CMVC)迁移到Rational Team Concert在线系统中的经验。 它描述了如何从CMVC导出历史记录数据并将其导入Rational Team Concert,而又不会丢失各种代码工件之间的链接。 概述的迁移步骤(使用CMVC客户端API和Rational Team Concert API)也有助于从任何其他SCM系统到Rational Team Concert项目的迁移。
CMVC与Rational Team Concert的比较
CMVC基础
配置管理版本控制(CMVC)是一种著名的软件配置管理(SCM)产品。 它在分布式开发环境中集成了软件开发过程的四个方面,以促进产品开发生命周期各个阶段的开发活动在项目范围内的协调:
- 配置管理
- 版本控制
- 换控制
- 问题追踪
在CMVC中,为源代码管理引入了以下概念和对象:
- 组件提供对开发数据的组织和控制。
- 版本包含与产品相关的活动的文件。
- 缺陷用于记录有关报告的问题的信息。
- 功能用于记录有关建议的增强功能的信息。
Rational Team Concert基础知识
Rational Team Concert是下一代协作应用程序生命周期管理产品之一。 它在IBM®Rational®Jazz™技术平台上运行。 Jazz是一个可扩展的,可扩展的团队协作平台,可在整个软件生命周期中集成任务。
Rational Team Concert使您可以轻松地在项目上下文中交换信息并与团队合作。 如果收到更改请求,则会自动通知您和其他团队成员更改。 您可以参考聊天会话中的更改并将其链接到相关工件。 业务涉众还可以自动了解他们感兴趣的任务更改的状态。
软件开发生命周期的许多方面都无缝集成在单个环境中,包括敏捷开发计划,流程定义,源代码控制,缺陷报告跟踪,构建管理和报告。 您可以跟踪和管理不同工件之间的链接和关联,促进声音开发过程,并自动收集项目信息。 Rational Team Concert支持流程配置和定制,并为用户提供基于Eclipse的客户端界面,Microsoft®Visual Studio客户端界面和Web界面。
两者的比较
CMVC和Rational Team Concert都提供强大的SCM功能,但是Rational Team Concert更加注重团队合作和协作。 因此,它使开发和项目管理更加有效。
与CMVC相比,Rational Team Concert为源代码管理引入了类似的术语,例如component , 瑕疵和feature (或story )。 但是,请务必注意, 流在Rational Team Concert中使用的方式类似于CMVC,但具有其他一些功能。 另外,Rational Team Concert工作区是您可以查看和修改组件的区域。
迁移过程概述
尽管在CMVC和Rational Team Concert中配置管理,版本控制,变更控制,问题跟踪和数据存储都相当复杂,但是幸运的是,我们不必担心它们。 我们只需要了解CMVC和Rational Team Concert数据格式之间的区别,并熟悉CMVC和Rational Team Concert客户端,然后通过调用CMVC客户端API和Jazz API自动执行重复的导入和导出步骤。 。
通过这种方法,您可以完全控制迁移过程。 如果发生任何错误,很容易解决问题并从发生错误的地方重新开始迁移。 例如,如果在导入源文件时由于某种原因远程Rational Team Concert服务器不可用,则可以安全地找到最后一个成功导入的文件,然后从下一个源代码文件重新导入。
通常有三个步骤,如图1所示:
- 制备
- 进出口
- 验证
图1.迁移过程

先决条件
迁移环境
CMVC服务器版本为5.0,Rational Team Concert服务器版本为2.0(Scrum模板2.0)。
CMVC和Rational Team Concert库
- 对于CMVC 5.0,您可以在CMVC客户端安装文件夹中找到CMVC.jar文件。
- 对于Rational Team Concert版本2.0,您需要遵循此指南来设置开发环境: 集成和扩展Rational Team Concert 2.0(SDK)
迁移用户访问
- 对于CMVC 5.0,用户需要具有查看缺陷和功能以及提取源代码文件的特权。
- 对于Rational Team Concert v2.0或更高版本,用户应该在项目区域中具有Scrum Master角色。
本教程重点
CMVC和Rational Team Concert之间的对象彼此之间并非100%匹配,因此我们可以仅关注正在使用的数据。 例如,我们可以决定仅迁移与您的项目相关的某些缺陷或特征字段,而不是所有字段。
对于本教程,我们专注于通过调用CMVC客户端API和Rational Team Concert客户端API以自动方式执行以下重复步骤:
- 导出缺陷或特征(缺陷/特征)
- 导出源代码和历史记录版本信息
- 导入缺陷/特征
- 导入源代码
为迁移过程做准备
准备Rational Team Concert存储库
在迁移之前,我们需要在Rational Team Concert中设置目标流,工作空间,组件,工作项类别以及定制属性(随后的大多数准备步骤也可以通过调用Rational Team Concert API来完成,但是这不是本文的重点)。 为此,我们将完成以下任务:
- 创建一个名为
releaseA
的流作为目标流。 - 向releaseA添加两个组件:
src
和build
。 这些组件基于CMVC组件名称。 - 创建一个工作空间
releaseAWorkSpace
,并将releaseAWorkSpace定位到releaseA流。 - 添加工作项类别:
src
和build
。 这些基于CMVC组件名称。 - 添加自定义属性
cmvc_name
,以存储CMVC缺陷和功能部件号。 通常,保留原始CMVC缺陷和功能部件号是一个好习惯。 我们可以通过向Rational Team Concert引入定制属性来实现。 将缺陷和任务工作项类型的定制属性添加到Rational Team Concert。 定制属性名称是小字符串类型。
对象映射规则
本节将处理CMVC和Rational Team Concert对象映射规则。 这些映射规则适用于大多数情况,但是您可以根据需要使它们适应您的项目。 我们需要考虑用户,缺陷和功能,属性和术语的映射,因此以下七个表分别涵盖了每个映射。
表1.用户映射
Rational Team Concert用户 | CMVC用户 |
---|---|
电子邮件地址 | 地址 |
名称 | 名称 |
用户身份 | 用户身份 |
注: User_id在CMVC中用作标识符,并将映射到Rational Team Concert中的UserId。
表2.缺陷和特征映射
属性类型 | CMVC缺陷或功能 | Rational Team Concert工作项类型:缺陷或询问 |
---|---|---|
默认属性 | 名称 | cmvc_name(Rational Team Concert方面的自定义属性) |
compName | 提起反对 | |
抽象 | 摘要 | |
备注 | 注释 | |
备注 | 描述 | |
州 | 状态/分辨率 | |
addDate | 创建日期 | |
ownerName | 拥有者 | |
originName | 由...制作 | |
特定于缺陷的属性 | 优先 | 优先 |
严重程度 | 严重程度 |
注意:此cmvc_name定制属性将用于存储CMVC缺陷或功能部件号。 我们还可以映射我们感兴趣的其他属性。
表3.严重性映射
CMVC | 理性团队音乐会 |
---|---|
1:关键 | 危急 |
2:严重 | 重大的 |
3:错 | 正常 |
4:最小 | 次要 |
任何其他值 | 未分类 |
表4.优先级映射
CMVC | 理性团队音乐会 |
---|---|
必须修正 | 高 |
候选人 | 低 |
递延 | 低 |
简单 | 中 |
中等 | 中 |
难 | 高 |
不适用 | 未分配 |
表5.缺陷状态映射
CMVC缺陷 | Rational Team Concert工作项(缺陷) |
---|---|
打开 | 新 |
加工 | 进行中 |
设计 | 进行中 |
尺寸 | 进行中 |
评论 | 进行中 |
回来 | 已解决-为我工作 |
校验 | 已解决-固定 |
取消 | 已验证-为我工作 |
关闭 | 已验证-已修复 |
转入 | 已验证-已修复 |
表6.功能状态映射
CMVC功能 | Rational Team Concert工作项目(任务) |
---|---|
打开 | 新 |
加工 | 进行中 |
回来 | 递延 |
校验 | 已实施 |
取消 | 无效 |
关闭 | 完成了 |
转入 | 完成了 |
设计 | 进行中 |
尺寸 | 进行中 |
评论 | 进行中 |
表7.其他概念映射
CMVC | 理性团队音乐会 |
---|---|
释放 | 流 |
零件 | 零件 |
变化 | 变更集 |
注意: CMVC中的发行版可以映射到Rational Team Concert项目中的流。
提示:
- 请确保Rational Team Concert SDK的版本和Rational Team Concert服务器的版本相同。 否则,可能会发生意外的异常。
- 源代码包含在Rational Team Concert SDK中。 查看代码是查明某些问题的好方法。 从Jazz.net论坛中查找帮助和信息也非常有帮助。 您可以在Jazz API和Jazz开发Wiki上找到相关信息。
- CMVC客户端API的参数可能会有一些细微差异,具体取决于您的确切CMVC版本。 当然,可以在“可下载资源”部分的导出代码中轻松调整它们。
使用API从CMVC导出历史数据
CMVC Java客户端API概述
CMVC Java™客户端API为客户端应用程序提供了Java接口,以访问CMVC服务器功能。 现在,所有CMVC图形用户界面客户端都基于此API。 开发人员现在可以通过API访问CMVC。 CMVC客户端API设计提供了称为命令的交互单元。 这些命令中的每一个在逻辑上等效于已经存在的CMVC命令(例如User -view
命令)。
在本节中,我们将简要介绍CMVC命令的创新,然后导出用户,缺陷和功能以及具有历史记录版本的源文件。
- 调用CMVC API Java存档(JAR)文件以查看文件信息:
- 运行以下命令,如图2所示,并登录CMVC:
C:\IBM\CMVCDC50>set_classpath=CMVC.jar
C:\IBM\CMVCDC50>java_com.ibm.sdwb.cmvc.client.api.SampleExe
- 然后调用图3所示的
FileView
命令。我们可以获得文件信息,就像在CMVC GUI客户端中可以获得的一样。
图2.使用CMVC API JAR文件登录到CMVC
图3.调用CMVC API JAR文件中的FileView命令以查看文件信息
- 在Java程序中调用CMVC客户端API,以查看文件信息。 在Java程序中调用CMVC客户端API就像调用命令一样简单。
您只需要熟悉CMVC客户端API提供的几个Java类即可。 命令子系统包括以下类:
-
CommandFactory
- 这是一种易于创建Command对象的机制。 命令
- 这是抽象类,封装与逻辑或高级CMVC命令相关的数据。 命令结果
- 此类的实例封装通过执行命令生成的结果。 会话数据
- 此类的实例携带特定于会话的数据,例如对CMVC系列进行身份验证所需的数据,以及任何参数默认值。 家庭信息
- 此类的实例封装了联系给定CMVC系列所需的信息。
清单1中显示了用于调用CMVC FileView API的核心Java代码片段。您可以在“ 下载”部分中获得完整的代码。
清单1.调用FileView命令的核心Java代码片段
// File –view
// get command
Command cmd = CommandFactory.getInstance().getCommand("FileView");
cmd.setFamilyInfo(familyInfo_);
cmd.setSessionData(sessionData_);
// set the command parameters
addParametersFileView(cmd, fileInfo.getFilepath());
// execute the command
CommandResults res = cmd.exec();
// analyze the essential information
int rc = res.getReturnCode();
if (rc == CommandResults.SUCCESS) {
logger.info("FileView:Succes");
String pathname = res.getValue("FileView", "pathName");
String globaltext = res.getValue("FileView", "null");
// analyze the key information: source code version, version owner and
// the mapping defect/feature
getFileVersionInfo(fileInfo, pathname, globaltext, release);
// record the source code version, version owner and
// the mapping defect/feature
fileWriter.write(fileInfo.getFilepath() + "\t" + fileInfo.getHistoryInfo() + "\r\n");
fileWriter.flush();
} else {
logger.info("FileView:failed");
logger.error(res.getFailureMessages());
}
现在,您对CMVC API的使用有了一个想法,我们将继续从CMVC导出数据。
导出CMVC用户数据
在这种情况下,我们仅迁移三个用于用户信息的字段:用户ID,用户名和电子邮件。 直接从CMVC GUI客户端或命令中导出此类用户信息非常容易。
- 我们定义了一种简单的用户数据格式:
userid \t user name \t email
- 将导出的用户信息更改为清单2所示的格式,然后保存到一个名为
User.txt
的文本文件中。 例如:
Jim Jhoon, Zon
jjz@01.ibm.com
jjz
清单2.导出的用户信息
Jim Jhoon, Zon jjz@01.ibm.com jjz
Hou liang, Zhen zhl@01.ibm.com zhl
Li Eric, Hans heh@01.ibm.com heh
Velu Lubin, Green vlg@01.ibm.com vlg
Kate Morton, David kmd@01.ibm.com kmd
导出CMVC缺陷或功能
在导出详细的缺陷和特征之前,我们需要分别获取缺陷和特征号的完整列表。 使用CMVC GUI客户端或命令可以轻松完成此操作。
- 将缺陷编号保存到名为
Def_no_list.txt
的文本文件中,如清单3所示。
清单3.导出的缺陷编号列表
19484
19838
19840
19866
19905
19906
19921
19943
- 在CMVC GUI客户端中查询功能列表,并将整个功能编号保存到文本文件
Fea_no_list.txt
,如清单4所示。
清单4.导出的功能编号列表
20226
19428
19167
19405
21318
20286
- 在Java程序中导出缺陷或功能详细信息
- 对于Def_no_list.txt文件中的每个缺陷名称,请在Java程序中调用
DefectView
命令以获取缺陷详细信息。 以您自己的格式保存。 - 对于Fea_no_list.txt文件中的每个功能名称,请在Java程序中调用
FeatureView
命令以获取功能详细信息并以您自己的格式保存。 您可以在下载部分找到完整的代码。
图4说明了我们存储在文本文件中的缺陷的详细内容。
图4.本文使用的缺陷或特征存储格式
导出CMVC源代码
- 我们需要使用CMVC GUI客户端或命令为CMVC中存储的所有文件生成源文件路径列表,然后将所有这些文件路径保存到文本文件File_path_list.txt中,如清单5所示。
清单5.导出的文件路径列表
build/build.xml
build/make.cmd
src/lib/db2jcc.jar
src/lib/j2ee.jar
src/rad_echat/src/com/ibm/lenovo/database/driver/LenovoDBManager.java
src/rad_echat/src/com/ibm/lenovo/database/driver/TestDB.java
src/rad_echat/src/com/ibm/lenovo/database/driver/TestDBCreate.java
src/rad_echat/WebContent/chat/ChatView_01252007.jsp
src/rad_echat/WebContent/chat/ChatView_12112006.jsp
src/rad_echat/WebContent/chat/ChatView.jsp
- 在Java程序中导出源代码:
- 对于File_path_list.txt文件中的每个源代码文件路径,请在Java程序中调用
FileView
命令以获取历史记录版本信息。 - 对于文件的每个版本,请调用
FileExtract
Java程序中的命令。
- 以您自己的格式保存特定的历史版本源代码内容和历史版本信息。 有关完整代码,请参见“可下载资源”部分。
- 对于File_path_list.txt文件中的每个源代码文件路径,请在Java程序中调用
清单6显示了历史版本信息存储格式。 版本信息保存在Path_historyver.txt文件中,在将历史记录版本导入Rational Team Concert时将使用该文件。
清单6.导出的文件历史记录版本信息
build/build.xml 1.1,jyoungmn,19428;1.2,jyoungmn,19428;1.3,elubin,19405;1.4,
jyoungmn,19405;1.5,dmorton,20286;1.6,dmorton,21318
build/make.cmd 1.1,jyoungmn,19167;1.2,jyoungmn,19428;1.3,jyoungmn,19405
src/lib/db2jcc.jar 1.1,eggerh,20279
src/lib/j2ee.jar 1.1,jyoungmn,19428
src/rad_echat/src/com/ibm/lenovo/database/driver/LenovoDBManager.java 1.1,ZSHAE,20226
src/rad_echat/src/com/ibm/lenovo/database/driver/TestDB.java 1.1,ZSHAE,20226
src/rad_echat/src/com/ibm/lenovo/database/driver/TestDBCreate.java 1.1,ZSHAE,20226
src/rad_echat/WebContent/chat/ChatView_01252007.jsp 1.1,ZSHAE,20226
src/rad_echat/WebContent/chat/ChatView_12112006.jsp 1.1,ZSHAE,20226
src/rad_echat/WebContent/chat/ChatView.jsp 1.1,ZSHAE,20226
导出的历史记录版本信息的格式如下:
file full path\t version,owner,defect/feature;…
图5显示了源历史记录数据的存储格式。 例:
build.xml@$1.1@$jyoungmn@$19428
图5.导出的源代码存储格式
我们对所有历史记录数据文件使用以下命名约定:
file name @$ version @$ owner @$ defect/feature
将历史记录数据导入Rational Team Concert
将用户导入Rational Team Concert
现在我们已经导出了所有必需的数据,我们可以开始使用名为User.txt的文件将用户导入Rational Team Concert。 如果只有几个用户,则手动导入它们可能会更快。 否则,有必要使用Jazz API进行此操作。
将缺陷或功能部件导入Rational Team Concert
接下来,我们将处理缺陷和特征导入。
- 根据“ 缺陷/特征映射”规则,分析每个导出的缺陷或特征数据文件,以获取基本属性。 您可以决定只迁移您感兴趣的字段,而不迁移所有字段。 清单7给出了核心的Java导入代码。
清单7.导入缺陷或功能的核心Java代码
private static class WorkItemInitialization extends WorkItemOperation {
private WorkItemAttributes workItemAttr;
public WorkItemInitialization(WorkItemAttributes workItemAttr) {
super("Initializing Work Item");
this.workItemAttr = workItemAttr;
}
@Override
protected void execute(WorkItemWorkingCopy workingCopy,
IProgressMonitor monitor) throws TeamRepositoryException {
IWorkItem workItem= workingCopy.getWorkItem();
// set the work item attribute one by one
// …
}
}
// work item creation
WorkItemInitialization operation =
new WorkItemInitialization(WorkItemAttribute att);
IWorkItemHandle handle = operation.run(workItemTypeTask, null);
IWorkItem workItem =
auditableClient.resolveAuditable(handle, IWorkItem.FULL_PROFILE, null);
int def_fec_id_new = workItem.getId();
// record the return work item id and
// the old CMVC defect/feature name mapping.
sbFeatureMapping.append(def_fec_id + "\t" + def_fec_id_new + "\r\n");
- 调用Rational Team Concert API创建工作项并记录返回的工作项ID。 导入特定代码版本需要工作项ID。 也就是说,我们将检入每个历史记录版本以及为该功能部件或缺陷创建的工作项ID。
- 之后,编写工作项ID和先前的CMVC缺陷编号,将其映射到Def_wrkitmID.txt文件,如清单8所示。
清单8.缺陷名称和工作项ID映射列表(示例)
20278 31
20279 32
20280 33
另外,编写工作项ID和先前的CMVC功能编号,将其映射到Fea_wrkitmID.txt文件,如清单9所示。
清单9.功能名称和工作项ID映射列表
20226 34
19428 35
19167 36
19405 37
21318 38
20286 39
在导入源代码时,将使用这些CMVC缺陷或功能编号以及Rational Team Concert工作项ID映射关系。 与CMVC中的缺陷或功能部件编号关联的源代码文件应在Rational Team Concert中更改为新的工作项ID。
将源代码导入Rational Team Concert
现在,我们有了版本历史记录信息文件Path_historyver.txt。 在我们的版本历史记录信息中,文件路径的第一部分是组件名称,例如“ build”和“ src”。
- 在您的Rational Team Concert工作空间中创建并共享组件文件夹,如图6所示。
图6. Rational Team Concert中的共享组件文件夹
- 在Java程序中导入源代码历史记录:
- 在Path_historyver.txt文件中循环每个源代码文件和每个历史记录版本,并创建一个具有原始缺陷或特征映射新工作项ID的更改集。
- 将具有更改集的源代码提交到Rational Team Concert工作空间releaseAWorkSpace ,然后将代码更改交付给Rational Team Concert releaseA流。
- 创建更改集时,最好在注释中添加CMVC版本信息。
清单10展示了核心的导入Java代码段。
清单10.导入源文件的核心Java片段
IFileItem fileItem = null;
if(isNewFile()) {
fileItem = (IFileItem) IFileItem.ITEM_TYPE.createItem();
} else {
fileItem = (IFileItem) workspaceConnection.configuration(myComponent)
.fetchPartialItem(fileItem, null, monitor);
fileItem = (IFileItem)fileItem.getWorkingCopy();
}
fileItem.setName(fileInfo.fileName);
fileItem.setParent(parentFolder);
FileLineDelimiter delimiter = FileLineDelimiter.LINE_DELIMITER_NONE;
IFileContent storedContent = contentManager.storeContent(
IFileContent.ENCODING_US_ASCII, delimiter,
new VersionedContentManagerByteArrayInputStreamPovider(
readFileToByteArray(fileInfo, version) ),
null, monitor);
fileItem.setContentType(IFileItem.CONTENT_TYPE_TEXT);
fileItem.setContent(storedContent);
fileItem.setFileTimestamp(new Date());
IChangeSetHandle changeSetHandle =
workspaceConnection.createChangeSet(myComponent, "--" + version.toString(),
false, monitor);
fileWorkItemmanager.createLink(workspace, changeSetHandle,
new IWorkItemHandle[]{handleWorkitem}, monitor);
// commit the change to workspace
workspaceConnection.commit(changeSetHandle,
Collections.singletonList(workspaceConnection.configurationOpFactory()
.save(fileItem)), monitor);
// deliver the changes to the stream
IChangeHistorySyncReport sync =
workspaceConnection.compareTo(streamConnection,
WorkspaceComparisonFlags.CHANGE_SET_COMPARISON_ONLY,
Collections.EMPTY_LIST, monitor);
workspaceConnection.deliver(streamConnection, sync, Collections.EMPTY_LIST,
sync.outgoingChangeSets(myComponent), monitor);
验证迁移结果
验证缺陷或功能
图7显示了本文示例的缺陷/特征迁移结果。
图7.迁移结果
验证源代码
图8显示所有代码文件都已导入到Rational Team Concert。
图8.源文件迁移结果
验证源代码历史记录
- 在releaseA(团队1)流层次结构中选择构建组件,然后右键单击并在下拉菜单上单击“显示—存储库文件”。
- 选择您要验证的文件(例如,组件内部版本的build.xml),然后右键单击并在下拉菜单上选择“显示历史记录”。 您应该能够查看所有历史记录版本。
图9和10显示了源文件的历史版本。
图9.源文件历史记录版本迁移结果,步骤1
图10.源文件历史记录版本迁移结果:步骤2
现在,您可以保留原始SCM系统中的项目资产,并享受Rational Team Concert的好处。