【问题标题】:What is your preferred php deployment strategy? [closed]您首选的 php 部署策略是什么? [关闭]
【发布时间】:2010-09-30 08:30:37
【问题描述】:

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

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

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

更多信息

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

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

【问题讨论】:

标签: php deployment capistrano


【解决方案1】:

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

我们的部署流程如下:

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

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

【讨论】:

  • 我正要发布我在 Windows/.NET 商店中所做的事情的列表,但它或多或少是你在这里得到的。 +1
  • 您是否遇到过将 svn co 作为生产环境的缺点?我真的想不出任何缺点,但是将 svn co 作为产品似乎并不“干净”?为什么不用 svn 导出或 rsync?
  • 由于 co 和 export 之间的基本区别 - 您无法推送特定更改,因此您必须再次导出整个应用程序。这是一个非常重要的区别,让生活变得更轻松
  • 为什么要把网站竖屏?如果您运行releases/目录,并通过符号链接将liveSite/指向您在releases/中的文件夹,那么您可以将站点完全检出到新的releases/文件夹中,并在co完成后立即翻转符号链接?无需停机(除非您是在符号链接切换期间发出请求的可怜的呜咽)。
  • 谁负责执行所有这些任务,例如在生产中更新 SVN 和新版本中的符号链接?是芬吗?是詹金斯吗?
【解决方案2】:

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

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

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

配置完成后,非程序员也可以轻松使用它,例如部署临时版本的测试人员。

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

【讨论】:

    【解决方案3】:

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

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

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

    希望这会有所帮助!

    所罗门

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            http://controltier.org/wiki/Main_Page

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

            【讨论】:

              【解决方案8】:

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

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

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

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

              ssh 到 10 个 www server 和 svn up 也很麻烦。

              【讨论】:

              • 向全世界开放我的svn服务器,没办法!只需使用防火墙和 ssl 身份验证来限制谁可以看到您的代码。
              【解决方案9】:

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

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

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                • 多年来我在中小型项目上也一直在做同样的事情。我不得不说,这对我来说效果很好。您一定会喜欢这种方法的简单性。
                • 您如何使用这种方法处理数据库?
                • @neilc 不幸的是,手动操作。对数据库的任何更改都需要在推送之前手动执行。
                • 我通常包含()一个包含数据库配置的PHP文件,并手动将文件放在服务器或测试机器上。这样您就不会将密码存储在 git 中,也不会意外地在生产数据库上进行操作。
                • 你如何配置 git 来为你做这件事?有没有指南/教程?提前谢谢你。
                【解决方案11】:

                我知道Phing 已经被多次提及,但我对phpUnderControl 很幸运。对我们来说

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

                【讨论】:

                • phpUnderControl 已死:|
                【解决方案12】:

                我使用 Git 手动操作。一个用于开发的存储库,将git push --mirror'ed 到公共存储库,实时服务器是从中提取的第三个存储库。我想这部分和你自己的设置一样。

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

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

                【讨论】:

                  【解决方案13】:

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

                  【讨论】:

                  • 所以您的 .svn 目录分散在整个网站上?我的纯粹大脑与此相反:)
                  • 这里只处理源代码。部署通常需要采取其他措施 - 应用数据库更改、清除缓存等。
                  【解决方案14】:

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

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

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

                  【讨论】:

                    【解决方案15】:

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

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-12-21
                      • 2010-10-14
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多