开发学院软件开发Shell 自动化应用程序构建和发布的过程 阅读

自动化应用程序构建和发布的过程

 2009-06-30 03:53:00 来源:WEB开发网   
核心提示:您已经足够多地考虑了为单一类型的系统构建开放源代码应用程序的情形,但是,自动化应用程序构建和发布的过程,如果您正在构建的应用程序需要在多种不同的、不兼容的机器上发布,又该怎么办呢?这个问题不太容易解决,我可能要为每个版本创建三四个目录,用来保存调试的不同配置,但是,可以使用一些准则和定制的脚本来简化这一过程

  您已经足够多地考虑了为单一类型的系统构建开放源代码应用程序的情形,但是,如果您正在构建的应用程序需要在多种不同的、不兼容的机器上发布,又该怎么办呢?这个问题不太容易解决,但是,可以使用一些准则和定制的脚本来简化这一过程。本文研究的是如何创建一个构建和发布应用程序的结构,包括高度定制的版本,以及一种能在多种机器上尽可能轻松地传播应用程序(手工地或者自动地)的简单途径。
  
  我总是在自己的系统亲自动手构建应用程序,而不去使用可用的二进制文件或 RPM 发行版本。这不是因为我不相信 RPM,而是因为对于很多系统来说,我使用的是一个定制的环境。我可能需要启用调试,或者需要一个简化或者特定的扩展名、模块或者其他选项的集合。有时,我甚至会为一个特定项目创建一个完全不同的目录结构。
  
  因为复杂的缘故,我使用了大量使用开放源代码项目的平台,其中包括 Linux™、BSD、OS X,以及各种商业 UNIX® 发行版本。对于其中一些平台,我可能只有一台机器安装了这种平台;而对另一些平台来说,每种平台可能已经安装在 10 台、20 台甚至 50 台机器上。当软件某个部分的新版本开始可用时,手工地去更新每一台机器会是一项工作量极大的任务。实际的构建和安装过程(假设我们不考虑定制)通常非常简单,如清单 1 所示:
  
  清单 1. 构建和安装过程
  
  $ bunzip2 -c latest-release.tar.bz|tar xf -
  $ cd latest-release
  $ ./configure
  $ make
  $ make install
  
  如果没有某些准则,我很可能要在成百上千台机器上手工去做这些工作。有时,感觉这像是一份只不过设法与最新版本(更不用说出于测试目的而使用某些程序包的 beta 和 alpha 版本了)保持同步的全职工作。
  
  几年前,我决定通过遵循一些简单的规则并向该过程添加结构,来非常有效地简化这一过程:
  
  为每种 OS 创建一个目录。
  在每个 OS 目录中为每一个软件程序包创建一个目录。
  为每一个版本创建一个目录。
  为每种操作系统构建一次。
  在每台机器上多次部署。
  您可以先为所有跨网络共享的软件构建一个合适的结构。
  
  创建一个中央构建目录
  第一步是创建一个将通过 NFS 共享的目录,它将用来保存将要构建的应用程序。一旦完成构建,您就可以使用这个目录来保存系统所需要的所有内容,包括源文件目录、配置文件以及其他组件。不过,NFS 是关键。要让系统工作,就要能够通过网络,从需要访问正构建和安装的应用程序的所有机器访问这个中央构建目录。
  
  创建一个顶层结构
  首先要为需要在网络上支持的每一种操作系统创建一个顶层结构。每一个目录都应该明确对应于一种特定的操作系统、体系结构和版本编号(如果变化显著的话)。这些目录应该与您的网络上的机器是相匹配的。例如,在我的网络上,有非常多的机器,所以我的顶层目录结构数量非常大,如清单 2 所示:
  
  清单 2. 操作系统层目录 in my build environment
  
  total 58
  drwxrwxrwx  2 root   other    512 Jul 25 12:01 aix/
  drwxrwxrwx  2 root   other    512 Jul 25 13:14 darwin-ppc/
  drwxrwxrwx  2 root   other    512 Jul 25 13:14 darwin-x86/
  drwxrwxrwx  2 root   other    512 Jul 25 12:02 freebsd-x86/
  drwxrwxrwx  2 root   other    512 Jul 25 13:14 freedbsd-sparc/
  drwxrwxrwx  3 root   other    1024 Mar 9 2003 incoming/
  drwxrwxrwx  2 root   other    512 Jul 25 12:02 linux-debian-x86/
  drwxrwxrwx  2 root   other    512 Jul 25 12:02 linux-fedora-1-x86/
  drwxrwxrwx  2 root   other    512 Jul 25 12:02 linux-fedora-2-x86/
  drwxrwxrwx 11 root   other    512 Apr 13 16:56 linux-redhat-9.0-x86/
  drwxr-xr-x  3 root   root    8192 Feb 6 2002 lost+found/
  drwxrwxrwx 13 root   other    512 Jun 15 15:02 macosx/
  drwxrwxrwx  2 root   other    512 Jul 25 12:02 netbsd-x86/
  drwxrwxrwx  2 root   other    512 Jul 25 12:02 openbsd/
  lrwxrwxrwx  1 root   other     12 Jul 25 13:13 solaris -> solaris8-x86/
  drwxrwxrwx  2 root   other    512 Jul 25 13:13 solaris8-sparc/
  drwxrwxrwx 32 root   other    1024 Jul 25 13:12 solaris8-x86/
  drwxrwxrwx  2 root   other    512 Jul 25 13:13 solaris9-sparc/
  drwxrwxrwx  2 root   other    512 Jul 25 13:13 solaris9-x86/
  现在不要过多担心应用程序。这些操作系统目录将用来为每一个 OS 修订版本保存相应的应用程序目录。对应用程序构建的定制将单独存放于每个目录中。
  
  我使用一个单独的文件系统作为构建目录,导出为 /export/build。这个文件系统有足够的空间;对于构建目录,您需要有足够的空间来保存应用程序在每一种操作系统上使用每一个配置的完全构建版本。例如,Perl v5.9.0 编译占用了大约 90 MB 的空间。 Apache 占用了大约 27 MB 的空间。
  
  创建应用程序结构
  您需要在每一个操作系统目录中为想要安装的每一个应用程序另外创建一个目录。注意,该目录是明确对应于每一种 OS 的,您应该只创建实际需要的应用程序目录。例如,您可能希望在 Fedora 机器上安装 Perl,但不想在其他机器上安装它。在清单 3 中可以看到一个示例规划:
  
  清单 3. 一个 OS 目录中的应用程序目录
  
  drwxrwxrwx  4 mc    staff    512 May 12 12:30 apache/
  drwxrwxrwx  4 root   other    512 Apr 16 2003 assassin/
  drwxrwxrwx  3 501   other    512 Jun 11 10:11 bind/
  drwxrwxrwx  3 root   other    512 Jul 24 15:37 ccache/
  drwxrwxrwx  5 root   other    512 Jun 21 17:12 clamav/
  drwxrwxrwx  6 root   other    512 Jul 25 15:28 cpan/
  drwxrwxrwx  4 root   other    512 Jul 25 12:35 cpanplus/
  drwxrwxrwx  4 root   other    512 Sep 6 2003 cyrus/
  drwxrwxrwx  3 root   other    512 Jun 6 16:29 dhcp/
  drwxrwxrwx  3 root   other    512 Apr 11 15:42 distcc/
  drwxrwxrwx  3 root   other    512 May 11 10:39 eggdrop/
  drwxrwxrwx  3 root   other    512 Apr 9 05:50 ethereal/
  drwxrwxrwx  5 root   other    512 Jun 8 19:12 gawk/
  drwxrwxrwx  2 root   other    512 May 15 08:19 gcc/
  drwxrwxrwx  4 root   other    512 Jul 28 2003 ircd/
  drwxrwxrwx  4 root   other    512 Apr 9 05:44 libpcap/
  drwxrwxrwx  5 root   other    512 Jul 25 13:22 mysql/
  drwxrwxrwx  3 root   other    512 Mar 25 13:07 nmap/
  drwxrwxrwx  3 root   other    512 Nov 21 2003 ogsi-lite/
  drwxrwxrwx  6 root   other    512 Jul 25 13:33 perl/
  drwxrwxrwx  3 root   other    512 Aug 19 2003 php/
  drwxrwxrwx  6 root   other    512 Mar 5 15:09 ppro/
  drwxrwxrwx  3 root   other    512 May 15 09:02 python/
  drwxrwxrwx  4 root   other    512 Apr 22 06:06 razor/
  drwxrwxrwx  3 root   other    512 Aug 24 2003 razorsdk/
  drwxrwxrwx  4 root   other    512 Dec 4 2003 sendmail/
  drwxrwxrwx  3 root   other    512 May 23 09:37 ssh/
  drwxrwxrwx  4 root   other    512 May 11 10:25 tcl/
  drwxrwxrwx  3 root   other    512 Dec 22 2003 tcpwrappers/
  drwxrwxrwx  6 root   other    512 Apr 24 07:13 xmltv/
  
  您需要再在每一个目录中创建一个或两个结构,这取决于应用程序以及组织和配置您的单独构建的选项。创建的每一个目录将用来保存 live 应用程序(已配置和构建的应用程序版本)。您可以以两种方式进行组织:使用对应每个版本的目录,或者直接使用应用程序版本。
  
  对应每个版本的目录:对应于应用程序每个版本的另外一层目录。对那些想要每一个版本创建很多不同构建配置的应用程序来说,这很实用。例如,您可能会创建一个名为 perl-5.9.0/debug-build 的目录,以及另一个名为 perl-5.9.0/std-build 的目录。
  直接版本目录:目录中的每个子目录都是原始 tarball 所创建的。如果您在所有机器上对给定的 OS 使用相同的配置,那么您可以这样进行组织。
  根据您想如何构建和部署应用程序,可以使用任意一种结构,或者两者都用。只是需要确保您知道每种情况下的结构,因为在开始部署时,您应该知道目录的规划。例如,对于 Apache,我可能要为每个版本创建三四个目录,用来保存调试的不同配置,同时还要有一些用于开发、阶段测试(staging)和产品版本的安装目录。这样得到了如清单 4 中所示的一个规划:
  
  清单 4. 支持不同活动配置的 Apache 规划
  
  ./httpd-2.0.46
  ./httpd-2.0.46/staging-build
  ./httpd-2.0.46/devel-build
  ./httpd-2.0.46/prod-build

Tags:自动化 应用程序 构建

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接