使用 ooRexx 开发随需应变的软件构建服务,ooRexx 使用 Linux® 内核虚拟机(KVM)提升性能。KVM 充当客户操作系统的主机,为用户构建目标软件。Apache Web 服务器控制构建并存储结果,供用户在以后检索结果。通过本文了解如何设置构建服务器和创建客户机,定制构建请求,以及组织和访问构建结果。
最近,Open Object Rexx 项目(ooRexx;参见本文后面的 参考资料 了解更多信息)将其旧的随需应变软件构建系统从由 VMware 托管的客户操作系统转移到由 Linux Kernel Virtual Machine (KVM) 托管的客户机上。这一改变提供了一个更加高效的构建环境,并且为用户减少了构建时间。
ooRexx 软件构建系统允许开发人员针对多个基于 x86 的平台和操作系统构建 ooRexx 软件包。目前,受支持的客户操作系统包括 Windows® XP (i386)、Fedora 10(i386 和 x86_64)和 Ubuntu 8.04(i386)。这些客户操作系统为 Windows (EXE)、Fedora 和 openSUSE (RPM) 以及 Ubuntu (DEB) 生成 ooRexx 安装和文档包。其他基于 x86 的操作系统也将根据 ooRexx 开发人员和用户的需求得到支持。
本文将展示如何创建自己的软件构建系统,使用 ooRexx 开发团队的设置作为例子,并为 ooRexx、Apache 和 Linux 开发人员提供了技巧和指导。您可以在本文结束部分 下载服务器和客户机脚本。该系统专门用于构建 ooRexx 软件,但是其中的概念可以应用于通用的软件构建系统。
本系统包括以下需求:
- 需要一个 Web 接口来生成构建请求。
- 需要一个 Web 接口来检索构建结果。
- 需要支持多客户操作系统。
- 客户操作系统必须执行完全自动化的构建。
- 在构建结束时,应当生成电子邮件并发送给请求用户。
要满足这些需求,开发团队和我使用了一个四核的基于 Xeon 的服务器。该服务器包含 4GB 内存和 250GB 磁盘。我们选择 Fedora 10 x86_64 发行版作为主操作系统,主要是考虑到该发行版使用的 KVM 具有良好的稳定性,并且是最新版本。选择的硬件和软件可能有所不同,但是主要的硬件标准是您的处理器应当具有硬件虚拟化特性 — 这是使用 KVM 的必要条件。
设置服务器
设置构建服务器的第一步是确定分区模式。我们决定将客户操作系统的 Web 存储和映像分离到单独的分区中。我们为 Web 存储分配 50GB 的硬盘,为客户操作系统映像所在的 /var 分区分配 150GB 硬盘。其余硬盘空间被分配给 /home 分区和 /root 分区。
|
接下来,我们将使用 Fedora 10 x86_64 发行版安装主操作系统。如果您要设置自己的系统,那么执行下面的操作可以避免很多麻烦:
- 在启动安装之前通过机器的 BIOS 启用硬件虚拟化功能,这样 Fedora 将发现 KVM 是可用的。
- 执行软件组件的定制安装,这样就可以选择 Fedora 虚拟化选项。
安装好服务器操作系统后,我们将它配置为可由客户操作系统访问。这包括对 Windows 客户机启用 Samba,以及对 Linux 客户机启用 NFS。这可以支持客户机访问构建结果分区,从而可以存储构建文件以供用户访问。主要 Samba 共享和主要 NFS 导出针对所有客户机都指向同一位置。
接下来,我们将配置 Apache Web 服务器以提供对构建请求系统(我将在 构建请求 中加以解释)和构建结果库的访问。
需要确定的一项配置决策与客户机的网络选项有关。默认安装被配置为对所有客户机应用一个私有的内部网。C 类网和 DHCP 服务器一起提供,来为客户机提供 IP 地址。另一个选择是设置系统,以将其中一个网络设备作为通向服务器外部网的网桥。这需要进行手动配置。您可以在 libvirt Wiki 中找到如何为服务器配置这一选项的示例(见 参考资料 中的链接)。
创建客户机
有两种方法可以为 KVM 创建客户机。对于第一种方法,只需要创建所需的客户机来满足需求。第二种方法采取更加长远的方式创建客户机。我们使用第二种方法创建客户机,并且如果具有必需的资源的话,那么推荐以该方法作为标准方法。
我们首先根据需求确定客户机的数量和类型。我们需要操作系统来为这些环境创建软件构建,并使用另一个操作系统创建文档。结果证明,在我们的例子当中,文档和 i386 RPM 任务可以被结合起来并由一个客户机处理。下面是所分配的客户机和任务:
- Windows XP (i386):构建 Windows 安装可执行文件。
- Fedora 10 (i386):构建 i386 RPM 文件和文档 ZIP 文件。
- Fedora 10 (x86_64):构建 x86_64 RPM 文件。
- Ubuntu 8.04 (i386):构建 DEB 文件。
我们采用的方法以映像的形式创建前面提到的客户机,这些映像稍后可以进行克隆。因此,每个客户机都拥有一个基本版本,可以在稍后克隆,定制后的克隆版本将执行实际的构建任务。
克隆 KVM 客户机非常简单。Fedora 10 提供的 virt-clone 脚本可以完全自动化这个任务。
清单 1. Fedora 10 的 virt-clone 脚本
$ virt-clone --original=Fedora10-i386-Base \ --name=Fedora10-i386-Build \ --file=/var/lib/libvirt/images/Fedora10-i386-Build.img |
original 选项指定客户操作系统的名称,因为它对于虚拟机管理器是已知的。name 选项指定新的客户机的名称。file 选项指定客户机的新映像文件的文件名。这将完全克隆一个已有客户机并将其复制到一个新的客户机版本。它还将修改新客户机的 MAC 地址和 UUID。因此,如果必要的话,将保存原始的客户机以供以后进行克隆,并且为您的定制提供一个新的客户机版本。
有关 virt-clone 脚本需要注意的一点是:如果原始客户机有一个未被连接的设备,比如 CD-ROM,那么脚本将失败。在对客户机进行克隆之前,必须删除所有未连接的设备。如果必要的话,可以在克隆完成后将它们重新添加到客户机中。
一旦创建好基本的构建客户机,那么将针对构建任务对每个客户机进行定制。此时,Windows XP 客户机是最具有挑战性的,因为 Visual C++ 编译器和 Software Development Kit 需要作为定制的一部分安装。除了在 Ubuntu 客户机上安装 NFS 之外,Linux 客户机基本上不需要定制。
构建请求
所有构建客户机需要进行一项额外的定制:Open Object Rexx 版本 3.2 必须安装在每一个客户机上。为什么?因为使用 ooRexx 编写的脚本控制每个客户机上的请求和构建过程。该脚本访问构建机器服务器上的 TCP/IP 端口,以搜索构建请求。如果找到某个请求,那么构建过程将被调用,并将创建一组安装文件(RPM、DEB、EXE)以及一个构建报告,并且这些内容被存储到构建机器服务器上,供用户通过 HTTP 访问。
ooRexx 构建请求脚本具有足够的智慧,它不会复制软件的已有构建版本。它还通过电子邮件通知用户构建已经完成,并提供一个 URL 指向构建机器服务器上存储构建的位置。
构建请求在构建机器服务器上通过 CGI 脚本生成。用户访问一个 HTTP Web 页面并请求一个针对他们所选的操作系统的构建。Apache 服务器随后调用 CGI 脚本,后者将请求放到一个队列中。构建客户机随后负责访问这些请求并执行所请求的操作。构建结果也可以通过 Web 站点下载获得。
如前所述,服务器和 build guest 客户机的代码可从下面 下载 获得。所有脚本都使用 ooRexx 编写,应当很容易执行。包含的文件包括:
- buildserver.rex:该脚本运行在 Web 服务器上并维护客户操作系统用于查找工作的队列。
- buildd.rex:该脚本运行在每个客户操作系统上并访问 Web 服务器上的队列来查找工作。每个客户机只具有一个队列,因此将只构建一种输出文件。
- simq.cls:这个文件并不属于脚本,但是是由 buildserver.rex 脚本使用的类文件。
- socket.cls:这个类文件由 buildd.rex 脚本使用。
- streamsocket.cls:这个类文件也由 buildd.rex 脚本使用。
构建结果
构建结果由构建客户机放到 Web 站点中。构建进行了组织,因此每个 Subversion 修订具有自己的子目录,包含针对这个修订的所有平台客户机构建。同样,每个平台客户机生成一个构建报告,也存储在修订子目录中。
构建报告对于所有内容的正常工作是必不可少的。如果在构建期间出现一个错误,并且最终的输出文件并没有生成,那么用户必须通过某种方式来找到错误。因此,每个客户机上的构建过程将始终生成一个构建报告,并将其存储到构建库中。