你首选的php部署策略是什么?

时间:2009-01-08 20:09:33

标签: php deployment capistrano

我正在开始使用PHP开发一个新项目,我很乐意从其他开发人员那里获得有关他们首选的PHP部署策略的反馈。我希望自动化一些东西,以便一旦提交更改,就可以快速迁移到开发或生产服务器。

我有使用Capistrano和Ruby进行部署的经验以及一些基本的shell脚本。

在我第一次独自潜水之前,听听其他人在他们的项目中如何处理这个问题会很棒。

更多信息

目前,开发人员处理站点的本地安装并将更改提交到subversion存储库。通过从svn导出标记版本并将其上载到服务器来进行初始部署。

通过手动上传更改的文件,通常会逐步进行其他更改。

15 个答案:

答案 0 :(得分:108)

对于PHP,具有Phing构建脚本的SVN是可行的方法。 Phing类似于ANT,但是用PHP编写,这使得PHP开发人员可以更轻松地修改他们的需求。

我们的部署程序如下:

  • 每个人都在同一个本地服务器上开发工作,每个开发人员都在家里的机器上办理结账。
  • 提交触发更新登台服务器的提交后挂钩。
  • 测试在登台服务器上运行,如果他们通过 - 继续。
  • 运行Phing构建脚本:
  • 关闭生产服务器,将域名切换为“正在建设中”页面
  • 在生产结帐时运行SVN更新
  • 运行架构增量脚本
  • 运行测试
  • 如果测试失败 - 运行回滚脚本
  • 如果测试通过,则服务器路由回生产结帐

还有phpUnderControl,它是一个持续集成服务器。我认为对于网络项目而言,这并不是很有用。

答案 1 :(得分:23)

我目前正在部署PHP using Git。使用Git的最新副本更新我的生产服务器只需要一个简单的git push生产。它简单快捷,因为Git足够聪明,只能发送差异而不是整个项目。它还有助于在我的硬件故障的情况下在Web服务器上保留存储库的冗余副本(尽管我也推送到GitHub是安全的)。

答案 2 :(得分:14)

我们使用Webistrano,这是Capistrano的网络前端,并且非常满意。

Webistrano允许SVN,GIT和其他人进行多阶段,多环境部署。它具有内置的回滚支持,支持单独的服务器角色,如web,db,app等,并且可以并行部署。它允许您在多个级别上覆盖配置参数,例如每个阶段,并记录每个部署的结果,可选择邮寄它。

尽管Capistrano和Webistrano是Ruby应用程序,但部署“recipes”的语法简单而强大,足以让任何PHP程序员都能理解。最初Capistrano是为Ruby on Rails项目而构建的,但很容易适应PHP项目。

配置完成后,非常容易被非程序员使用,例如部署暂存版本的测试人员。

为了尽可能提供最快的部署,我们安装了fast_remote_cache方法,该方法更新了远程服务器上的svn工作副本缓存,然后将结果硬链接。

答案 3 :(得分:7)

我使用Apache Ant部署到不同的目标(dev,QA和live)。 Ant旨在用于Java部署,但它为部署任意文件提供了非常有用的一般案例解决方案。

build.xml文件的语法非常容易学习 - 您可以定义在命令行上调用ant程序时运行的不同目标及其依赖项。

例如,我有dev,QA和live的目标,每个目标都取决于cvsbuild目标,该目标从我们的CVS服务器检出最新的头版本,将相应的文件复制到构建目录(使用fileset标记) ,然后将构建目录rsyncs到相应的服务器。有一些怪癖需要学习,而且学习曲线并不完全平坦,但是我已经这么做了多年,没有遇到任何麻烦,所以我会根据你的情况推荐它,虽然我很好奇其他答案我是什么我会在这个帖子上看到。

答案 4 :(得分:6)

我使用Git手动填充。一个用于开发的存储库,它获得git push --mirror个公共存储库,而实时服务器则是第三个存储库。我认为这部分与您自己的设置相同。

最大的不同之处在于,我几乎为我正在进行的每一项改变都使用了分支(我现在已经有大约5个),并且往往会在它们之间来回切换。除了合并其他分支外,主分支不会直接更改。

我直接从主分支运行实时服务器,当我完成另一个分支并准备合并它时,将服务器翻转到该分支一段时间。如果它坏了,把它放回主人需要几秒钟。如果它工作,它将合并到master中,并且实时代码会更新。我想在SVN中对此进行类比将有两个工作副本,并通过符号链接指向实时副本。

答案 5 :(得分:3)

