求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
   
分享到
使用HTTP网络技术构建灵活的Rational ClearCase系统
 

作者:王 颖初,发布于2012-8-17,来源:IBM

 

目录:

第1 部分: 在 Web 浏览器中监控 Rational ClearCase 运行状态

第 2 部分: 用 Web Service 查询 RationalClearcase 中的 UCM 项目信息

第 1 部分: 在 Web 浏览器中监控 Rational ClearCase 运行状态

在Web浏览器中监控Rational ClearCase运行状态

使用 Java 语言和 Web 2.0 技术开发基于 Web 浏览器的 ClearCase 监控程序

Rational Clearcase 是一套功能全面的软件配置管理(Software Configuration Management,SCM)解决方案。但是 ClearCase 的系统安装与运行维护管理非常复杂,很多系统运行相关的功能、状态监控任务以及 UCM 项目状态查询操作都需要通过系统管理员在服务器端执行复杂的基于命令行的 ClearCase 指令。这一过程非常复杂繁琐,也无法供 ClearCase 普通用户使用。

本系列文章共有两篇,以一个实际生产环境中使用的 ClearCase 监控系统的开发为例,向读者介绍如何使用基于 Java 语言的 Web2.0 和 Web Service 技术来开发一个 Linux 环境下的 ClearCase 监控和 UCM 项目查询系统。本文是该系列的第一部分,将向您演示如何使用 Java 语言和 Web2.0 技术开发一个基于 Web 浏览器的 ClearCase 系统运行和状态监控程序。

本系列文章共有两篇,以一个实际生产环境中使用的 ClearCase 监控系统的开发为例,向读者介绍如何使用基于 Java 语言的 Web2.0 和 Web Service 技术来开发一个 Linux 环境下的 ClearCase 监控和 UCM 项目查询系统。本文是该系列的第一部分,将向您演示如何使用 Java 语言和 Web2.0 技术开发一个基于 Web 浏览器的 ClearCase 系统运行和状态监控程序。

Rational ClearCase 系统运行和状态监控程序应用场景介绍

Rational ClearCase(以下简称 ClearCase)是一套建立在服务器 - 客户机体系结构之上的软件系统。为了使用 ClearCase 的版本控制服务,终端用户需要使用各种 ClearCase 客户端(CCRC,CC Web 和 CC Native Client 等)来访问服务器主机。这些客户端只提供了访问处理 ClearCase 中存储的源代码数据所需的各种功能,并没有提供监控 ClearCase 服务器运行状态所需功能。这些服务器运行状态信息只能由 ClearCase 系统的管理员在服务器主机上通过使用 cleartool 或操作系统命令来得到。但是在软件项目的开发过程和 ClearCase 系统的日常维护中,项目中的各个成员都需要了解某些 ClearCase 主机的运行状态信息。例如 ClearCase 系统管理员需要监控 ALDB、DB、VOB 等服务的运行状态,软件项目的开发者和项目经理可能需要了解 view 服务器运行状态和系统运行时许可证分配状态等信息。

在常规的方式下,为了获得这些服务器主机状态信息,ClearCase 管理员需要连接到服务器主机并执行相应的命令行语句,或者编写相应的 shell 命令脚本并执行。而软件项目的开发者和项目经理等不具有 ClearCase 命令语句使用环境和技能的项目成员则只能求助于系统管理员来获得所需信息。根据软件开发团队的不同地理和行政组织结构,这一过程有可能非常的缓慢低效,同时会给 ClearCase 系统管理员带来非常大的工作量。

而在使用本文所述的基于 Web 浏览器的 ClearCase 系统运行和状态监控程序时,项目团队中的各个成员只需要打开任意的 Web 浏览器并输入本监控程序的 Http 地址即可在浏览器窗口中获得所需的各类系统运行信息。这些信息具有良好的组织结构和图形化的表现形式,便于各类使用者了解。同时可以消除 ClearCase 系统管理员的大量重复性劳动。图 1 是使用这两种方式的流程对比。

图 1. 常规方式和使用 Rational ClearCase 系统状态监控程序方式的流程对比

图 2 是一个真实运行的 ClearCase 监控系统的截图。在本文的以下部分首先会介绍一些在 ClearCase 中经常使用的系统运行和状态监控指令 , 之后将介绍如何使用 Java 和 Web2.0 技术来开发一个类似图 2 所示的通过 Web 浏览器实时远程执行这些 ClearCase 命令行指令并将运行结果显示在浏览器中的状态监控程序。

图 2. 真实 Rational ClearCase 监控系统界面

使用服务器端命令行指令进行 ClearCase 系统监控

ClearCase 是一个分布式的应用软件 , 它的大多数的操作涉及到服务器主机和运行在这些主机上的一些操作系统进程,清单 1 显示了一个真实运行在 Linux 平台上的 ClearCase 主机中的一些主要进程。

