2010-01-05 125 views
13

我目前正在为慈善组织开发一个php应用程序,而我现在正处于定义部署实践的阶段。如何为php应用程序部署

我们的应用程序使用Zend Framework和Doctrine。该应用程序将推出到不同的服务器,每个服务器都有不同的配置文件。这些机器都是Windows和Linux(但都是Apache和php 5.2+)。

该源代码在Subversion存储库中可用,我们希望在Linux服务器上构建和存储我们的软件包。

我们希望更新过程与在应用程序目录中运行更新命令一样简单,其中up​​date命令还会更新数据库(使用原则脚本)并确保框架的依赖关系。这个更新命令必须是机器上的一个命令(我们不能ssh进入它们)。最好我们可以选择下载一个新版本或提供一个已经下载的新版本的tarball。 (但只下载或只有压缩包也可以)

包含安装和更新(新版本)的软件包最好由单个命令构建。

我一直在阅读关于phar's,pear,phing的一些信息,但我不知道最好的方法是做什么。持续集成服务器并不是必须的,但我想在构建版本后自动部署测试环境。

最初只有php应用程序的更新非常容易,最初填写配置文件时可以手动完成安装。

回答

0

你说你有一个claster。我们处于相同的位置,我们使用ZF和Doctrine。这就是我们如何解决问题的方法:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="yourprojectname" basedir="."> 

<target name="deploy" depends="apply-deltas,update-app01,update-app02"> 

</target> 

<target name="update-app01"> 

    <sshexec host="app01" 
    username="yourusername" 
    password="yourpassword" 
    trust="true" 
    command="cd path/to/root/directory &amp;&amp; 
     svn update &amp;&amp; 
     php cmd/clear_cache.php 
     "/> 

</target> 

<target name="update-app02"> 

    <sshexec host="app02" 
     username="yourusername" 
     password="yourpassword" 
     trust="true" 
     command="cd path/to/root/directory &amp;&amp; 
     svn update &amp;&amp; 
     php cmd/clear_cache.php 
     "/> 

</target> 

    <target name="apply-deltas" depends="liquibase-prepare"> 
    <updateDatabase 
      changeLogFile="${db.changelog.file}" 
      driver="${database.driver}" 
      url="${database.url}" 
      username="${database.username}" 
      password="${database.password}" 
      promptOnNonLocalDatabase="${prompt.user.if.not.local.database}" 
      dropFirst="false" 
      classpathref="classpath" > 
      <changeLogProperty name="table.name" value="ant_param_table"/> 
    </updateDatabase> 
    </target> 


<target name="liquibase-prepare"> 
    <path id="classpath"> 
    <fileset dir="${basedir}/libNoPackage"> 
     <include name="**/*.jar" /> 
    </fileset> 
    </path> 

    <taskdef resource="liquibasetasks.properties"> 
     <classpath refid="classpath"/> 
    </taskdef> 
    </target> 

</project> 

这远非理想,但它对我们来说工作正常。希望有所帮助。

链接:

Apache Ant

LiquiBase

如果你有一些问题,请让我知道这样我就可以更新answer.t

0

也许有时一个简单的方法最有效。如果你保持简单的svn repo标签的稳定版本,那么你只需编写一个批处理/ bash脚本来下载最新版本,同时在没有用户干预的情况下备份到旧版本 - 你也可以用这种方式运行所需的任何脚本。另一种方法是在PHP中编写一个简单的接口,但这取决于它需要多么简单。

3

我会首先让各种服务器的应用程序根为SVN工作副本。您可以添加mod_rewrite(或针对IIS的IIRF ASAPI筛选器)规则,以确保人们无法直接访问.svn目录。

然后,更新到最新的来源可以像SVN更新一样简单。为了您的数据库更新需求,我会在SVN中维护数据库修改脚本。您可能需要将SVN更新包装在批处理/外壳脚本中,以便在脚本下载后执行数据库更新。

对于活动服务器上的变更管理,我也有他们的工作副本不是中继,而是一个发布分支。当您准备发布时,您可以将中继合并到发布分支中。这将允许您在实时服务器上执行部署之前测试部署并确保其稳定。它还具有很好的副作用,即在需要追踪发布后的问题时为您提供网站发布版本的完美副本。

最后,根据这些更新的强度和时间安排,您可能还希望让更新脚本翻转“维护中”切换,以便用户临时满足正确的消息而不是破坏的站点。

2

本杰明Eberlei发表了一篇博客几个星期前名为Trying a Two Step PEAR/PHAR approach to develop and deploy。他描述的是部署PHP应用程序的一个非常有趣和优雅的过程。

+1

程序,或者至少是文章,似乎对我来说过于复杂。我没有看到他想要完成的事情的清晰解释。 – rick 2010-01-06 05:45:23

1

我已经使用subversion作为一个部署工具来取得很好的效果。

在所有生产服务器上使用svn update,或者使用phing。 (或使用phing到SVN更新,甚至。)

使回滚和备份易如反掌。只记得删除任何.svn目录的访问权限。

1

无论哪种方式,我会用phing或类似的东西来管理你的构建。让它运行你的测试,生成文档,构建和发布你的软件包/ tarball。

至于分配,你可以run your own PEAR server。这里的理由是你说你想让用户获得更新,你有Windows和Linux用户,并且你想处理它们的依赖关系。 PEAR应该能够通过一个命令来处理所有的事情。

这就是说,我会用最简单的方式去适应你的用户。这可能仅仅是通过HTTP和一个小的PHP升级脚本可用一个压缩包(或phing目标。)

无疑可提供一种简单的方法来回滚到以前的版本。通过代码/配置,您可以保留副本。使用数据库,使用迁移(这听起来像你已经在做)