【IT168 专稿】
本文所述观点和方法只代表作者个人。所提供的方案或软件是“AS-IS”。
问题和需求
大约一年前,我所在的开发团队正式开始采用敏捷开发过程,并采用Rational Team Concert做为我们的管理系统。Rational Team Concert是一个非常全面和先进的软件开发管理系统。在我们团队逐步增加各种敏捷开发实践的过程中,RTC都提供了非常好的支持。但是由于我们开发的项目十分复杂,涉及到许多分布在世界各地不同团队的协作,而RTC服务器的管理和设置无法满足我们团队的一些特殊要求。本文主要介绍我们遇到的两个具体问题和解决方案,希望对您有所启发。
根据我们项目的特点,我们选取了CruiseControl做为持续集成的工具。但是却发现我们的RTC目前没有设置和构建服务器的集成。开发人员无法从RTC中了解到项目构建的状态。另外,在RTC中可以浏览一个工作部件的相关部件,但是只能看到它的父母和孩子部件,无法回溯到最上层的节点。而在我们的项目中,部件的层次比较多,手工寻找出某个工作部件的出处需要好多步。
技术背景
由于我们团队无法对RTC服务器进行设置或修改,为了解决以上两个问题,我们只能从客户端入手。幸运的是RTC提供了REST风格的Web服务,只要了解了它的细节完全可以完成一些特殊的要求。由于我们的开发人员大都使用FireFox浏览器,我们决定开发一个FireFox的插件。由这个插件根据用户的输入,发送Ajax请求到RTC服务器。而插件的开发则采用了编译后的GreaseMonkey的脚本。GreaseMonkey也是一个FireFox的插件,它使用大家喜闻乐见的javascript做为开发语言,提供的API更让用户可以方便的开发自己的插件。为了更好的了解RTC Web服务的细节,我们还使用FireBug调试器来分析协议的细节。
RTC服务器、安装了GreaseMonkey和FireBug插件的FireFox浏览器、和一个顺手的文本编辑器,这就是所有我们需要的工具。下面让我们一步步来解决问题吧。另外,我们的插件被命名为“Jazz Sidearm”。
解决方法详述
对于CriuseControl的集成,十分简单。因为,CC提供了一个Web界面,它的协议十分朴素。打开CC的主页,提交一个构建请求,从FireBug中可以看到一个编译构建请求的HTTP细节如下:
var buildurl = "http://"+hostandport+"/invoke?operation=build&objectname=CruiseControl+Project%3Aname="+project;
buildurl:是我们要发送的GET请求
hostandport:是CC服务器的主机名和端口
project:是需要构建的项目名称
对于RTC就相对复杂一些了,首先我在Jazz论坛中找到有关工作构件的Web API好像是“IWorkItemRestService”。然后再用浏览器打开一个工作构件的孩子节点,从FireBug的所有网络通信中果然找到了它:
'https://'+window.location.hostname+':'+window.location.port+'/jazz/service/com.ibm.team.workitem.common.internal.rest.IWorkItemRestService/workItemDTO2?includeHistory=false&id='+node,
window.location.hostname/port:是RTC的主机名/端口
node:是要查询的工作构建号码
这个请求的返回格式是SOAP,虽然不是大家喜闻乐见的JSON。但是人类还是可以读懂的。总之,它包含了我们需要的信息:工作构件的所有父亲和孩子。所以我们只要递归的调用这个请求,就可以得到它所有的长辈了。
由于我们对界面的要求不高,所以将两个功能放在一个窗口中,用一个按钮来控制它的显示和隐藏。当用户打开一个RTC页面时,插件动态将按钮插入页面顶端。
用户就可以在浏览RTC页面的时候,进行CC构建操作或查询某个工作构件的树结构了。
我们先按照GreaseMonkey的要求,开发Jazz Sidearm,然后用编译器生产独立的FireFox插件发布给每个人。