清单 1. ClearCase 的主要进程

				
[root@ccServer ~]# pstree -la
 ......
 ├─albd_server
 │├─admin_server -S13:18,tcp
 │├─db_server -S13:18,tcp
 │├─db_server -S13:18,tcp
 │├─db_server -S13:18,tcp
 │├─syncmgr_server syncmgr_server -S13:17,tcp
 │├─view_server /local/views/IRM_Admin_DODv3_DEV.vws -u
   d75f1a85.b14a11dd.869c.00:09:6b:09:9b:5c -S13:18,udp:19,tcp
   │├─vob_server /vob_storage/irm/irm_doc.vbs -S13:17,udp
   │├─vob_server /vob_storage/irm/irm_pvob.vbs -S13:17,udp
   │├─vob_server /vob_storage/irm/irm_src.vbs -S13:17,udp
   │└─vobrpc_server /vob_storage/irm/irm_src.vbs -S13:18,tcp
 
...... 

在配置了 VOBs 和 Views 本地支持的 ClearCase 主机上,不论是否有 VOB 或者 View 已被创建, albd_server 和 admin_server 两个服务器进程均会运行。其他的服务进程将根据管理 VOBs 和 Views 的需要而启动长驻在主机上,各个进程的主要功能如下:

albd_server:当启动 ClearCase 时 albe_Server 首先被启动 , 它在需要的时候启动和停止其他的 ClearCase 服务。当停止 ClearCase 时 albd_Server 服务停止所有在主机上的其他的服务,然后退出。

admin_server:完成各种 ClearCase 管理支持功能。

view_server:一个常驻进程,管理着 View 服务器上指定的活动 View。

vob_server:对于每个 VOB,一个常驻的 vob_server 的进程运行在 VOB 的服务器上。它操纵存储在 VOB’s 存储池中的数据并响应客户端进程的请求。

db_server:管理 VOB 数据库事务并响应客户端程序发送的请求。

vobrpc_server:操作并响应来自网络的 view_server 进程的请求。

为了确认服务器中 ClearCase 服务是否在正常运行,可以使用命令 : ps -ef | grep albd_server 检查 albd_server 进程的运行状态 , 以下为一个正常运行的输出结果 :

清单 2. 检查 albd_server 进程运行状态

				
[root@ccServer ~]# ps -ef | grep albd_server
 root 3199 1 0 Apr16 ? 00:00:53 /opt/rational/ClearCase/etc/albd_server
 root 28718 27822 0 17:46 pts/2 00:00:00 /usr/bin/ksh -c ps -ef | grep albd_server
 root 28721 28718 0 17:46 pts/2 00:00:00 grep albd_serve 

为了确认 VOB 服务是否正常运行 , 可以使用命令 : ps -ef | grep vob_server 检查 vob_server 进程的运行状态 , 以下为一个正常运行的输出结果 :

清单 3. 检查 vob_server 进程运行状态

				
[root@ccServer ~]# ps -ef | grep vob_server
 ccadmin 4996 3199 0 Apr16 ? 00:00:00 vob_server /vob_storage/irm/irm_pvob.vbs -S12:16,udp
 ccadmin 6377 3199 0 Apr16 ? 00:00:25 vob_server /vob_storage/irm/irm_src.vbs -S12:16,udp
 ccadmin 6405 3199 0 Apr16 ? 00:00:01 vob_server /vob_storage/irm/irm_doc.vbs -S12:16,udp
 root 28728 27822 0 17:46 pts/2 00:00:00 /usr/bin/ksh -c ps -ef | grep vob_server
 root 28732 28728 0 17:46 pts/2 00:00:00 grep vob_server 

ClearCase 中还内置了一个称为 cleartool(/usr/atria/bin/cleartool) 的命令行工具 , 它包含有很多的子命令可以用来进行系统监控 , 以下是其中常用的一些 :

/usr/atria/bin/cleartool -version : 显示 ClearCase 系统的版本信息。

/usr/atria/bin/cleartool hostinfo -l : 显示 ClearCase 主机信息 ( 包括注册表 , 许可证服务器 , 操作系统等信息 )。

/usr/atria/bin/cleartool lsclients -host `hostname` -type license : 显示连接该主机的所有客户端信息。

/usr/atria/bin/cleartool lsvob -long : 显示该主机中的所有 VOB 的详细信息。

/usr/atria/bin/cleartool lsview -long : 显示该主机中的所有 View 的详细信息。

/usr/atria/bin/cleartool getlog albd : 显示该主机中的 ClearCase 主服务的日志信息。

除了 cleartool 外 ,ClearCase 中还包含其他的一些服务器端命令行工具 , 例如 clearlicense(/opt/rational/ClearCase/bin/clearlicense) 命令可以用来显示 ClearCase 主机中的许可证信息和实时使用状况。
使用 Java 和 Web 2.0 技术开发 ClearCase 状态监控程序

本文所述 ClearCase 状态监控程序是一个运行在 ClearCase 服务器主机中的轻量级的 Web 程序 , 它有一个使用 JSP+Servlet 编写的 Web 用户界面和一个用来执行 ClearCase 状态监控指令的操作系统进程调用组件。用户在 Web 用户界面中调用 javascript 方法来运行监控指令。通过 Web2.0 技术 ,javascript 方法被直接映射为操作系统进程调用组件中的 Java 方法 , 这些 Java 方法使用操作系统进程执行上文已经介绍过的 ClearCase 服务器端命令 , 并直接将命令执行结果返回 Web 用户界面中。图 3 是本文所述 ClearCase 状态监控程序的基本结构。

图 3. Rational ClearCase 状态监控系统基本结构图

