使用 Visual Basic 脚本语言集成 Rational Team Concert

使用 Rational Team Concert OSLC 功能将它与现有系统相集成

IBM Rational Team Concert 是一个敏捷的应用程序生命周期管理(ALM)解决方案,可帮助软件开发团队执行协作,无论他们身居何处。它拥有各种不同的功能,比如任务管理、缺陷管理、源代码配置管理、构建版本管理等。它实现了一个名为开放式生命周期协作服务(Open Services for Lifecycle Collaboration,OSLC)的开放服务,支持将与现有系统(比如项目管理或活动管理工具)的集成。本文将介绍如何通过 Visual Basic 脚本语言来利用 Rational Team Concert OSLC 服务,以及如何将它与现有系统相集成。

Takehiko Amano, IT 专家, IBM

作者的照片Takehiko Amano 是位于日本东京的 IBM 软件开发实验室的一名解决方案架构师。他是 Unleash the Labs 计划的成员。他关注的领域之一是全球协作式软件开发工具和流程。



2013 年 6 月 06 日

下载 IBM® Rational® Team Concert 试用版  |  在线试用 IBM Rational 协作化生命周期管理解决方案
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

场景

假设您为实现合规性,正在使用利用目前最新的技术构建的一个系统。必须输入开发信息。该系统已非常稳定,所以 IT 经理决定,除非出现与新操作系统补丁有关联的安全漏洞问题和缺陷,否则不维护系统。另外假设向开发团队引入了 IBM® Rational Team Concert™ 来支持全球交付。开发人员可能不希望浪费宝贵的时间向两个系统输入相同的信息。本文的目的是演示集成这类系统的技术。

图 1 给出了本文的一个目标图像。My System 用于输入某种类型的开发信息,它拥有系统的一个 COM+ 接口,而团队引入了 Rational Team Concert 来加速全球交付。Rational Team Concert 有一个名为 OSLC(开放式生命周期协作服务)的开放接口。

图 1. 目标是将一个现有系统 My System 与 Rational Team Concert 相集成
该图演示了两个独立系统的使用情况

使用这些样例脚本的免责声明和先决条件

样例脚本仅用作样例,应按原样使用。如果在试用脚本时收到一条类似以下消息的错误消息,可能是因为 Rational Team Concert 服务器被设置为使用自行认证:

msxml3.dll: System Error: -2146697191
msxml3.dll: The system cannot locate the resource specified.

如果使用 Microsoft Internet Explorer 访问服务器,那么您将获得一条证书错误消息。这是因为设置了自行认证,客户端不信任服务器。要使用样例脚本,必须先解决这个问题。

OSLC 是软件开发人员和组织的一个开放社区,致力于标准化各种软件开发生命周期工具的集成。它还定义了工具集成的规范。核心规范是使用 RDF(资源描述框架)作为一种数据表示,使用 RESTful Web 服务访问数据。但 My System 提供了自己的接口。在本例中,该接口是 COM+ (Component Object Model plus),可通过各种语言进行访问,包括 Microsoft Visual Basic 或 Visual Basic 脚本语言。

本文将介绍如何使用 Visual Basic 脚本语言访问两个系统。文中提供了样例脚本(请参见 下载 部分)。这些样例脚本使用了 OSLC Change Management 规范和 Rational Team Concert 作为工具。该脚本处理名为工作项 的数据。该脚本创建、更新或查询一个 Rational Team Concert 工作项。


OSLC 服务和这段 Visual Basic 脚本概述

图 2 显示了 OSLC 服务的流程图,它从 Root Service Document 流经 Catalog 和 Service Provider,最后到达 Work Item。

图 2. OSLC 服务概述
流程图

第一步是访问 Root Service Document。此服务提供了服务目录。例如,它提供了一个 CM(变更管理)服务目录(如图 2 所示)、一个 SCM(源代码管理)服务目录、一个项目区域管理服务目录,等等。在本文的示例中:

  • CM 提供了对工作项的访问服务。
  • 目录提供了每个项目区域的服务提供者 URL。
  • 服务提供者支持访问工作项。

