161

我正在开始一个 PHP 新项目,我很想从其他开发人员那里获得一些关于他们首选的 PHP 部署策略的反馈。我很想将事情自动化一点,以便一旦提交更改,它们就可以快速迁移到开发或生产服务器。

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

在我自己动手之前,很高兴听到其他人在他们的项目中是如何处理这个问题的。

更多的信息

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

其他更改通常是通过手动上传更改的文件来零碎进行的。

4

15 回答 15

109

对于 PHP,带有Phing构建脚本的 SVN 是要走的路。Phing 类似于ANT,但它是用 PHP 编写的,这使得 PHP 开发人员更容易根据自己的需要进行修改。

我们的部署例程如下:

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

还有phpUnderControl,它是一个持续集成服务器。老实说,我没有发现它对 Web 项目很有用。

于 2009-01-08T20:20:05.203 回答
24

我目前正在使用 Git部署 PHP 。只需一个简单的 git push 生产就可以使用 Git 的最新副本更新我的生产服务器。它既简单又快速,因为 Git 足够聪明,可以只发送差异,而不是重新发送整个项目。它还有助于在 Web 服务器上保留存储库的冗余副本,以防万一我端出现硬件故障(尽管为了安全起见,我也推送到 GitHub)。

于 2009-01-09T02:48:55.870 回答
14

我们使用Webistrano,一个 Capistrano 的 Web 前端,并且对它非常满意。

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

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

配置完成后,非程序员甚至可以很容易地使用它,例如部署临时版本的测试人员。

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

于 2009-04-07T10:30:43.117 回答
7

我使用Apache Ant部署到不同的目标(开发、QA 和实时)。Ant 设计用于 Java 部署,但它为部署任意文件提供了一个非常有用的通用案例解决方案。

build.xml 文件的语法很容易学习 - 您定义不同的目标及其依赖项,当您在命令行上调用 ant 程序时,它们会运行。

例如,我有 dev、QA 和 live 的目标,每个目标都依赖于 cvsbuild 目标,该目标从我们的 CVS 服务器检查最新的头版本,将适当的文件复制到构建目录(使用文件集标记),然后rsync 将构建目录同步到适当的服务器。有一些怪癖要学习,而且学习曲线并不完全平坦,但我多年来一直这样做没有问题,所以我会根据你的情况推荐它,虽然我很好奇我还有什么其他答案会在这个线程上看到。

于 2009-01-08T20:24:19.547 回答
6

我使用 Git 手动做一些事情。一个用于开发的存储库,它被git push --mirror编入公共存储库,实时服务器是从中提取的第三个存储库。我想这部分与您自己的设置相同。

最大的不同是我几乎在我正在处理的每一个更改中都使用分支(我现在大约有 5 个),并且倾向于在它们之间来回切换。除了合并其他分支外,主分支不会直接更改。

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

于 2009-01-09T01:56:39.750 回答
3

我知道Phing已经被提到过几次了,但是我对phpUnderControl非常幸运。对我们来说我们

  1. 将分支的各个副本检出到本地计算机
  2. 分支经过测试,然后合并到主干
  3. 对 Trunk 的提交由 phpUnderControl 自动构建,运行测试并构建所有文档,应用数据库增量
  4. 主干通过质量测试,然后合并到我们的稳定分支
  5. 同样,phpUnderControl 会自动构建 Stable、运行测试、生成文档并更新数据库
  6. 当我们准备好推送到生产环境时,我们运行一个 rsync 脚本来备份生产环境,更新数据库,然后推送文件。rsync 命令是手动调用的,以便我们确保有人正在观看促销活动。
于 2009-01-09T02:21:05.363 回答
3

自制部署脚本的替代方案是部署到平台即服务,它为您抽象出很多工作。PaaS 通常会提供自己的代码部署工具,以及可扩展性、容错性(例如,当硬件出现故障时不会停机),并且通常是用于监控、日志检查等的出色工具包。部署到已知的良好配置将随着时间的推移保持最新(让您少一个头痛)。

我推荐的 PaaS 是dotCloud,除了 PHP(参见他们的 PHP 快速入门)之外,它还可以部署 MySQL、MongoDB 和一大堆附加服务。它还具有不错的优点,例如零停机部署、即时回滚、对 SSL 和 websocket 的完全支持等。还有一个免费层,总是很好:)

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

希望这可以帮助!

所罗门

于 2012-08-03T22:41:12.940 回答
2

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

但是,如果你想要一个 PHP 的持续集成系统,我猜Phing是 PHP 的最佳选择。不过,我自己还没有测试过,因为我以手动方式填充,例如 scp。

于 2009-01-08T20:15:31.750 回答
2

我迟到了,但我想我会分享我们的方法。我们将 Phing 与Phingistrano一起使用,它通过预构建的构建文件为 Phing 提供类似 Capistrano 的功能。它非常酷,但仅在您目前使用 Git 时才有效。

于 2012-02-17T15:04:54.483 回答
1

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

于 2009-01-09T00:46:00.890 回答
1

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

另一种选择是使用 Capistrano。显然,它与 PHP 的集成不如与 Ruby 的集成好,但您仍然可以将它用于很多东西。

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

于 2009-01-09T21:28:31.330 回答
1

http://controltier.org/wiki/Main_Page

我们将使用它进行多服务器部署和维护。

于 2010-07-08T07:23:49.543 回答
1

晚了一年,但是……就我而言,部署不是自动的。我发现自动部署代码和运行数据库迁移脚本很危险。

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

于 2010-09-23T19:06:31.063 回答
1

在我的工作中,我自己和我的团队已经为 capistrano 的部署开发了一个面向 Phing 的替代品,我们还整合了 phing 中可用的一些好东西,例如 PHPUnit 测试、phpcs 和 PHPDocumentor。我们已经把它做成了一个 git repo,它可以作为 git 中的子模块添加到项目中,并且效果很好。我已经将它附加到了一些项目中,并且它足够模块化,可以很容易地在我们的多个环境(暂存、测试、生产等)中的任何项目中使用它。

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

我现在不能发布任何链接,因为 repo 还没有公开,但是我被告知我们有时会很快开源它,所以如果你有兴趣或者如果你有,请随时与我联系关于使用 phing 和 git 自动化部署的任何问题。

于 2011-02-17T05:13:23.457 回答
0

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

你需要为全世界开通SVN访问

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

我认为 Phing 生成一个分支 + 合并所有 js/css + 替换阶段配置 + ssh 上传到所有 www 服务器是更好的方法。

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

于 2010-02-24T08:38:19.013 回答