在 Linux KVM 上创建一个 ooRexx 构建环境

来源:developerWorks 中国 作者:W. David Ashley
  
使用 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 修订具有自己的子目录,包含针对这个修订的所有平台客户机构建。同样,每个平台客户机生成一个构建报告,也存储在修订子目录中。

构建报告对于所有内容的正常工作是必不可少的。如果在构建期间出现一个错误,并且最终的输出文件并没有生成,那么用户必须通过某种方式来找到错误。因此,每个客户机上的构建过程将始终生成一个构建报告,并将其存储到构建库中。


时间:2009-08-11 09:57 来源:developerWorks 中国 作者:W. David Ashley 原文链接

好文,顶一下
(2)
100%
文章真差,踩一下
(0)
0%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量