充分利用 Rational Build Forge 的三种方式

利用 Build Forge 来使用 API 并集成一个 Jazz 储存库来完成更多任务

许多开发员使用 IBM® Rational® Build Forge® 来通过其管理操控台处理软件构建问题。但是它还包含了一系列功能优异的命令行 Java 和 Perl API。而且,它与基于 Jazz 技术的软件集成之后,可以提供完整且综合的测试,构建,更改和发布管理工具。本文介绍了怎样使用范例代码完成这个过程。

Ashish Aggarwal, 软件工程师, IBM

Ashish AggarwalAshish Aggarwal 是 IBM 系统和技术集团(STG)的一名软件工程师,他已经在 IBM 工作了三年多。在那段时间,他一直从事自动化工具的开发工作。他参加了许多 IBM 讨论区,如软件质量工程(QSE)等,并且在 developerWorks 讨论区扮演了积极角色。



2011 年 12 月 23 日

关于本文

IBM® Rational® Build Forge® 是 IBM 构建和发布管理的旗舰产品。它不仅提供了构建进程自动化的惊人潜力,还为团队实现了测试程序的自动化。

对于大多数开发员来说,Build Forge 的使用仅仅被限制为使用管理操控台,或者图形用户界面(GUI)。许多团队都没有意识到 Build Forge 可以通过客户端连接,并且与基于 IBM® Rational® Jazz™ 技术的软件相集成。当团队需要使用 Build Forge 创建,或者将通用构建与测试方案集成起来时,程序编程界面(API),也就是 Build Forge 客户端,将会发挥自己的作用。客户端向您提供了一种简单但有效的方法,去添加,编辑,以及按照与管理操控台相同的方式与 Build Forge 对象相集成。

本文详细描述了团队是怎样使用客户端以及 Jazz 插件,来充分开发利用 Rational Build Forge 潜力的。


Rational Build Forge 概述

Rational Build Forge 支持高性能构建以及敏捷软件开发。它的适应性能够帮助开发团队标准化一些重复性的任务,管理一致性的规范,以及共享信息。它自动化并促进了软件收集和交付的过程,并且规范了构建管理。

Build Forge 集成到当前的环境之中,并支持主要的开发语言,脚本,工具以及平台。您可以继续使用已存在的投资,同时为进程自动化,加速,注释以及日程安排添加了有价值的功能。

在真实世界的场景中,每个团队都有其自己的进程,该进程通常是手动且必须的工具,例如漏洞追踪以及源代码管理,很少集成起来。对于更稳定和高质量产品的需求越来越大,它需要集成,重复性,以及高度的可靠性。

出于这个目的考虑,团队通常拥有一些定制的脚本,但是事情要比仅仅一个脚本复杂得多,因为通常情况下您需要多个版本,多个平台,以及多个编辑的支持。这就是 Rational Build Forge 自动化软件收集过程的地方,以实现更快的软件开发和交付循环,更高的产品质量,更高的员工效率,以及更短的投入市场时间。

Rational Build Forge 可以帮助您的团队更快和更轻松地达到以下的目标:

  • 再使用已存在的脚本和基础以支持自动化
  • 自动化,优化,以及标准化复杂的软件交付生命周期
  • 集成不同的工具以管理各种项目配置
  • 提供构建加速,服务器管理,自动化注释,日程安排,安全性,以及更多
  • 使用 Eclipse IDE 插件以进行更好地管理
  • 有了 Microsoft Windows 及 UNIX 操作系统的一般性安装经验,可以简化和建设管理
  • 将企业环境之中的软件收集过程实现自动化和规范化
  • 继续保持有力语言和多平台支持的传统

Rational Build Forge 结构

Build Forge 结构是以一种这样的方式构建的,您可以在管理操控台,或者 Build Forge 客户端上使用几乎所有功能。如图 1 所示,结构提供了一个简单的 访问实施 (服务器),以及 运行 (代理)机理。

图 1. IBM Rational Build Forge 结构
工作流程图:访问,实施,执行

如图 1 所示,Build Forge 由一个网络界面构件(Apache 网络服务器和 PHP),一个服务器层构件,以及一个引擎构件组成。网络界面,引擎构件,以及 API 程序客户端就是服务器层构件的客户端。

访问

您可以使用安装期间提供的管理操控台或者 Build Forge 客户端来与 Build Forge 相交流。这有助于管理用户和资源,并创建和安排测试项目,生成和分析报告。管理操控台是一种在 Apache http 服务器上运行的基于 http 的网络程序,但是客户端可以从 Java 和 Perl 处获得。

实施(服务器)