本监控程序逻辑上由操作系统进程调用组件,Web 用户界面程序和 JSP/Servlet 容器三部分组成 , 以下是各个部分的功能和使用技术介绍 :

操作系统进程调用组件 :

监控系统中执行的所有系统命令行指令都会通过操作系统进程调用组件来执行 , 该组件由 Java 语言编写 . 由位于 com.cn.ibm.csdl.ecm.build.nerveCell.util.nativeCommand 包中的以下四个类组成:

NativeCommand 类:通过调用 java.lang.Runtime.getRuntime().exec(String cmdarray[]) 来产生一个操作系统进程对象 java.lang.Process, 并在这个进程对象中执行操作系统命令行指令并将指令执行结果以 CommandExeResult 对象的形式返回给调用者。

CommandExeResult 类:操作系统进程命令执行结果的 Java 对象表示,包含命令运行返回数据,异常数据,return code 和命令执行结果状态等信息。

OS 类:储存供不同操作系统使用的进程调用所需信息。

RemoteCommandUtil 类:组件工具类,提供方法将 CommandExeResult 对象中的信息转换为可以在 HTML 中显示的字符串形式的数据。

详细代码请参考本文附件中的 eclipse 项目工程。

Web 用户界面程序 :

Web 用户界面程序是状态监控系统的用户操作界面 , 使用 JSP+Servlet 编写 , 它的主要功能是执行 Web 页面中定义的 ClearCase 状态监控 javascript 方法 , 这些 javascript 方法调用会被转化为服务器端相对应的 Java 方法调用。当 Java 方法执行完毕后 , 方法的返回结果会通过 javascript 回调函数显示在 Web 页面上。Web 用户界面程序中使用 DWR 来耦合浏览器端的 javascript 代码和服务器端的 Java 代码。这一方法极大的减少了程序开发的难度和所需时间。

DWR 是一套开源的 Web2.0 类库 , 它包含服务器端 Java 库、一个 DWR Servlet 和一套 JavaScript 库。对于需要发布到浏览器中的每个 Java 类,DWR 首先会使用部署在 Web 应用程序中的 DWR Servlet 动态地生成包含在 Web 页面中的 javaScript( 这些 javaScript 包含存根函数,代表 Java 类上的对应方法并在后台执行 XMLHttpRequest 操作 )。之后 DWR 会把浏览器端的 javascript 用户请求转化成对服务器端的 Java 对象的方法调用 , 并把方法的返回值放置在 Servlet 响应中发送回浏览器客户端DWR 的配置十分简单 , 首先需要在 Web 程序的 web.xml 中定义如下的 servlet 和 servlet mapping 配置 :

