22

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

我将本地机器的最新代码检出到名为“myapp_latest_svn”的目录中。我的主要 settings.php 中有特定于站点和位置的代码,它具有 H_PATH = ' http://myapp.com ' & db_host、db_user_name 和 db_password 的 db 配置设置,这在本地机器设置中有所不同(其中 localhost /myapp.com 只是一个 Apache 别名)& 在生产(在 myapp.com 上运行的实时站点)服务器上。

.htaccess 文件也不同于生产服务器上的文件。简而言之,开发和生产之间存在许多差异。

我将所有工作都保存在 SVN 中。每天早上我都会使用 SVN Update,它将最新的代码更新到我的本地 svn 存储库。当我准备好上线时,我使用 svn Commit 构建了一个版本。

然后在发布中,我必须记住将所有适当的开发文件更改为它们的生产对应文件。现在我必须手动编辑生产 settings.php 和 .htaccess 以反映站点特定的更改。

我正在寻找一种从开发到生产的自动化方式,完成版本控制,无需手动编辑文件,这容易出错和不好的做法。

一种方法是使文件的生产版本为只读 (0444)。这样,当我进行 svn 导出时,它们不会被文件的开发版本覆盖,而且我不必担心每次从开发到生产的过程中编辑文件。但这是做持续集成之类的糟糕方法。

还可以制作多个 settings.php 副本(一个用于 localhost、beta 和 prod)。然后使用从 svn 导出的 shell 脚本,一旦导出完成,它会根据我们部署到的位置将 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 中检查。

每次我部署我的站点时我都不想做的事情是我必须更改设置。

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

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

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

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

这对于许多在野外想成为应用程序开发人员的人来说可能很有用。

提前致谢,

工作时间

4

4 回答 4

13

我建议您查看Capistrano以了解您的部署问题。我用它来部署 PHP 系统,它会做你描述的所有事情(在你的部署配方中使用一些脚本)。

我没有在我的远程仓库中保留任何配置文件 - 当我在 dev 中结帐时,我可以添加它们一次,然后忽略它们,这样我就不会意外地检查它们。在部署方面,我设置了 cap deploy 配方,以便它将设置文件写入已部署的版本。这样,我就不必担心部署和遗漏任何关键的东西。

Cap 还负责处理任何上传的资产(对目录进行符号链接,以便它们在每次部署时保持原位),它还会自动备份所有资产文件和部署到 Amazon S3 的数据库。很漂亮,嗯?

于 2009-07-17T13:17:25.440 回答
8

我有一个名为 config 的 Phing 任务,它询问我想为哪个环境配置代码。该任务接受几个可能的值:本地、开发、登台、生产等。

一旦我告诉它环境,它就会读入适当的 .properties 文件(即 local.properties、production.properties 等)

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

创建这些文件:

common/build/templates/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

构建/属性/production.properties

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

常见/构建/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 变量,所以它可以在命令行上正常工作。

于 2010-06-10T21:45:00.083 回答
2

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

于 2009-07-17T13:18:03.973 回答
0

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

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

在此处输入图像描述

它依赖于 bash 工具组、rsync、git、link,但是一个 web ui 通常可以很好地操作,试试看:)

于 2015-10-08T06:16:55.113 回答