热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

文章标题:自动化应用程序构建和发布的过程。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  您已经足够多地考虑了为单一类型的系统构建开放源代码应用程序的情形,但是,如果您正在构建的应用程序需要在多种不同的、不兼容的机器上发布,又该怎么办呢?这个问题不太容易解决,但是,可以使用一些准则和定制的脚本来简化这一过程。本文研究的是如何创建一个构建和发布应用程序的结构,包括高度定制的版本,以及一种能在多种机器上尽可能轻松地传播应用程序(手工地或者自动地)的简单途径。
  
  我总是在自己的系统亲自动手构建应用程序,而不去使用可用的二进制文件或 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

推荐阅读
  • 本文详细记录了在Ubuntu 9.10操作系统上从零开始搭建LAMP(Linux, Apache, MySQL, PHP)环境的过程,包括遇到的问题及解决方案。旨在为初次尝试搭建LAMP环境的开发者提供参考。 ... [详细]
  • ###########性能监控脚本###########################!binbash#监控cpu系统负载IPifconfigeth0|grepinetaddr ... [详细]
  • 本文探讨了Go语言(Golang)的学习价值及其在Web开发领域的应用潜力,包括其独特的语言特性和为什么它是现代软件开发的理想选择。 ... [详细]
  • 2023年最新:PHP本地端口配置详解
    本文详细介绍了PHP在不同环境下的本地端口配置方法及常见问题解决方案,帮助开发者更好地理解和配置PHP端口。 ... [详细]
  • PHP 5.4.8 编译安装指南
    本文详细介绍了如何在Linux环境下编译安装PHP 5.4.8,并配置为FastCGI模式运行。包括所需依赖包的安装、源代码下载、编译配置及启动服务等步骤。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
    【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库 ... [详细]
  • 本文探讨了在执行SQL查询时遇到的因字符集不同而导致查询结果差异的问题,特别是涉及中文字符时。文章分析了在不同字符集设置下,SQL查询结果的变化,并提供了详细的解决方案。 ... [详细]
  • 本文探讨了如何在JavaScript中调用PHP函数及实现两者之间的有效交互,包括通过AJAX请求、动态生成JavaScript代码等方法。 ... [详细]
  • 深入理解FastDFS
    FastDFS是一款高效、简洁的分布式文件系统,广泛应用于互联网应用中,用于处理大量用户上传的文件,如图片、视频等。本文探讨了FastDFS的设计理念及其如何通过独特的架构设计提高性能和可靠性。 ... [详细]
  • 本文详细介绍了MySQL在Linux环境下的主从复制技术,包括单向复制、双向复制、级联复制及异步复制等多种模式。主从复制架构中,一个主服务器(Master)可与一个或多个从服务器(Slave)建立连接,实现数据的实时同步。 ... [详细]
  • 解决CSS因MIME类型不匹配导致的加载失败问题
    本文详细介绍了在Web开发过程中,遇到CSS文件因MIME类型不匹配而无法正确加载的问题及其解决方案,适合前端开发者阅读。 ... [详细]
  • 本文详细解析了Tomcat服务器的核心配置文件server.xml,包括其主要功能、结构组成及各标签的具体作用。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • 高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ... [详细]
author-avatar
咖啡Spring_767
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有