您首选的php部署策略是什么?[关闭]


161

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

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

在我独自潜水之前,很高兴听到其他人在他们的项目中是如何做到这一点的。

更多信息

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

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


可爱:)感谢您的编辑splattne。
GloryFish

1
@Paul Tomblin:天哪,我不能停止笑!没有更好的方法了:)
AndreiRînea10年

有人可以回答这个问题,请- stackoverflow.com/questions/36034277/...
Sandeepan纳特

Answers:


109

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

我们的部署例程如下:

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

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


我本来打算在Windows / .NET商店中发布我的工作清单,但这或多或少是您在这里所拥有的。+1
Daniel Schaffer

使用svn co作为生产环境是否遇到任何不利条件?我真的没有想到任何缺点,但是将svn co用作生产似乎并不“干净”吗?为什么不使用svn导出或rsync?
ChrisR 2010年

由于公司与出口公司之间的根本区别-您无法推送特定更改,因此必须再次导出整个应用程序。这是一个非常重要的差异,它使生活变得轻松得多
Eran Galperin 2010年

36
为什么要将网站放下屏幕?如果您运行releases /目录,并通过符号链接将liveSite /指向releases /中的文件夹,那么您可以将站点完全签出到新的releases /文件夹中,并在完成合作后立即翻转符号链接?无需停机(除非您是在该符号链接切换期间发出请求的可怜的抽泣者)。
约瑟夫·拉斯特

2
谁负责执行所有这些任务,例如在生产环境中更新SVN和新版本中的symlink?是网络钓鱼吗?是詹金斯吗?
Daniel Ribeiro 2013年

24

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


多年来,我在中小型项目上也做过同样的事情。我必须说,这对我来说一直很好。您一定喜欢这种方法的简单性。
克里斯·艾伦·莱恩

3
您如何使用这种方法处理数据库?
32423hjh32423 2011年

1
@neilc不幸的是,用手。对数据库的任何更改都需要在推送之前手动执行。
凯尔·克罗宁

我通常包括一个包含数据库配置的PHP文件,并将其手动放置在服务器或测试计算机上。这样,您就不会在git中存储密码,也不会意外地在生产数据库上进行操作。
马特

您如何配置git为您做到这一点?是否有任何指南/教程?先感谢您。
米格尔·史蒂文斯

14

我们使用Capistrano的Web前端Webistrano,对此感到非常满意。

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

即使Capistrano和Webistrano是Ruby应用程序,部署“食谱”的语法也很简单,功能强大,足以为任何PHP程序员所理解。Capistrano最初是为Ruby on Rails项目构建的,但可以轻松容纳PHP项目。

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

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


7

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

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

例如,我有dev,QA和live的目标,每个目标都取决于cvsbuild目标,该目标从我们的CVS服务器中检出最新的头部修订版本,将适当的文件复制到build目录(使用fileset标签),然后r将构建目录同步到适当的服务器。有一些古怪的东西要学习,学习曲线并不完全平坦,但是多年来我一直这样做,没有任何麻烦,因此我建议您使用它,尽管我很好奇我还会回答什么?会在该线程上看到。


6

我使用Git手动进行操作。一个用于开发的存储库已发布git push --mirror到公共存储库中,而实时服务器是从中提取的第三个存储库。我想这部分与您自己的设置相同。

最大的区别在于,我几乎在进行所有更改时都使用分支(现在大约有5个),并且倾向于在它们之间来回切换。除了合并其他分支外,master分支不会直接更改。

我直接从master分支运行实时服务器,当我完成另一个分支并准备将其合并时,将服务器翻转到该分支一段时间。如果损坏,将其恢复为主状态需要几秒钟。如果可行,它将合并到master中,并更新实时代码。我想在SVN中对此进行类推是拥有两个工作副本并通过符号链接指向实时副本。


3

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

  1. 签出分支到本地计算机的单个副本
  2. 测试分支,然后合并到中继
  3. 提交到Trunk由phpUnderControl自动构建,运行测试并构建所有文档,应用数据库增量
  4. Trunk经过质量测试,然后合并到我们的Stable分支中
  5. 再次,phpUnderControl自动建立稳定,运行测试,生成文档并更新数据库
  6. 当我们准备进行生产时,我们将运行一个rsync脚本,该脚本备份生产,更新数据库,然后上载文件。手动调用rsync命令,以便确保有人在观看促销。

5
phpUnderControl已死:|
m02ph3u5

3

自制部署脚本的另一种选择是部署到平台即服务,为您抽象出很多工作。PaaS通常将提供自己的代码部署工具,以及扩展,容错(例如,在硬件出现故障时不会关闭),并且通常是用于监视,日志检查等的强大工具包。已知的良好配置,它将随着时间的流逝而保持最新(为您减少麻烦)。

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

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

希望这可以帮助!

所罗门


2

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

但是,如果您想要PHP的持续集成系统,我想Phing是PHP的最佳选择。不过,我还没有亲自测试过,因为我确实以手工方式填充了例如scp。


2

我参加聚会很晚,但我想我会分享我们的方法。我们将Phing与Phingistrano结合使用,后者通过预先构建的构建文件为Phing提供类似Capistrano的功能。这非常酷,但是仅当您当前使用Git时才有效。


1

我在服务器上有SVN版本分支的工作副本。更新站点(不进行模式更改时)就像发出SVN更新命令一样容易。我什至不必使网站离线。


1
因此,您的.svn目录遍布整个网站吗?我的纯粹主义者的大脑与此
背道而驰

这仅会处理源代码。部署往往需要采取其他行动-应用数据库的变化,缓存清理,等等
狮子座Mamchenkov

1

如果您可以忍受xml配置文件的麻烦,那么最好使用phing。Symfony框架有其自己的rake(pake)端口,该端口运行良好,但与Symfony的其余部分紧密耦合(尽管您可以将它们分开)。

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

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



1

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

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


1

在我的工作中,我本人和我的团队为Capistrano的部署开发了面向Phing的替代产品,并且我们还结合了phing中的一些好东西,例如PHPUnit测试,phpcs和PHPDocumentor。我们将其制作为git仓库,可以将其作为git中的子模块添加到项目中,并且效果很好。我已经将其附加到少数几个项目中,并且它具有足够的模块化特性,因此可以轻松地使其与我们在多个环境(分期,测试,生产等)中的任何项目一起使用。

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

我目前无法发布任何链接,因为该回购尚未公开,但有人告诉我们我们有时会很快将其开源,因此如果您有兴趣或有任何疑问,请随时与我联系关于使用phing和git自动化部署的任何问题。


0

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

您需要为整个世界打开SVN访问权限

生产Web服务器中有许多.svn

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

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


不能向全世界开放我的svn服务器!只需在ssl上使用防火墙和身份验证即可限制谁可以看到您的代码。
Shadok 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.