我们是一家小型软件公司,只有一种产品 - 一个负载平衡的网站(每月访问量 800 万次)(大约有 20 台服务器用于网络服务)。
目前我们每周发布一次,旨在持续部署。
我们的服务器运行的是 Centos,客户端运行的是 Mac OS X。
我们目前正在评估不同的包装系统:
- 每分钟转数
- subversion + 一些 shell 脚本(创建一个与源代码树分开的“production-svn-tree”)
- 我们自制的“打包程序”由 tar-archive 和一些脚本组成 - 目前的问题是没有降级逻辑(安装非当前版本),也没有删除文件的可能性 - 我认为添加这些内容需要相当多的工作
我想知道你们中是否有人有使用包装系统进行部署的经验,并且可以提供一些见解。
答案1
我曾使用 RPM 打包进行部署,与 Debian 打包相比,我讨厌它。使用包可以为您带来很多好处,例如设置依赖项、apache 配置、logrotate、cronjobs、安装后脚本等,以及源代码和权限。能够使用 debconf 向用户提问(例如,我应该在哪个 URL 上提供此 Web 应用程序?),然后将答案模板化到 apache 配置中,这真的很有用。但是,据我所知,没有与 debconf 类似的 RPM 等效程序,这意味着您最终必须手动编辑配置文件,并且无法轻松地从包中安装新版本。
我通常认为,仅从服务器上的源代码控制进行安装是没有意义的事情,因为对于复杂的应用程序来说,这只是故事的一部分。因此,考虑到上述三个选项,我会选择 3。
答案2
我会建议卡皮斯特拉诺它虽然不是打包系统,但专门用于将代码部署到一台或多台服务器。它直接从您的版本控制系统(svn、git、mercurial 等)部署到服务器,执行您需要的任何脚本,运行数据库迁移等。
它在服务器上保留了多个以前的版本,允许您在出现意外问题时在几秒钟内回滚。
此外,它还提供多服务器部署,一次部署到多台服务器,如果任何部分无法正确部署,则将它们全部回滚到以前的版本。
Capistrano 起源于 Ruby 世界,但如今已被广泛使用。它看上去可能很简单,但却是一款非常强大的工具,值得推荐。我的公司使用它在多台服务器上部署了数十个网站。
因为 Capistrano 是一个命令行工具,我们使用韦比斯特拉诺,一个以用户友好的方式管理和运行 Capistrano 的 Web GUI。
答案3
考虑到您的情况的简单性,您可能可以使用 rsync 或 NFS 挂载来分发代码,然后使用一些小代码片段来“更新”从一个版本运行到另一个版本(这就是我假设您所说的选项#2)。
但是,如果你想要更好的东西,我强烈建议你使用原生打包系统来交付代码(这样你就可以“免费”集成所有原生打包工具)。当然这需要一些技能,创造好的软件包……但这种投资应该能收回成本。另一方面,使用非原生的打包格式是您必须一次又一次付出代价的事情。
正如另一位发帖者所说,您可能希望在其基础上使用配置管理系统(但同样,任何好的配置管理系统都应该与本机包装集成……因此任何投资仍然会有回报)。
对于一些暗示“dpkg 规则,rpm 很糟糕”的回应,我建议如果您愿意听取他们的意见,那么只需将您的服务器移动到 Debian 并使用本机打包。
答案4
遵循奥卡姆剃刀和爱因斯坦简单原则,我会选择第 3 种。就我对这个系统的有限经验而言(我主要使用 Deb、Arch 和 BSD),RPM 是一个相当臃肿的软件,可能远远超出您的需求。我几乎看不出引入额外 SVN 层有什么好处。最合乎逻辑的做法似乎是使用一些脚本从 SVN 标签构建 tarball,并使用一些脚本进行交付和部署。依我之见。