我知道Phing现在已被提及过几次,但我对phpUnderControl的运气很好。对我们来说,我们

  1. 查看分支机构的各个副本到本地计算机
  2. 分支经过测试然后合并到Trunk
  3. 提交到Trunk是由phpUnderControl自动构建的,运行测试并构建所有文档,应用数据库增量
  4. Trunk进行质量测试,然后合并到我们的Stable分支
  5. 再次,phpUnderControl自动构建Stable,运行测试,并生成文档和更新数据库
  6. 当我们准备推向生产时,我们运行一个rsync脚本来备份Production,更新数据库,然后推送文件。手动调用rsync命令,以确保有人正在观看促销。

答案 6 :(得分:3)

自制部署脚本的替代方案是部署到平台即服务,为您提取大量工作。 PaaS通常会提供自己的代码部署工具,以及扩展,容错(例如,在硬件发生故障时不会出现故障),并且通常是用于监控,日志检查等的强大工具包。还有部署到a的好处已知的良好配置,将随着时间的推移保持最新(少一点让你头痛)。

我推荐的PaaS是dotCloud,除了PHP(see their PHP quickstart)之外,它还可以部署MySQL,MongoDB和一大堆附加服务。它还有零停机部署,即时回滚,对SSL和websocket的完全支持等好消息。还有一个永远不错的免费套餐:)

当然,因为我在那里工作,我有点偏颇!除了dotCloud之外值得一试的其他选择是Pagodabox和Orchestra(现在是Engine Yard的一部分)。

希望这有帮助!

所罗门

答案 7 :(得分:2)

您自动而盲目地将更改从存储库更改为生产服务器听起来很危险。如果您提交的代码包含回归错误,那么您的生产应用程序会出现故障怎么办?

但是,如果你想要一个PHP的持续集成系统,我想Phing是PHP的最佳选择。我自己没有测试过,因为我做的是手工制作的方法。 SCP。

答案 8 :(得分:2)

我迟到了,但我想我会分享我们的方法。我们使用Phing Phingistrano,它通过预先构建的构建文件为Phing提供类似Capistrano的功能。它非常酷,但只有在你现在使用Git时才有效。

答案 9 :(得分:1)

我在服务器上有一个SVN发布分支的工作副本。更新站点(没有架构更改时)就像发布SVN更新命令一样简单。我甚至不必将网站脱机。

答案 10 :(得分:1)

如果你能忍受xml配置文件的痛苦,Phing可能是你最好的选择。 Symfony框架有自己的rake端口(pake),它工作得很好,但与Symfony的其余部分紧密耦合(尽管你可能将它们分开)。

另一种选择是使用Capistrano。显然它不像PHP那样与PHP集成,但你仍然可以将它用于很多东西。

最后,您始终可以编写shell脚本。到目前为止,这就是我所做的。

答案 11 :(得分:1)

http://controltier.org/wiki/Main_Page

我们将把它用于多服务器部署&维护。

答案 12 :(得分:1)

迟到一年但...... 就我而言,部署不是自动的。我觉得部署代码并自动运行数据库迁移脚本很危险。

相反,subversion挂钩仅用于部署到测试/登台服务器。在运行测试并确保一切正常后,代码将在迭代结束时部署到生产中。对于部署本身,我使用定制的Makefile,它使用rsync传输文件。 Makefile还可以在远程服务器上运行迁移脚本,暂停/恢复Web和数据库服务器。

答案 13 :(得分:1)

在我自己的工作中,我的团队已经为capistrano的部署开发了一个面向Phing的替代品,我们还整合了一些像PHPUnit测试,phpcs和PHPDocumentor这样的好东西。我们已经把它作为git repo,可以作为git中的子模块添加到项目中,并且它运行良好。我已将它附加到少数几个项目中,并且模块化程度足以使其适用于我们的几个环境中的任何项目(分段,测试,生产等等)。

使用phing构建脚本,您可以手动从命令行运行它们,我也成功地使用Hudson和现在的Jenkins ci自动构建/部署例程。

我现在无法发布任何链接,因为回购还没有公开,但我被告知我们有时会很快开源,所以如果您有兴趣请随时联系我如果您对使用phing和git自动部署有任何疑问。

答案 14 :(得分:0)

我猜SVN部署方式不是很好。这是因为:

您需要为全世界打开SVN访问

在生产网络服务器中有很多.svn

我认为Phing生成一个分支+将所有js / css + replace stage config + ssh上传到所有www服务器是更好的方法。

ssh到10 www服务器和svn up也很麻烦。