结构的核心是 Build Forge 服务器,它由网络界面构件(Apache 网络服务器以及 PHP),一个服务层构件,以及一个引擎构件组成。服务器可以安装到 Microsoft Windows,Linux,IBM® AIX® 之类的平台之上,而且它可以与多个数据库一起运行,例如 IBM® DB2®,MySQL 以及 Oracle。服务器层促进了与客户端类管理操控台的联系。这有助于实现与已存在 IDEs 及源代码管理(SCM)工具的完美集成。

运行(代理)

Build Forge 在 Build Forge 代理 的帮助下在末端服务器上执行命令。一个代理从 Build Forge 引擎那里获得指令,对测试中的系统运行指定的命令,并将结果返回至引擎。代理可以在一些环境下运行,例如 Windows,Linux,AIX,Solaris,HP-UX,IBM® System z® 系列,IBM® System i®,Macs 等等。


Build Forge 客户端简介

Rational Build Forge 是结构的工作流程引擎。它是您可以直接使用的产品,以指定包含指定步骤的项目。步骤可以是一个或者多个在测试基础中选择服务器上执行的命令。但是目前,所有这些操作主要都是从 Build Forge 管理操控台上开始的,它将与集成式开发环境(IDE),软件配置管理(SCM),等等的集成的概率降至最低。

但是,您可以使用 Build Forge 客户端来解决这个问题,它可以帮助您提供与其他工具的完美集成。客户端还提供了一个简单有效的方法,去访问任意 Build Forge 对象,并使用操控台执行几乎所有操作。

Build Forge 7.0.1 版本引入了一个在 Apache Tomcat 服务器容器中运行的服务器层。Build Forge API 可以作为 Java 客户端和 Perl 客户端获得,它们都构建在服务器层之上。在 7.0.1 版本之前,只有 API 可以获得(不是 Perl 客户端)。

从 Build Forge 客户端开始

  1. 从以下位置处下载客户端文件:
    http://server_nameserver_port/clients/。
  2. 如有需要,将 Java 或者 Perl 客户端下载到 Services Layer 部分。
    • 为了使用 Java 客户端,您可以下载客户端文件,获得 rbf-services-client.jar 文件,并将其放到 Java 项目的适当构建位置。

      注意:
      您需要 JDK 1.5 或者更高的版本来使用 Build Forge Java 客户端。
    • 为了使用 Perl 客户端,您可以获得 .zip 文件,切换至 rbf-services 目录,并运行如代码清单 1 所示的命令(您需要 Perl 5.8 或者更高的版本来使用它):
  3. Build Forge 客户端直接与服务层相交流。在安装期间,Apache Tomcat 服务器被配置成监听特定的端口。因此,这些端口必须为客户端开放,以和 Build Forge 相交流。默认条件下,端口会被设置成以下内容:

    3966 (non-secure)
    49150 (secure, SSL-enabled)
清单 1. 安装 Perl 客户端
perl Makefile.PL
make
make install

提示:

  • 有了客户端,您还可以下载客户端引用文件。
  • 在其余的部分中,我们使用 Java 客户端提供范例,但是您还可以为相同的目的而使用 Perl 客户端。

为了从 Build Forge 客户端开始,首先您需要与 Build Forge Services Layer 联系起来。

  1. 在如代码清单 2 所示的代码范例之中,只提供 Build Forge 服务器名和端口号(在默认的端口号下,这是可选的)。
清单 2. 连接至 Build Forge
import java.io.IOException;

import com.buildforge.services.client.api.APIClientConnection;
import com.buildforge.services.common.ServiceException;

public class ConnectToBuildForge {
  public static void main(String[] args) {
    try{
      APIClientConnection conn = new 
      APIClientConnection(<server_name>,<port_number>);
      // In case of default port, do not specify any port number
			
      String login_token = conn.authUser(<username>,<password>);
      // Return value is a login token returned by the services layer
			
    }catch (ServiceException e) {
      System.out.println("Service Exception:" + e.getMessage());
    }catch (IOException e) {
      System.out.println("IOException Exception:" + e.getMessage());
    }
  }
}

使用客户端时可能的情况

通过 API 匹配数据的过程非常简单。但是,您要记住一个重要的概念:通过 API 从服务层获得数据之后(通过网络界面),会保持不变,直到刷新为止。

在最终获取之后,API 并不会自动刷新数据对象;只是当再次获取时,数据对象才会得到更新。基本上,当您从服务层上获得对象时,会创建一个本地的拷贝以进行操作。这种行为导致竞争情况以及其他的问题,例如所作的编辑工作被覆盖,这取决于数据是怎样被访问,以及何时被访问。这就是并发用户程序的本质,并且应该考虑编辑数据的 API 程序。

  1. 接下来,提供一个用户名和密码以进行认证。
  2. 在认证之后,很重要的一点是您要保存 APIClientConnection 对象,以便后续的操作。确定认证的用户拥有适当的权限去处理 Build Forge 对象。为了提供或者确认权限,您可以切换至 User > Access Groups

