4

我们使用 ExpressionEngine CMS (php) 创建网站。对于每个站点,我们设置一个 subversion 存储库并提交 EE 安装以及使用的任何自定义模板、图像、javascript 等。存储库中包含包含所有环境变量的文件和 .htaccess 文件。

我们有一个开发服务器,其中包含通过我们用于开发的提交后更新的存储库的工作副本。当我们准备好发布时,我们在 subversion 中创建一个分支,进行生产环境所需的任何更改,标记发布号,导出存储库,将其上传到实时服务器上的新目录,并将文件符号链接到位。回滚就像符号链接回以前的版本一样简单。

问题是我们必须修改开发服务器和生产服务器需要不同的环境变量的那一步。这就像(取消)注释会重定向到错误位置的 htaccess 规则,因为域不同而换出 google map API 密钥,运行脚本将 javascript 最小化为一个混淆文件以保持大小和 http 连接减少等.

问题是如何才能更加自动化?我们希望将发布程序降到最低限度。我熟悉 Capistrano 和 Make 等工具的存在,但我不确定如何让它们修改所有必要的文件......你将如何组织这样的事情?当它每两周发生一次时,这值得花时间自动化吗?

4

4 回答 4

3

通过打开 $_SERVER['HTTP_HOST'] 可以处理很多配置选项。

例如

switch ($_SERVER['HTTP_HOST']) {
    case 'developement.domain.com':
        $api_key = "dev environment api key";
        break;
    default:
        $api_key = "live environment api key";
}

然后对于 .htaccess 问题,您可以使用 AccessFileName 指令在虚拟主机定义中设置备用 .htaccess 文件:

<VirtualHost *:80>
    ServerName sitename
    AccessFileName .htaccess-dev
</VirtualHost>
于 2009-05-29T03:47:01.020 回答
0

我通过将配置文件添加到Subversion 忽略列表来处理这个问题。它已经在 Stackoverflow 上得到解决:参见问题 #149485

基本上,我只保留setup.default.php在 SVN 中,并且在每次安装中我手动将其复制到setup.php忽略列表中。这可以防止将文件重新签入到存储库中。此文件很少有更改,可以在需要时进行处理。

于 2009-05-28T18:32:19.527 回答
0

另一种选择是将配置文件分支一次,进入发布分支,然后在目标上将它们标记为已编辑,然后使用合并脚本来记住如何进行三向合并。如果源上的配置发生更改,那么很可能会产生冲突,这是一件好事,因为您可能需要在目标上进行类似的更改。

因此,您在项目的生命周期中保持两棵树:开发和发布。随着事物在开发中的成熟,您将它们整合到发布中。如果您有更多涉及的发布过程,您也可以拥有第三个 QA 树。

当你拉一个新版本时,你从工作区域复制到“发布”区域(作为合并/集成),而不是拉一个全新的分支。如果您当时还想要发布树的即时快照,请创建一个单独的分支/副本/标签,仅用于存档目的。

顺便说一句:这是 Perforce 的亮点之一——它会记住你已经合并的内容,并且永远不会尝试合并两次。

于 2009-05-29T04:13:04.463 回答
0

我们通过维护一个特定于配置的目​​录来处理这个问题。

因此,例如,如果您在开发和生产之间有不同的 .htaccess 和 config.php 文件,它们将被维护在 /trunk/config/{environment}/

我们使用 ant/nant 脚本来创建发布包,这些脚本对每个环境都有一个构建任务。这些任务获取配置特定的文件。

--

另一位评论者建议打开 HTTP_POST。不幸的是,我不能直接发表评论(没有足够高的代表)。使用 HTTP_POST 来确定环境配置存在潜在的安全问题,因为它的值来自客户端。

于 2009-05-29T10:16:48.797 回答