2009-07-17 30 views
22

如何正确部署应用程序从开发到生产以及如何处理多个站点配置。 我的所有开发都是通过位于var/svn/myapp/trunk的svn完成的,实际生产代码位于/ var/www/myapp中。如何正确部署您的PHP应用程序?

我把我的本地机器上的最新代码签出到名为“myapp_latest_svn”的目录中。 我的网站和地点的特定代码在我的主要settings.php配置,其中有H_PATH =“http://myapp.com” &数据库配置为DB_HOST,db_user_name和DB_PASSWORD这是因为你知道在 本地计算机设置(其中localhost/MyApp的不同设置。 com只是一个Apache别名)&上的生产(live site运行在myapp.com上)服务器。

此外,.htaccess文件与生产服务器上的不同。总之,开发和生产之间有许多不同之处。

我把我所有的工作放在SVN中。每天早上我使用SVN Update将最新的代码更新到我的本地svn仓库。 当我准备上线时,我用svn Commit构建了一个发行版。

然后在发行版中,我必须记住将所有适当的开发文件更改为其生产副本。 现在我不得不手动编辑生产settings.php & .htaccess以反映网站特定的更改。

我正在寻找一种自动化的方式从开发到版本完整的版本和 没有手动编辑文件这是容易出错和不好的做法。

一种方法是使文件的生产版本只读(0444)。这样,当我做一个svn导出, 他们不会被开发版本的文件覆盖,我不必担心编辑 每个从开发到生产的文件。但是,这是一种糟糕的做法,例如持续集成。

另外通过制作settings.php的多个副本(一个用于localhost,beta和prod)。然后使用从svn导出的外壳脚本 ,然后一旦导出完成,它将使用正确的settings.php替换settings.php, ,具体取决于我们部署的位置。这样一切都是自动的。 但这也是一个跛脚的路要走。

最后的办法是

if(eregi ("myapp.com$", $_SERVER['HTTP_HOST'])){ 

    define('H_PATH', 'myapp.com'); 

} else { 

    define('H_PATH', 'localmyapp.com'); 

} 

这是好的尽可能的settings.php而言。 但是.htaccess的内容,你不能在.htaccess中像上面那样检查。

什么我不想最终做每次我部署我的网站,我必须改变设置。

我的数据库模式不在版本控制中,所以db对我来说不是问题,只有settings.php和.htaccess。

另外我如何告诉svn不要更新某些目录,因为这也是特定于站点(/ log,/ cache,/ assets,/ downloads)。 另外我还需要保留apache(www_data)写入访问权限以完成上述文件。

最后,我不想在导出时将空的中继目录和.svn文件复制到生产服务器。

从svn构建到生产服务器时,如何使用Phing或甚至shell脚本进行集成而不会导致任何这些问题。

这可能对很多野外应用程序开发人员非常有用。

由于提前,

ocptime

回答

13

我建议你看看Capistrano您的部署困境。我用它来部署PHP系统,它会完成你描述的任何事情(在你的部署配方中有一些脚本工作)。

我没有在我的远程回购中保留任何配置文件 - 当我在dev中签出时,我可以添加一次,然后忽略它们,所以我不会偶然检查它们。在部署时,我的cap部署配置已设置好,以便将设置文件写入部署的版本。这样,我就不必担心部署和丢失任何关键的东西。

Cap还负责管理任何上传的资产(对这些目录进行符号化以便它们保留在每个部署中),并且它还自动备份所有资产文件和部署到Amazon S3的数据库。漂亮漂亮,呃?

+0

伟大的链接!谢谢! – 2010-01-18 05:20:42

2

我将我的设置文件和.haccess存储在SVN中,并重命名文件名,例如settings.php.example和.htaccess.example。这样,当我创建一个新版本时,我不需要担心覆盖的东西。

8

我有一个名为config的Phing任务,它询问我要为哪个环境配置代码。任务接受仿宋:本地,发展,分期,生产等

一旦我告诉它的环境,它在适当的属性文件读取(即local.properties,production.properties等)

下一步将是您的关键:将模板存储在您的配置和htaccess文件中,然后对它们运行filterChain replaceTokens任务,以便使用属性文件中的值替换它们的标记。

创建这些文件:

通用/建设/模板/ settings.tpl

define('H_PATH','##H_PATH##'); 
define('ENVIRONMENT', '##ENVIRONMENT##'); 

编译/模板/ htaccess.tpl

http://##H_PATH## 

构建/属性/ local.properties

site.H_PATH = localmyapp.com 
site.ENVIRONMENT = local 

build/properties/production.properties

site.H_PATH = myapp.com 
site.ENVIRONMENT = production 

common/build/build。XML

<target name="config"> 
    <input propertyname="env" validargs="local,production">Enter environment name:</input> 
    <property file="build/properties/${environment}.properties" /> 
    <copy file="build/templates/settings.tpl" 
    tofile="config/settings.php" overwrite="true"> 
    <filterchain> 
     <replacetokens begintoken="##" endtoken="##">  
      <token key="H_PATH" value="${site.H_PATH}" /> 
      <token key="ENVIRONMENT" value="${site.ENVIRONMENT}" /> 
     </replacetokens>   
    </filterchain> 
    </copy>  
    <copy file="build/templates/htaccess.tpl" 
    tofile="public/.htaccess" overwrite="true">  
    <filterchain> 
     <replacetokens begintoken="##" endtoken="##">  
      <token key="H_PATH" value="${site.H_PATH}" />               
     </replacetokens>   
    </filterchain> 
    </copy>    
    <echo msg="Configured settings.php and .htaccess for ${environment}" />    
</target>        

现在,当您想要配置的网站在本地运行只需键入:

phing config 

然后键入:

local 

然后按回车键。而已! 这样做的一个巨大好处就是你的代码中不再需要任何if/else语句。另外,它不依赖于$ _SERVER变量,所以它可以在命令行上正常工作。

0

你可以考虑Capistrano,Magallanes,Deployer,但它们也是脚本。我可能会建议你试试walle-web,这是一个使用yii2开箱即用PHP编写的部署工具。我已经在我们公司托管了好几个月,它在部署测试,模拟和生产环境的同时运行顺利。

它支持您配置预部署,后部署,发布后任务,然后您可以更改您的环境配置,例如cp db_test.php db.php

enter image description here

这取决于bash的工具组,rsync的,混帐,链接,而是一个Web UI的普遍好评操作,试试:)

相关问题