注意:
客户端对象和管理操控台对象使用相同的对话;因此,相同的用户不能以两种方式并发认证。

工作范例

在接下来的代码列表之中,我们将会向您演示一些常用的操作,例如 创建更改列表,以及 删除

注意:
我们使用 Build Forge 7.1.1.4 Java 客户端来进行演示

清单 3. 创建一个用户
import java.io.IOException;

import com.buildforge.services.client.api.APIClientConnection;
import com.buildforge.services.client.dbo.User;
import com.buildforge.services.common.ServiceException;

publicclass CreateUser {

/**
* Creates a new user
* @param args
*/
  publicstaticvoid main(String[] args) {

    try{
      APIClientConnection conn = new 
      APIClientConnection(<server_name>,<port_number>); 
      // In case of default port, do not specify any port number
      conn.authUser(<username>,<password>);
	   
      User user = new User(conn);
      user.setLogin(<login_name>);
      user.setPassword(<password>);
      user.setEmail(<email>);
      user.setName(<name>);
      user = user.create();
      user.addAccessGroup(<access_group>);
	
    }catch (ServiceException e) {
      System.out.println("Service Exception:" + e.getMessage());
    }catch (IOException e) {
      System.out.println("IOException Exception:" + e.getMessage());
    }
  }
}
清单 4. 更新一个测试计划
import com.buildforge.services.client.api.APIClientConnection;
import com.buildforge.services.client.dbo.Project;

publicclass UpdateTestProject {

/**
* Creates a new test project
* @param args
*/
  publicstaticvoid main(String[] args) {
    try{
      APIClientConnection conn = new 
      APIClientConnection(<server_name>,<port_number>); 
      // In case of default port, do not specify any port number
      conn.authUser(<username>,<password>);
	   
      Project project = new Project(conn);
      project.setName(<project_name>);
      project.setSelectorUuid(<selector_uuid>);
      project.setBuildClassUuid(<buildclass_uuid>);
      project.setActive(true);
      project.setLevel(<level>);
      project = project.update();
	
    }catch (ServiceException e) {
      System.out.println("Service Exception:" + e.getMessage());
    }catch (IOException e) {
      System.out.println("IOException Exception:" + e.getMessage());
    }
  }
}
清单 5. 列表环境值
import java.util.List;

import com.buildforge.services.client.api.APIClientConnection;
import com.buildforge.services.client.dbo.Environment;
import com.buildforge.services.client.dbo.EnvironmentEntry;

public class ListEnvironmentEntries {

/**
* Returns the list of all Environments Entries in an Environment
* @param args
*/
  public static void main(String[] args) {
    try{
      APIClientConnection conn = new 
      APIClientConnection(<server_name>,<port_number>);
      // In case of default port, do not specify any port number
      conn.authUser(<username>,<password>);
      Environment env = Environment.findByUuid(conn, <env_uuid>); 
      // Find environment
	   
      if(env!=null){ // Find environment entries only if environment exists
        List<EnvironmentEntry> ls = env.getEntries(); // Get environment entries
        for(EnvironmentEntry env_entry : ls){
          System.out.println("Environment Entry Uuid:" + env_entry.getUuid());
          System.out.println("Environment Uuid:" + env_entry.getEnvironmentUuid());
          System.out.println("Environment Entry Parameter Name:" + 
          env_entry.getParameterName());
          System.out.println("Environment Entry Parameter Value:" + 
          env_entry.getParameterValue());
        }
      }
    }catch (ServiceException e) {
      System.out.println("Service Exception:" + e.getMessage());
    }catch (IOException e) {
      System.out.println("IOException Exception:" + e.getMessage());
    }
 }
}
清单 6. 激活项目并搜索结果
import java.util.List;

import com.buildforge.services.client.api.APIClientConnection;
import com.buildforge.services.client.dbo.Build;
import com.buildforge.services.client.dbo.Project;
import com.buildforge.services.client.dbo.Result;

publicclass FireProjectAndFindResults {

/**
* Fire project and find corresponding results
* @param args
*/
  publicstaticvoid main(String[] args) {
    try{
      APIClientConnection conn = new 
      APIClientConnection(<server_name>,<port_number>);
      // In case of default port, do not specify any port number
      conn.authUser(<username>,<password>);
	  
      Project project = Project.findByUuid(conn,<project_uuid>);
	
      if(project!=null){ // Fire project if only it exists
        Build build = project.fire();
        // Sleep for some seconds
        List<Result> ls = build.getResults();
        Result result = null;
		
          for(Result result : ls){
            System.out.println("Build Uuid:" + result.getBuildUuid());
            System.out.println("Result Step Description" + result.getDescription());
            System.out.println("Result Step Duration" + result.getDuration());
            System.out.println("Result" + result.getResult().name());
          }
      }
	
    }catch (ServiceException e) {
      System.out.println("Service Exception:" + e.getMessage());
    }catch (IOException e) {
      System.out.println("IOException Exception:" + e.getMessage());
    }
  }
}