该脚本使用一组名为 Microsoft XML 核心服务 (MSXML) 的服务。MSXML 可以一种快速且高效的方式处理基于 XML 的应用程序。它还拥有各种 API 来处理 XML 文档的内容。OSLC 使用 RDF 作为数据表示,MSXML 也可处理 RDF 文档。

表 1 给出了访问该脚本所提供的工作项的基本函数。

表 1. 操作一个 Rational Team Concert 工作项的基本函数
函数描述
JazzLogin()登录到 Jazz™ Team Server,它托管着 Rational Team Concert 应用程序。
CreateWorkItem()创建一个工作项
UpdateWorkItem()更新一个工作项
QueryWorkItems()使用条件查询工作项
CreateParentChild()在工作项之间创建父子关系

备注:
脚本中还有其他一些函数。本文介绍如何使用这些函数自动化工作项的创建和更新。然后介绍如何将它们与一个现有系统基础呢个。本文全篇省略了一些编码实践,比如全面的错误检查。


样例脚本概述

开始运行样例脚本之前,请看看清单 1,其中给出了脚本的主要部分。这将帮助您认识到使用该脚本访问 Rational Team Concert 工作项接口有多容易。

清单 1. 脚本的主要部分
'--------------
' Parameter definition
' CLM parameters
	url = "https://clm.example.com:9443/ccm"
	project = "TRADITIONAL"
	userid = "jazzadmin"
	passwd = "jazzadmin"
'-------------

	' Login to jazz application server
	Set http = JazzLogin(url, userid, passwd)

	' obtain service catalog from jazz root service.
	' obtain workitem factory (use default factory) and query service
	' update service is given original URL, not service url
	service_url = GetServicebyProjectName(http, url, project)
	factory_service = GetFactoryService(http, service_url)
	update_service = GetUpdateService(http, url)
	query_service = GetQueryService (http, service_url)


	'attrString has format such that
	'<attribute>,<value>,<attribute>,<value>

	' Sample workitem create 
	attrString = "dcterms:type,task"
	attrString = attrString&","&"dcterms:title,This is sample title"

	workItemId = CreateWorkItem(http, factory_service, attrString)
	If (workItemId = -1) then
			WScript.ECHO "Workitem creation failed"
	End If


	' Sample workitem update
	attrString = "dcterms:title"&","&"This is sample title with update"

	workItemId = UpdateWorkItem(http, update_service, workItemId, attrString)
	If (workItemId = -1) then
		WScript.ECHO "Workitem update failed"
	End If

	' run query 
	set resultSet = QueryWorkItems(query_service, "dcterms:identifier="&workItemID,
"dcterms:title")

	' display result set
	call DisplayResultSet(resultSet)
	set resultSet = Nothing

	' Exit the script with return status 0 (zero)
	WScript.Quit 0

使用脚本

在本节中,将了解如何使用该脚本访问 Rational Team Concert 工作项。

登录到 Rational Team Concert

第一步是登录到 Rational Team Concert。该脚本提供了一个 JazzLogin() 函数来完成此任务。

清单 2. 登录到 Rational Team Concert
 ' Login to jazz application server
Set http = JazzLogin(url, userid, passwd)

