如何正确地将应用程序从开发部署到生产以及如何处理多个站点配置。我所有的开发都是通过位于 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 脚本进行集成而不会导致任何这些问题。
这对于许多在野外想成为应用程序开发人员的人来说可能很有用。
提前致谢,
工作时间