这些范例使用 Java 客户端来显示对 Build Forge 对象的一些操作。您可以看到它可以帮助您研究更多此类的操作,并使用它们达到最大的潜力。查看 Java 和 Perl 客户端所提供的帮助。


与 Jazz 产品相联系以得到完整系列的工具

在前面的章节中,您要同时使用 Java 和 Perl 客户端以与 Build Forge 相联系。但是 Rational Build Forge 还提供了与一些有用的软件基于 Jazz 基础的紧密集成,例如 IBM Rational Quality Manager 和 IBM Rational Team Concert。

  • Rational Quality Manager 是测试活动的中心。它可以帮助您规划测试,管理需求,开发测试用例和测试套装,维护测试执行记录,管理实验资源,以及提交和追踪缺陷。
  • Rational Team Concert 可以帮助您管理源代码,以及追踪缺陷,工作项,以及迭代计划。这可以帮助测试员,开发员,结构师和管理员一起更加有效地协同工作。

因此,Rational Quality Manager 与 IBM Rational Team Concert 和 Rational Build Forge 的集成可以帮助团队为变更和发布管理提供完整系列的工具。

注意:
我们要使用 Build Forge 7.1.1.4 来完成集成操作。

与 Rational Quality Manager 相集成

  1. 在 Build Forge i安装文件中编辑 buildforge.conf 文件(您可以在 Windows 系统中的 ../buildforge/apache/tomcat/webapps/rbf-services/WEB-INF/classes/buildforge.conf 位置处找到它),并添加以下的一行:

    db_system_password password

    其中密码指的是用于集成 Build Forge 和 Rational Quality Manager(RQM)的密码。
  2. 如果 Build Forge 与 Rational Quality Manager 安装在相同的服务器上,那么您可以打开 server.xml 文件(…/apache/tomcat/conf/server.xml),并将本行中的端口号从 8005 更改为 8007
    <server port="8005" shutdown="SHUTDOWN">
  3. 在 Rational Quality Manager 之中打开 integration_config.xml,并在代码的起始处和末端删除 <!-- 以及 --> 标记。然后在 <hostname></hostname> 标记内提供 Build Forge 服务器名,以及 <password></password> 标签内 buildforge.conf 文件所提到过的密码。
  4. <instanceID></instanceID> 标签内的 Bulid Forge 服务器起一个有意义的名字。

代码清单 7 显示了一个范例。

清单 7:integration_config.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<RTLMExtensionAPIRegistration>
<adapter>
<name>Build Forge RQM Integration </name>
<version>1.0</version>
<APIVersionSupported>1.0</APIVersionSupported>
<inventoryExtensionId>com.ibm.rational.test.lm.spi.bf.v71.inventory
  </inventoryExtensionId>
<automationExtensionId>com.ibm.rational.test.lm.spi.bf.v71.automation
  </automationExtensionId>
<pluginId>com.ibm.rational.test.lm.spi.bf.v71</pluginId>
<instance>
<instanceId>some meaningful name</instanceId>
<hostname>Build Forge server name</hostname>
<port>Build Forge server port</port>
<offline>FALSE</offline>
<credential>
<username>Build Forge server username</username>
<password>Integration password</password>
</credential>
</instance>
</adapter>
</RTLMExtensionAPIRegistration>

注意:
如果 Rational Quality Manager 安装在 IBM® WebSphere® Application Sever 上,那么在 Application servers > server1 > Process Definition > Java Virtual machine > Custom Properties 处的 Java 系统属性中提供路径 integration_config.xml,并添加一个名为 com.ibm.rational.test.lm.spi.xml.location 的通用属性。

与 Rational Team Concert 相集成

Rational Team Concert(RTC)集成可以帮助您将 Build Forge 自动化与 Team Concert 之中的追踪性与协作集成起来。当构建在 Build Forge 中激活时,RTC-Build Forge 插件会得到不断地更新,其结果也是实时的状态。 在构建的结尾,步骤结果与日志  以及 BOM 数据 将会在  Rational Team Concert Build Result 之中。

如果您想完成集成步骤,那么您可以查看 Resources 部分中的第一个链接。

参考资料

学习

获得产品和技术

讨论

条评论

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=783543
ArticleTitle=充分利用 Rational Build Forge 的三种方式
publish-date=12232011