JazzLogin() 函数接受 3 个参数。

  • url 参数是 Rational Team Concert 的 URL(例如 https://rtc-server.example.com/ccm )。
  • 第二参数和第三个参数是用于登录 Rational Team Concert 的用户 ID 和密码。

成功登录后,它返回一个 MSXML2.XMLHTTP 对象,该对象基本上是服务器的一个 HTTP 连接。

获取 OSLC 服务

Rational Team Concert 提供了各种服务。该脚本提供了 3 个函数来获取它们:

  • 获取工厂服务:GetFactoryService() 函数
  • 工作项更新服务:GetUpdateService() 函数
  • 工作项查询服务:GetQueryService() 函数

清单 3 给出了获取工作项服务的过程。

清单 3. 获取工厂服务的样例代码
 service_url = GetServicebyProjectName(http, url, project)
factory_service = GetFactoryService(http, service_url)
update_service = GetUpdateService(http, url)
query_service = GetQueryService (http, service_url)

第一步是获取一个指定的 Rational Team Concert 项目的服务 URL。图 1 显示了 4 个步骤。但是,第 1 到 3 步在一个函数 GetServicebyProjectName() 内完成。获取服务 URL 后,GetFactoryService() 函数获取一个工作项创建服务。

指定工作项属性

创建或更新工作项之前,必须准备好该工作项的属性。这些属性使用以下格式创建为一个简单的字符串:

 <attribute1 >,<value1>,<attribute2>,<value2>,….

例如,当您希望创建仅有一个标题的工作项时,参数应为以下格式:

 dcterms.title, This is a sample title

当希望创建包含一个标题和一段描述的工作项时,可以采用以下方式指定参数:

 dcterms.title,This is title,dcterms.description, This is lengthy description

在样例脚本中,参数按清单 4 中所示的方式来准备。

清单 4. 准备参数的样例代码
attrString = "dcterms:type,task" 
attrString = attrString&","&"dcterms:title,This is sample title"

通过指定 dcterms:type,task,该脚本创建了一个 Task 类型的工作项。在将此参数更改为 defect 时,它将创建一个 Defect 类型的工作项。要获取工作项属性的完整列表,请参阅 Jazz.net 上的 Work Items Service provider for OSLC 2.0 CM Specification 页面。

创建和更新工作项的函数

表 2 给出了创建和更新工作项的函数列表。样例脚本还提供了一个用于在工作项之间设置父子关系的函数。

表 2. 3 个创建和更新工作项的函数
函数描述
CreateWorkItem(http, factory_service, attrString)此函数创建一个工作项。它接受三个参数。

http 是 JazzLogin() 函数返回的服务器的 HTTP 连接。

factory_service 是一个工作项创建工厂 URL。这个 URL 通过 GetFactoryService() 函数获得。

attrString 是一个工作项属性。
UpdateWorkItem(http, update_service, workItemId, attrString)此函数更新一个工作项。它接受 4 个参数。

http 是 JazzLogin() 函数返回的服务器的 HTTP 连接。

update_service 是更新一个工作项的 URL。

workItemId 是一个工作项的 ID 编号。

attrString 是一个工作项属性。
CreateParentChild (http, update_service, parentID, childIDs)CreateParentChild() 在由 parentId 和 childIds 指定的工作项之间创建父子关系。childIDs 是一个子工作项数组。

update_service 是一个更新工作项的 URL。该函数在内部调用 UpdateWorkItem() 函数。

在样例脚本中,可以按清单 5 和清单 6 中所示方式使用工作项的创建和更新。

清单 5. 创建一个工作项
workItemId = CreateWorkItem(http, factory_service, attrString)
清单 6. 更新一个工作项
workItemId = UpdateWorkItem(http, update_service, workItemId, attrString)

查询工作项和显示查询结果

QueryWorkitems() 和 DisplayResultSet() 可用于查询工作项和显示查询的结果。

QueryWorkitems() 函数参数在第 2 个参数和第 3 个参数中接受 oslc.where 和 oslc.select。为了演示这些值是如何构造的,可以想象清单 7 中的一种数据库查询语言。

清单 7. 一种养例数据库查询语言
db> select id, title where id=100 from database

此查询将返回记录的 idtitle 部分,其中 id 与编号 100 匹配。QueryWorkitems() 函数具有类似的行为。在样例脚本中,可像清单 8 中的代码一样使用它(稍微进行了修改,以表明该脚本将查询 id=100 的工作项)。

清单 8. 查询标识符等于 100 的工作项
set resultSet = QueryWorkItems(query_service, "dcterms:identifier=100”, "dcterms:title")

查询将返回多个工作项,具体情况取决于 where 子句。出于此原因,QueryWorkItems() 函数返回一个集合对象。提供了 DisplayResultSet() 函数,以便它能够以人类可读的格式输出返回的集合对象。该输出类似于大多数数据库查询输出。


使用样例脚本的示例

必须修改一些参数,才能试用样例脚本。清单 9 显示了指定参数的脚本部分。

清单 9. 脚本的一个参数定义部分
' Parameter definition
' CLM parameters 
    url = "https://clm.example.com:9443/ccm" 
    project = "TRADITIONAL" 
    userid = "jazzadmin" 
    passwd = "jazzadmin"

每个参数将在表 3 中解释。

表 3. 参数解释
参数解释
url Rational Team Concert 服务器 URL
project Rational Team Concert 存储库中的一个项目的名称
userid 用于登录到 Jazz Team Server 的用户 ID
passwd 用户 ID 的密码

如果运行该脚本,结果将类似于清单 10。

清单 10. 运行脚本后的输出结果
 dos>cscript OSLC-utility.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

503 This is sample title with update,503

执行该脚本会创建工作项 503 并更新同一个工作项。图 3 显示了 Eclipse 客户端中的实际工作项 GUI。

图 3. 该脚本创建的实际工作项 GUI
屏幕截图,Rational Team Concert 中的工作项
图 3. 该脚本创建的实际工作项 GUI
屏幕截图,Rational Team Concert 中的工作项

图 3 显示了 Overview 和 History 选项卡部分。History 选项卡的 Summary 字段表明此工作项有一个更新。该字段之前显示为 “This is sample title”,但它在脚本中已更改为 “This is sample title with update”。


扩展脚本用途的方式

您可针对各种用途而扩展该脚本。清单 11 是创建一个工作项(父)和 9 个子工作项的脚本部分。

清单 11. 创建父工作项和 9 个子工作项
' Parent workitem create 
attrString = "dcterms:type,task"
attrString = attrString>",">"dcterms:title,This is parent"
	parentId = CreateWorkItem(http, factory_service, attrString)
' Create 9 child workitems
For counter = 1 to 9
	attrString = "dcterms:type,task"
	attrString = attrString>",">"dcterms:title,This is ">counter>" Child"
	childIds(counter-1) = CreateWorkItem(http, factory_service, attrString)
		
Next
	
' Then set child workitems to the parent
call CreateParentChild(http, update_service, parentId, childIds)

工作项在进入循环之前被创建为父工作项。然后该脚本创建了 9 个子工作项。该工作项 ID 被设置为 array。这些父工作项和子工作项被传递到 CreateParentChild() 函数。该脚本执行过程的 GUI 表示如图 4 所示。

图 4. 从脚本返回的实际工作项 GUI 结果
该屏幕显示了包含 9 个子项的 Links 部分

图 4 表明 Links 选项卡拥有此脚本创建的子工作项的链接。


与另一个系统集成

目前为止,该脚本仅处理工作项的创建和一些更新,比如更新工作项信息或添加子工作项。该脚本的核心是提供与某个现有系统集成的最轻松的方式。这种集成应称为数据交换类型的集成(图 5)。

图 5. My System 和 Rational Team Concert 之间的集成战略
两个系统之间的交互简图

如果现有的系统有一个接口,比如 COM+,那么它可以提供一种访问 Visual Basic 脚本语言的更轻松的方法。一个典型的接口应类似于清单 12 中的代码。

清单 12. 访问 My System 中的信息的典型 Visual Basic 代码
Set app = CreateObject(“System.Application”) ' Create application object
Call app.login(“<user>”, “<password>”) ' Login to the system

set recordList = app.GetRecordList() ' Obtain list of records

' Loop to obtain information
For Each record In recordList
	' do something
Next

Call app.Quit() ' Terminate application.

在这个伪示例中,应用程序提供了一个接口来获取完整的记录,然后在某个循环中访问每条记录。可以对这个示例进行扩展,以创建 Rational Team Concert 工作项,如清单 13 所示。

清单 13. 扩展后可在 Rational Team Concert 中创建工作项的样例代码
Set app = CreateObject(“System.Application”)' Create application object
Call app.login(“<user>”, “<password>”) ' Login to the system

set recordList = app.GetRecordList() ' Obtain list of records

For Each record In recordList

	' convert record into attribute pairs
	attrString = ConvertRecord(record)

	Call CreateWorkItem(http, factory_service, attrString)

Next

Call app.Quit() ' Terminate application.

该循环已扩展,可调用 ConvertRecord() 伪函数,该函数应将 My System 记录转换为属性对。然后将属性对传递给 CreateWorkItem() 函数。在本示例中,所有记录信息都与 Rational Team Concert 相集成。完成此创建过程后,您应会注意到,集成脚本应使用 UpdateWorkItem() 函数在 My System 和 Rational Team Concert 之间交换数据。

理想情况下,系统应通过链接而不是数据交换来集成。有关链接类型的集成的更多信息,请参阅 Eclipse.org 上的 Eclipse Lyo 项目页面。此项目提供了 SDK 来实现链接类型的集成。


该脚本中使用的技术总结

因为您可能希望修改本文的样例脚本,所以这一节将介绍样例脚本的两个部分。清单 14 是 UpdateWorkItem() 函数中的代码。

清单 14. UpdateWorkItem() 函数的一部分
Set workItemDoc = CreateWorkItemDocument(attrString)

http.Open "PUT", update_url, False
http.setRequestHeader "Content-Type", "application/xml"
http.setRequestHeader "Accept", "application/xml"
http.setRequestHeader "OSLC-Core-Version", "2.0"
http.send(workItemDoc)

MSXML 技术允许以简单方式连接到 Web 服务器。例如,清单 14 中的第 1 行是使用指定的 URL 打开一个 HTTP PUT 请求。该连接首先发送头部信息,然后发送 CreateWorkItemDocument() 函数创建的实际的 XML 文档。一定要在头部中指定 OSLC-Core-Version,以告诉 Rational 服务器与 OSLC V2.0 规范交互。

该脚本中使用多种 XML 操作函数。清单 15 给出了 XML 文档操作的一部分。

清单 15. XML 文档操作的一部分
 set doc = Http.ResponseXML
set elements = doc.getElementsByTagName("oslc_cm:ChangeRequest")

http.ResponseXML 获取 Rational Team Concert 服务器返回的 XML 文档对象。doc.getElementsByTabName() 用于在 XML 文档中查找某个标记。通过使用此方法,很容易在 XML 文档中找到与该标记有关的信息。一种替代方法是使用 XPath,但样例脚本中没有使用该方法。有关 MSXML(Microsoft XML 核心服务)的更多信息,请参阅 MSDN.microsoft.com 上的 MSXML 文档


致谢

诚挚地感谢 Paul Weiss 和 Ken Kumagai 指导作者撰写本文。


下载

描述名字大小
样例脚本和自述文件Sample_Scripts_and_README.zip10KB

参考资料

学习

获得产品和技术

  • Jazz.net 下载 Rational Team Concert,并在多达 10 个项目上免费试用它,只要您愿意(需要注册)。如果您喜欢,可在沙盒中试用它,无需将它安装在您自己的系统上。
  • IBM Rational Team ConcertRTC)是一个基于 Jazz 平台技术的实时协作式软件交付环境,可以帮助跨地域分布的开发团队简化协作开发过程,并使其软件交付过程实现自动化管理。

    免费下载:

  • 以最适合您的方式 评估 IBM 软件:下载试用版,在云环境中使用它,或者在 SOA 沙盒 中花几小时学习如何高效地实现面向服务的架构。

讨论

条评论

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=932910
ArticleTitle=使用 Visual Basic 脚本语言集成 Rational Team Concert
publish-date=06062013