情境
假设您在那里使用的是当时由最新技术构建的系统,以实现合规性。 必须输入开发信息。 系统变得足够稳定,因此IT经理决定不维护系统,除非存在安全漏洞问题和与新OS补丁相关的缺陷。 还假定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:系统错误:-2146697191 msxml3.dll:系统找不到指定的资源。
如果使用Microsoft Internet Explorer访问服务器,则会收到证书错误消息。 原因是客户端不信任服务器,因为设置是自认证的。 为了能够使用示例脚本,您必须首先解决此问题。
OSLC是一个由软件开发人员和组织组成的开放社区,用于标准化各种软件开发生命周期工具的集成。 它还定义了工具集成的规范。 核心规范是使用RDF(资源描述框架)作为数据表示形式,并使用RESTful Web服务访问数据。 但是我的系统提供了自己的界面。 在此示例中,它是COM +(加上组件对象模型),可以通过各种语言(包括Microsoft Visual Basic或Visual Basic脚本语言)进行访问。
本文介绍如何使用Visual Basic脚本语言访问两个系统。 本文提供了示例脚本(请参见“可下载资源”部分)。 这些样本脚本使用OSLC变更管理规范和Rational Team Concert作为工具。 该脚本处理称为workitem的数据。 该脚本可以创建,更新或查询Rational Team Concert工作项。
OSLC服务和此Visual Basic脚本概述
图2显示了OSLC服务的流程,该服务从根服务文档到目录和服务提供者,再到工作项。
图2. OSLC服务概述
第一步是访问根服务文档 。 该服务提供服务目录。 例如,它提供了CM(变更管理)服务目录(如图2所示),SCM(源代码管理)服务目录,项目区域管理服务目录等。 在本文的此示例中:
CM提供对工作项的访问服务。 目录为每个项目区域提供服务提供商URL。 服务提供商可以访问工作项目。
该脚本使用了一组称为Microsoft XML Core Services(MSXML)的服务。 MSXML可以快速有效地处理基于XML的应用程序。 它还具有用于处理XML文档内容的各种API。 OSLC使用RDF作为数据表示形式,而MSXML也可以处理RDF文档。
表1显示了访问脚本提供的工作项的基本功能。
表1.操作Rational Team Concert工作项的基本功能
功能 描述
JazzLogin() 登录到托管Rational Team Concert应用程序的Jazz™Team Server。 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()函数采用三个参数。
url参数是Rational Team Concert的URL(例如,https://rtc-server.example.com/ccm)。 第二个和第三个参数是登录n到Rational Team Concert的用户标识和密码。
成功登录后,它将返回MSXML2.XMLHTTP对象,该对象基本上是与服务器的HTTP连接。
获取OSLC服务
Rational Team Concert提供各种服务。 该脚本提供了三个函数来获取它们:
获取工厂服务: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显示了四个步骤。 但是,步骤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的类型的工作项。 当将此参数更改为“缺陷”时,它将创建“缺陷”类型的工作项。 要获取工作项属性的完整列表,请参阅Jazz.net上的OSLC 2.0 CM规范的工作项服务提供程序 。
创建和更新工作项功能
表2列出了工作项创建和更新功能。 示例脚本还具有设置工作项之间的父子关系的功能。
表2.提供了三个用于创建和更新工作项的功能
功能 描述
CreateWorkItem(http,factory_service,attrString) 此功能创建一个工作项目。 它需要三个参数。 http是JazzLogin()函数返回的服务器的HTTP连接。 factory_service是创建工作项的工厂URL。 该URL是通过GetFactoryService()函数获得的。 attrString是工作项属性。 UpdateWorkItem(http,update_service,workItemId,attrString) 此功能更新工作项目。 它有四个参数。 http是JazzLogin()函数返回的服务器的HTTP连接。 update_service是用于更新工作项的URL。 workItemId是工作项的ID号。 attrString是工作项的属性。 CreateParentChild(http,update_service,parentID,childID) CreateParentChild()在parentId和childIds指定的工作项之间创建父子关系。 childID是一组子工作项。 update_service是用于更新工作项的URL。 此函数在内部调用UpdateWorkItem()函数。
在示例脚本中,使用了创建和更新工作项,如清单5和清单6所示。
清单5.创建一个工作项
workItemId = CreateWorkItem(http, factory_service, attrString)
清单6.更新工作项
workItemId = UpdateWorkItem(http, update_service, workItemId, attrString)
查询工作项并显示查询结果
QueryWorkitems()和DisplayResultSet()可用于查询工作项并显示查询结果。
QueryWorkitems()函数参数在第二个和第三个参数中使用oslc.where和oslc.select。 为了说明如何构造这些值,请想象一下清单7中的数据库查询语言。
清单7.示例数据库查询语言
db> select id, title where id=100 from database
此查询将返回记录ID和标题的一部分,其中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.参数说明
参数 说明
网址 Rational Team Concert服务器URL 项目 Rational Team Concert存储库中的项目名称 用户身份 登录到Jazz Team Server的用户标识 密码 用户标识的密码
如果运行脚本,结果将如清单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
图3显示了Overview和History选项卡的一部分。 “历史记录”选项卡的“摘要”字段显示此工作项已更新。 它是“这是示例标题”,但是在脚本中已将其更改为“这是具有更新的示例标题”。
扩展使用脚本的方法
您可以将脚本扩展为多种用途。 清单11是脚本的一部分,该脚本创建一个工作项(父项)和九个子工作项。
清单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)
在循环之前创建一个工作项作为父工作项。 然后,脚本创建了九个子工作项。 工作项ID设置为array 。 此父级和子级工作项将传递给CreateParentChild()函数。 此脚本执行的GUI演示如图4所示。
图4.脚本的实际工作项GUI结果
图4显示“链接”选项卡具有该脚本创建的子工作项的链接。
与其他系统集成
到目前为止,该脚本仅操纵工作项的创建和一些更新,例如更新工作项信息或添加子工作项。 该脚本的核心是提供与现有系统集成的最简单方法。 这种集成应该称为数据交换集成类型(图5)。
图5. My System和Rational Team Concert之间的集成策略
如果现有系统具有COM +之类的接口,则它可能会提供一种更简单的方法来访问Visual Basic脚本语言。 一个典型的接口应该类似于清单12中的代码。
清单12.用于访问“我的系统”中信息的典型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()伪函数,该函数有望将“我的系统”记录转换为属性对。 然后将其传递给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中的第一行是打开具有指定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核心服务)的更多信息,请参见MXML.microsoft.com上的MSXML文档 。
致谢
作者衷心感谢Paul Weiss和Ken Kumagai撰写本文的指导。
翻译自: https://www.ibm.com/developerworks/rational/library/rational-team-concert-visual-basic/index.html
相关资源:jdk-8u281-windows-x64.exe