清单 4. 在 web.xml 中配置 DWR servlet

				
<servlet-name>dwr-invoker</servlet-name>
   <display-name>DWR Servlet</display-name>
   <description>Direct Web Remoter Servlet</description>
   <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
 </servlet>
 <servlet-mapping>
   <servlet-name>dwr-invoker</servlet-name>
   <url-pattern>/dwr/*</url-pattern>
 </servlet-mapping>

之后需要在 DWR 的配置文件 dwr.xml( 该文件和 web.xml 相同 , 位于 WEB-INF 目录中 ) 中定义需要转化的 Java 类和相对应的 javascript 对象名称 , 以下 dwr.xml 示例文件中将一个名为 com.cn.ibm.csdl.ecm.build.nerveCell.util.nativeCommand.RemoteCommandUtil 的 Java 类映射为一个名称为 RemoteCommandUtil 的 javascript 对象。

清单 5. 在 dwr.xml 中配置 Java 和 javascript 映射

				
<dwr>
   <allow>
   <create creator="none" javascript="RemoteCommandUtil">
   <param name="class" value="com.cn.ibm.csdl.ecm.build.nerveCell.util.
   nativeCommand.RemoteCommandUtil"/>
   </create>
   </allow>
 </dwr> 

当 DWR 的服务器端配置完成后 , 就可以在 Web 页面中通过 javascript 来直接调用服务器端的 Java 方法。以下的代码示例通过 javascript 对象 RemoteCommandUtil 调用了服务器端的 Java 对象的 executeSingleRemoteCommand(String commond) 方法 , 并将返回结果传递到了 javascript 回调函数 displayGeneratedDate() 中。

清单 6. 调用 DWR javascript

				
 <script type='text/javascript'src='<%=request.getContextPath()%>/dwr/engine.js'></script>
 <script type='text/javascript'src='<%=request.getContextPath()%>/dwr/util.js'></script>
 <script type='text/javascript'src='<%=request.getContextPath()%>/dwr/interface/RemoteCommandUtil.js'>
 </script>
 <script type="text/javascript">
    function displayGeneratedDate(str){
       alert(str);
   }
   RemoteCommandUtil.executeSingleRemoteCommand("date",displayGeneratedDate);
 </script> 

如图 4 所示,本文所述的 Web 用户界面程序中使用 DWR 将操作系统进程调用组件中的 Java 类 RemoteCommandUtil 绑定在 javascript 对象 RemoteCommandUtil 上。通过在 Jsp 页面中执行 javascript 方法来远程运行 ClearCase 服务器端状态监控指令。

图 4. Web 用户界面程序 javascript /Java 方法调用映射

DWR.png

以下的代码片断通过 javascript 对象 RemoteCommandUtil 直接执行了远程主机中的操作系统命令“ ps -ef | grep albd_server ”,并将命令执行结果实时的返回给 javascript 回调函数 displayClearCaseALBDSERVERStatus(str)。displayClearCaseALBDSERVERStatus 函数会使用适当的 javascript 方法将这一执行结果显示在 Jsp 页面中。

清单 7. 调用 ClearCase 监控指令

				
<script type="text/javascript">
 function displayClearCaseALBDSERVERStatus(str){
   //javascript program logic to display albd_service status on web page
   }
 RemoteCommandUtil.executeSingleRemoteCommandForHTML(
 "<%=monitorServerName%>","ps -ef | grep albd_server",displayClearCaseALBDSERVERStatus);
 </script> 

通过使用这一方法,我们可以在 Web 用户界面程序的 Jsp 中运行任意的 ClearCase 状态监控指令并实时将结果显示在页面中。

JSP/Servlet 容器 :

监控系统的 Web 用户界面程序使用 JSP+javascript+DWR 编写 , 为此需要提供一个 JSP/Servlet 容器来做为它的运行环境。本系统使用 Jetty 做为这一环境。Jetty 以 jar 包的形式发布它的系统操作 API, 通过调用这些 API, 开发人员可以轻易的将 Jetty 容器实例化成一个 Java 对象,从而可以简便的为一些独立运行(stand-alone)的 Java 程序提供轻量级的 JSP/Servlet 支持。清单 8 中的 Java 代码示例 , 在地址 http://hostname:9990/ccmonitor 上提供了对目录”./ccmonitorWebApp”中的 web 程序的 JSP/Servlet 服务支持,(ccmonitorWebApp 目录中储存了本文所示的 Web 用户界面程序)。

清单 8. 使用 Jetty 为 Web 用户界面程序提供 JSP/Servlet 服务支持

				
public void StartServer(){
   int server_HTTP_Port=Integer.parseInt("9990");
   org.mortbay.jetty.Server server =
   new org.mortbay.jetty.Server(server_HTTP_Port);
   String webappPath = "./ccmonitorWebApp";
   String contextPath = "/ccmonitor";
   org.mortbay.jetty.webapp.WebAppContext webapp =
   new org.mortbay.jetty.webapp.WebAppContext(webappPath, contextPath);
   org.mortbay.jetty.handler.HandlerList hl =
   new org.mortbay.jetty.handler.HandlerList();
   hl.setHandlers(new org.mortbay.jetty.Handler[]{webapp});
   server.setHandler(hl);
   try {
   server.start();
   } catch (Exception e) {
   e.printStackTrace();
   }
 }

当执行了方法 StartServer() 后 , 我们就可以在浏览器中通过访问地址 http://hostname:9990/ccmonitor 来使用本文所开发的 ClearCase 系统运行和状态监控程序,这一系统使用的 Jsp 和 javascript 请参考本文附件中的 eclipse 项目工程。

结束语

本文介绍了如何使用 Java 和 Web2.0 技术来开发一个 ClearCase 系统运行和状态监控程序。通过使用该监控程序 , 可以极大的减少 ClearCase 系统管理员的日常维护工作量。同时本文所介绍的方法也可以为 ClearCase 系统的管理维护和应用方式提供一个新的思路。

第 2 部分: 用 Web Service 查询 RationalClearcase 中的 UCM 项目信息

UCM 项目信息查询系统应用场景介绍

在 Clearcase UCM 模型中包含了很多的记录项目开发过程和进度变化的信息,例如项目的每个子开发流中包含了各个分支的开发状态信息,每个基线中包含了各个不同时刻的项目开发活动信息等。这些信息对软件项目开发的各个环节都有很大的帮助。例如在软件产品的构建过程中可以通过查询 UCM 活动变更集来获取每次产品构建的代码变更状况,在项目进度追踪过程中可以通过查询各个 UCM 组件的基线来获取不同时间点上项目开发的进度状况。在现有的 Clearcase 客户端程序 (CCRC,CC Web 和 CC Native Client 等 ) 中,只提供了非常有限的基于 UI 操作的 UCM 项目信息查询功能(例如可以通过鼠标点击的方式查询特定基线中包含的变更集等功能)。这些功能无法满足软件开发中各个环节的需求,同时现有客户端没有提供这些功能的计算机程序编程接口,开发流程中使用的其他软件(例如产品构建程序)无法从这些已有的客户端程序中获取 UCM 信息。

在常规的方式下 , 为了获取这些 UCM 信息,软件开发项目组织需要编写自定义的脚本程序 ( 这些脚本程序通常由 Perl 和 Shell 语言编写,包含了查询所需 UCM 信息的 cleartool 命令行指令 ) 并按照需要在 Clearcase 服务器主机上运行这些程序 , 之后需要以某种方式从服务器主机中下载执行结果并解析所需 UCM 信息。另一种方法是使用 Clearcase 提供的 Rational Team API 编写基于 Java 语言的自定义客户端程序来查询所需 UCM 信息,但是 Rational Team API 只能在已安装了 Clearcase 客户端的计算机中运行,同时只能由 Java 语言编写的程序调用。上述两种方法需要结合使用多种不同的编程语言,或者有一定的使用局限性。并且他们都涉及到多台不同物理机器的交互以及多个不同角色的项目成员的协同工作。过程非常的复杂,并且没有很好的可维护性和功能可扩展性。

而在使用本文所述的 UCM 项目信息查询系统时,软件项目开发团队只需要在各种项目开发支持软件中使用由任意语言编写的 Web Service 客户端程序来访问 UCM 查询系统即可获取所需的项目 UCM 信息。这一过程不需要安装 Clearcase 客户端程序,也无需多个不同角色的项目成员的协同工作。开发、使用的过程非常简便,同时能够使软件开发团队以一种统一的方式在各种异构的软件系统中获取到 Clearcase 服务器中的 UCM 项目状态信息。

图 1 是使用上述两种方式的系统结构对比。在本文的以下部分中首先会介绍 Clearcase UCM 的基本概念和相关的命令行查询指令,之后将介绍如何使用 Java 和 Web Service 来开发通用的 UCM 项目信息查询系统,这一查询系统能够以 SOAP Web Service 的方式向客户端程序提供 Clearcase UCM 查询服务。

图 1. 常规方式和使用 UCM 项目信息查询系统方式的结构对比

Rational ClearCase UCM 的基础概念

UCM (Unified Changed Management), 意为统一变更管理模式,是管理软件开发过程中所有变更的 " 最佳实践 "。它定义了一个可以立即用于软件开发项目的一致并基于活动的变更管理流程。 UCM 通过抽象层次的提升简化了软件开发,从而使得软件开发团队能够从更高的层次根据活动(activity)来管理变更。通过 UCM,一个开发活动可以自动地同其变更集(changeset, 封装了所有用于实现该活动的项目工件)相关联。以下是 UCM 中常用对象的简要介绍:

  • 项目(Project):包含了软件产品开发的配置管理所需要的 UCM 元数据和一些配置信息,例如 Component、Baseline,Stream 等。
  • Project VOB(PVOB):存储 UCM 所需的一些特殊的信息(如 Proejct,Stream,Activity 及 Change Set 等)的 VOB,UCM Project 的信息必须保存在 PVOB 中。
  • 构件(Component):软件开发项目中的代码、文档等按一定的目录结构组织而成的可重用的工件集合。Component 与 Project 相关联,Project 管理的所有的对象都从属于某一个特定的 Component ,每个 Project 至少有一个 Component。
  • 开发流(Development Stream):为每个开发人员准备的一个独立的开发环境,包含了在这个开发流上的 Activity 与修改的配置项的版本信息,UCM 通过开发流简化了并行开发的配置管理工作。
  • 集成流(Integration Stream):代表项目开发的代码主干,每个开发流都是集成流的一个分支,开发人员在开发流上完成工作后,再将工作结果提交到集成流中,每个 Project 都有一个 Integration Stream。
  • 基线(Baseline):基线是一个 Component 在某一特定时刻的快照。它包括在此时这一 Component 中所有对象的版本信息集合。当配置一个新工作流时,基线被用来指定哪些版本将被选在此流中。
  • 活动(Activity):UCM 模式中的一个关键概念,跟踪完成一项开发任务所引起的所有配置项的变更。在 UCM 模式下为了完成一项开发任务所进行的所有会引起配置项发生变化的操作(Check Out、Check In、Add to Source Control 等)都必须关联到一个 Activity。这个 Activity 会使用一个变更集 (Change Set) 来记录这些版本变更。
  • 变更集(Change Set):记录了 Activity 所关联的所有的配置项的版本变更,每个 Activity 都有一个 Change Set。

清单 1. UCM 对象的层次关系

				
 vob1 vob2 
 / | \ / \
 目录 1 目录 2 目录 3 目录 4 目录 5
 | | | | |
 PVOB ------------------>comp1 comp2 comp3 comp4 comp5 
 / \ | | | | |
project1 project2 ----------->|______|_______|_______|______|_______ 无根构件 NRcomp6
 / \ 
 stream1 stream2
 | | 
 | -deliver---> | 

Rational ClearCase 中常用的 UCM 查询指令

Clearcase 中内置的命令行工具 cleartool(/opt/rational/clearcase/bin/cleartool) 中包含有很多子命令可以用来进行 UCM 相关的操作 , 下面简要的介绍其中常用的一些查询和比较命令。

Project 查询命令 lsproject

lsproject 命令可以用来查询一个指定的 pvob 中所有 project 的信息,也可以根据某一具体的 project 名称来查询该 project 的详细信息。例如 :

  • cleartool lsproject -invob /vob_tag/project_pvob :列出 pvob /vob_tag/project_pvob 中包含的所有项目信息。
  • cleartool lsproject -l userProject@/vob_tag/project_pvob :显示 pvob /vob_tag/project_pvob 中项目 userProject 的详细信息。
  • cleartool lsproject -tree userProject@/vob_tag/project_pvob :以树型层次结构显示 project userProject 中包含的所有子对象(stream,activity 等)。

Stream 查询命令 lsstream

lsstream 命令可以用来查询一个 UCM project 中的 Stream 信息。示例如下:

  • cleartool lsstream -in userProject@/vob_tag/project_pvob :列表显示 UCM project userProject 中的所有 Integration Stream。
  • cleartool lsstream -l userProjectStream_Integration@/vob_tag/project_pvob :显示 stream userProjectStream_Integration 的详细信息。
  • cleartool lsstream -tree userProjectStream_Integration@/vob_tag/project_pvob :以树型层次结构显示 Stream userProjectStream_Integration 中包含的所有子对象(子 stream,activity 等)。

Baseline 查询命令 lsbl

lsbl 命令是 UCM 查询中非常常用的指令,它可以用来查询一个指定的 UCM Stream 中包含的 Baseline 的详细信息 :

  • cleartool lsbl -stream userProjectStream_Integration@/vob_tag/project_pvob : 列表显示 UCM stream userProjectStream_Integration 中的所有 baseline。
  • cleartool lsbl -component projectComponentA@/vob_tag/project_pvob/ -stream userProjectStream_Integration@/vob_tag/project_pvob : 列表显示 UCM stream userProjectStream_Integration 中 component projectComponentA 中的所有 baseline。
  • cleartool lsbl -tree -stream userProjectStream_Integration@/vob_tag/project_pvob : 以树型层次结构显示 stream userProjectStream_Integration 中的所有 baseline。
  • cleartool lsbl -l projectIntegrationStream_BaselineA@/vob_tag/project_pvob : 显示 baseline projectIntegrationStream_BaselineA 的详细信息。
  • cleartool lsbl -tree projectIntegrationStream_BaselineA@/vob_tag/project_pvob : 以树型层次结构显示 baseline projectIntegrationStream_BaselineA 中包含的所有子对象。

Baseline 比较命令 diffbl

diffbl 命令的主要用途是比较两个不同的 baseline 或 stream 中 activity 的变化情况 , 它可以用来追踪项目开发中的代码变更 , 示例如下 :

  • cleartool diffbl -predecessor baseline:projectIntegrationStream_BaselineA@/vob_tag/project_pvob : 显示 baseline projectIntegrationStream_BaselineA 与它前一个 baseline 之间的 Activity 变化。
  • cleartool diffbl baseline:projectIntegrationStream_BaselineA@/vob_tag/project_pvob baseline:projectIntegrationStream_BaselineB@/vob_tag/project_pvob : 显示 baseline projectIntegrationStream_BaselineA 和 projectIntegrationStream_BaselineB 之间的 Activity 变化。
  • cleartool diffbl stream:userProjectStream_Integration@/vob_tag/project_pvob stream:userProjectStream_DeveloperA@/vob_tag/project_pvob : 显示 stream userProjectStream_Integration 和 userProjectStream_DeveloperA 之间的 Activity 变化。

Activity 和 Change Set 查询命令 lsactivity

在 ClearCase UCM 方式下 , 针对某一特定任务进行的所有会引起版本变化的操作都与一个指定的 activity 相关联在一起,所有的对象版本变化信息都会被记录在这个 activity 的 change set 中,clearcase 使用命令 lsactivity 来显示这些信息。示例清单 2 是命令:cleartool lsactivity -l Check_in_license_files_for_toolkit@/vob_tag/project_pvob 的输出结果,它显示了 activity Check_in_license_files_for_toolkit 的信息和其中包含的 change set。

清单 2. lsactivity 命令输出结果

				
activity "Check_in_license_files_for_toolkit"
 2008-03-25T11:22:42+08:00 by UI Dev (uidev.clearusers@UIDevSUPPORT01)
 master replica: csdl.project_pvob@/vob_tag/project_pvob/
 owner: ccadmin
 group: projectdev
 stream: UI_DEV@/vob_tag/project_pvob/
 title: Check in license files for toolkit
 change set versions:
 /vob_tag/project_src/Tools/License/LI_zh@@/main/userProjectStream_Integration/UI_DEV/1
 /vob_tag/project_src/Tools/License/LI_tr@@/main/userProjectStream_Integration/UI_DEV/1
 /vob_tag/project_src/Tools/License/LI_pt@@/main/userProjectStream_Integration/UI_DEV/1
 /vob_tag/project_src/Tools/License/LI_pl@@/main/userProjectStream_Integration/UI_DEV/1
 /vob_tag/project_src/Tools/License/LI_ko@@/main/userProjectStream_Integration/UI_DEV/1
 /vob_tag/project_src/Tools/License/LI_ja@@/main/userProjectStream_Integration/UI_DEV/1 

使用 Java 和 Web Service 技术开发 Clearcase UCM 查询程序

本文所述 Clearcase UCM 查询程序是一个运行在 Clearcase 服务器主机中的轻量级 Web Service 程序 , 它包含一个 SOAP Web Service 服务组件和一个本系列文章第一部分中介绍过的操作系统进程调用组件,用户通过 HTTP 对 UCM 查询程序进行 SOAP 式的查询方法调用。当 UCM 查询程序接收到用户请求后,Web Service 服务组件会将这个方法调用转换为 cleartool 命令,并使用操作系统进程调用组件执行这一命令,最后 Web Service 服务组件会将执行结果转化为 SOAP 对象并将它返回给用户。图 2 是本文所述 Clearcase UCM 查询程序的基本结构。

图 2. Rational Clearcase UCM 查询程序基本结构图

操作系统进程调用组件的详细介绍请参考本系列文章的第一部分,本文将着重介绍 SOAP Web Service 服务组件部分。

SOAP Web Service 服务组件

SOAP Web Service 服务组件逻辑上由 UCM cleartool 查询程序和 SOAP server 程序两部分组成。SOAP server 程序接收用户调用请求,并将调用请求转发到 UCM cleartool 查询程序中,查询程序会根据调用请求的操作名称和参数生成 cleartool 命令并使用操作系统进程调用组件执行这些 cleartool 命令。当 cleartool 命令完成后,查询程序会根据需要将命令的返回结果解析、封装成 JavaBean 对象,并将这些对象传递回 SOAP server 程序中。SOAP server 程序会将这些 JavaBean 转化为 SOAP 可识别的对象并作为用户调用请求的结果返回给用户端程序。图 3 为 SOAP Web Service 服务组件的结构图。

图 3. SOAP Web Service 服务组件结构图

UCM cleartool 查询程序

UCM cleartool 查询程序使用 Java 语言开发 , 程序类位于包 com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery 中 , 由查询工具类 ClearcaseUCMQueryUtil 和一系列代表 UCM 对象数据的 JavaBean 组成。当用户发起某一 UCM 查询操作时 , SOAP server 程序调用 ClearcaseUCMQueryUtil 中的相应 Java 方法。ClearcaseUCMQueryUtil 首先根据输入参数生成 cleartool 命令 , 之后使用操作系统进程调用组件执行该命令并在命令完成后解析返回数据 , 最后将解析后的数据使用 UCM 对象数据 JavaBean 封装并返回给 SOAP server 程序。清单 3 是 ClearcaseUCMQueryUtil 中的 getCompareBaselineObjWithPredecessor 方法 , 它比较指定的 baseline 和前一个基线的版本变化 , 并将结果封装在 BaselineCompareInfoObj JavaBean 中。ClearcaseUCMQueryUtil 中的其他的方法请参考本文附件中的 eclipse 项目工程。

清单 3. getCompareBaselineObjWithPredecessor 方法

				
public static BaselineCompareInfoObj getCompareBaselineObjWithPredecessor
(String baselineName,String vobName){
String cleartoolPath="/opt/rational/clearcase/bin/cleartool";
String commandString=
cleartoolPath+" diffbl -predecessor baseline:"+baselineName+"@"+vobName;
java.util.List resultList=runSingelRemoteCommand(commandString);
if(resultList==null){return null;}
String returnBaselineInfoHead=(String)resultList.get(0);
if(!returnBaselineInfoHead.startsWith("Comparing the following:")){return null;}
BaselineCompareInfoObj currentBaselineCompareInfoObj=new BaselineCompareInfoObj();
int differencesStart=resultList.indexOf("Differences:")+1;
String[] baselinesArray=new String[2];
baselinesArray[0]=(String)resultList.get(1);
baselinesArray[1]=(String)resultList.get(2);
currentBaselineCompareInfoObj.setBaselines(baselinesArray);
int differencesNum=resultList.size()-differencesStart;
String[] dArray=new String[differencesNum];
for(int i=0;i<differencesNum;i++){
dArray[i]=(String)resultList.get(i+differencesStart);
}
currentBaselineCompareInfoObj.setDifferences(dArray);
return currentBaselineCompareInfoObj;
} 

SOAP server 程序

本程序的 Web Service 服务组件使用 Java 6 的 JAX-WS2.0 特性所提供的 SOAP 功能 ( 使用了 cxf 和 Jetty 作为后端类库 ) 。使用这一方式可以在 Java6 标准版的环境下提供 Web Service 支持而不需要将程序部署在 JavaEE 服务器上,从而可以简化程序的开发难度并降低 Clearcase 主机的负载。使用 JAX-WS2.0 提供 SOAP 服务需要使用 3 个 Java 类 : 一个服务定义接口,一个服务实现类和一个服务发布类。在 UCM 查询程序中这些类位于 com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.webservice 包中,以下是它们的说明 :

ClearcaseUCMQueryService: 服务定义接口 , 在这个 interface 中定义了每一个将要发布的 SOAP Web Service UCM 查询操作 , 清单 4 中的代码片断显示了该接口中操作 getCompareBaselineObjWithPredecessor 的定义。

清单 4. getCompareBaselineObjWithPredecessor 操作的服务接口定义

				
package com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.webservice; 
import javax.jws.WebService;
import com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.BaselineCompareInfoObj;
......
@WebService
public interface ClearcaseUCMQueryService { 
...... 
BaselineCompareInfoObj getCompareBaselineObjWithPredecessor
 (String baselineName,String vobName); 
......
} 

ClearcaseUCMQueryServiceImpl: 服务实现类 , 这个类通过使用 UCM cleartool 查询程序为 ClearcaseUCMQueryService 定义的每个方法提供了一个实现。清单 5 中的代码片断显示了该类中方法 getCompareBaselineObjWithPredecessor 的实现。

清单 5. getCompareBaselineObjWithPredecessor 操作的服务实现类

				
package com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.webservice;
import javax.jws.WebService;
import com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.BaselineCompareInfoObj;
import com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.ClearcaseUCMQueryUtil;
......
@WebService(endpointInterface = 
 "com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.
 webservice.ClearcaseUCMQueryService", 
 serviceName = "ClearcaseUCMQueryService")
public class ClearcaseUCMQueryServiceImpl implements ClearcaseUCMQueryService{
......
public BaselineCompareInfoObj getCompareBaselineObjWithPredecessor
 (String baselineName, String vobName) {
 return ClearcaseUCMQueryUtil.getCompareBaselineObjWithPredecessor
 (baselineName, vobName);
}
......
}
}

ClearcaseUCMQueryServicePublisher: 服务发布类 , 这个类将 ClearcaseUCMQueryService 和 ClearcaseUCMQueryServiceImpl 耦合在一起并发布 UCM 查询的 SOAP Web Service 服务。

清单 6. ClearcaseUCMQueryServicePublisher 类定义

				
package com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.webservice;
import javax.xml.ws.Endpoint;
public class ClearcaseUCMQueryServicePublisher{
 public static void main(String args[]) throws Exception {
 new ClearcaseUCMQueryServicePublisher().
 publishService("http://localhost:9101/ccUCMQueryService"); 
 } 
 public void publishService(String serviceAddress){
 ClearcaseUCMQueryServiceImpl implementor = new ClearcaseUCMQueryServiceImpl();
 String address = serviceAddress.trim();
 Endpoint.publish(address, implementor);
 System.out.println("Published Service at :"+serviceAddress); 
 }
}

当 ClearcaseUCMQueryServicePublisher 中的 main 方法运行后,用户就可以在地址 http://hostname:9101/ccUCMQueryService 上执行 UCM 查询程序中的所有 SOAP 查询操作。通过在 Web 浏览器中访问地址 http://localhost:9101/ccUCMQueryService?wsdl 可以获得这个服务的 WSDL 定义。

从客户端访问执行 Rational Clearcase UCM 查询程序

本文所述的 Clearcase UCM 查询程序可以接受任何编程语言实现的 SOAP Web Service 客户端程序的访问。下面以 Java 程序实现的一个客户端 ClearcaseUCMQueryClient 为例演示这一过程。

清单 7. ClearcaseUCMQueryServicePublisher 类定义

				
package com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.webservice;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
import com.cn.ibm.csdl.ecm.build.nerveCell.util.clearcaseUCMQuery.BaselineCompareInfoObj;
......
public class ClearcaseUCMQueryClient {
 private static final QName SERVICE_NAME = 
 new QName("http://webservice.clearcaseUCMQuery.util.nerveCell.build.
 ecm.csdl.ibm.cn.com/", "ClearcaseUCMQueryService");
 private static final QName PORT_NAME = 
 new QName("http://webservice.clearcaseUCMQuery.util.nerveCell.build.
 ecm.csdl.ibm.cn.com/", "ClearcaseUCMQueryServicePort");
 private static ClearcaseUCMQueryService getClearcaseUCMQueryService
 (String commandHostAddress){
 Service service = Service.create(SERVICE_NAME); 
 String endpointAddress = commandHostAddress.trim();
 service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
 ClearcaseUCMQueryService ccQueryService=
 service.getPort(ClearcaseUCMQueryService.class);
 return ccQueryService; 
 }
 public static BaselineCompareInfoObj getCompareBaselineObjWithPredecessor
 (String commandHostAddressString,String baselineName,String vobName){
 ClearcaseUCMQueryService ccQueryService=
 getClearcaseUCMQueryService(commandHostAddress);
 return ccQueryService.getCompareBaselineObjWithPredecessor(baselineName, vobName);
}
......
 public static void main(String[] args){
 System.out.println(getCompareBaselineObjWithPredecessor
 ("http://localhost:9101/ccUCMQueryService",
 "BaseLine_Name","PVOB_Name"));
 }
} 

运行该类的 main 方法 , 即可通过 SOAP Web Service 方式获得 PVOB "PVOB_Name" 中 baseline "BaseLine_Name" 与上一基线比较的版本变化 BaselineCompareInfoObj 数据对象。

结束语

本文介绍了如何使用 Java 和 SOAP Web Service 技术来开发一个 Clearcase UCM 项目信息查询程序 , 通过使用该查询程序 , 可以为以 Clearcase 作为版本控制系统的软件项目开发团队提供非常灵活的项目开发版本查询支持。这一程序还可以作为其他 Clearcase UCM 查询系统的后端数据源来使用。本文所介绍的方法也可以为 Clearcase 系统的应用方式提供一个新的思路。


相关文章

每日构建解决方案
如何制定有效的配置管理流程
配置管理主要活动及实现方法
构建管理入门
相关文档

配置管理流程
配置管理白皮书
CM09_C配置管理标准
使用SVN进行版本控制
相关课程

配置管理实践
配置管理方法、工具与应用
多层次集成配置管理
产品发布管理
   


软件配置管理的问题、目的
软件配置管理规范
CQWeb 7.1性能测试与调优指南
为什么需要使用ClearCase
ClearCase与RTC的集成
利用ClearQuest 进行测试管理
更多...   


产品发布管理
配置管理方法、实践、工具
多层次集成配置管理
使用CC与CQ进行项目实践
CVS与配置管理
Subversion管理员


配置管理实践(从组织级到项目级)
通号院 配置管理规范与应用
配置管理日构建及持续集成
丹佛斯 ClearCase与配置管理
中国移动 软件配置管理
中国银行 软件配置管理
天津华翼蓝天科技 配置管理与Pvcs