使用Git Push进行分段和生产服务器的Web开发方案

3
我正在使用git来管理一个动态网站(PHP + MySQL),我希望以最高效和无麻烦的方式将文件从我的本地主机发送到我的暂存开发服务器。
我目前相信最好的方法是使用this git branching model来组织我的本地git仓库。从那里,我将使用release分支将代码push到我的暂存服务器进行测试。一旦我确定release代码在暂存服务器上正常工作,我就可以将其与我的master分支merge并将其push到我的生产服务器推送到暂存服务器:

如许多git入门文章所述,如果我push到一个非裸库中可能会遇到问题,因此,正如这个回答所建议的那样,我计划将release分支push到服务器上的一个库,并使用post-receive hook将库clone到充当Web托管目录的non-bare库中。

推送到生产服务器

这是我最新困惑的地方...

在我引用的上述回应中,@Paul说当向一个实时的开发服务器进行push时,情况就完全不同了,这让我感到好奇。我猜我没有看到问题所在。如果遵循与上述相同的步骤,但是针对master分支,是否安全且无麻烦?可能会有什么陷阱?

配置文件:

关于每个环境都独有的配置文件(.htaccess, config.php等),似乎最简单的方法就是在各自的服务器上的各自的repo中.gitignore每个文件。您是否可以立即发现任何错误?还有更好的方案吗?

访问数据:

最后,正如我最初所述,该站点使用MySQL数据库来存储数据。您建议我如何从staging serverlocalhost访问该数据(用于测试目的)?
我意识到我可能在一个帖子中问了太多问题,但由于它们都与设置这个开发计划的最佳方式有关,我认为这是必要的。

你确定要使用源代码控制系统来管理这种任务吗? 将文件推送到服务器并不难,而且有像 Rsync 这样非常有效的替代方案。对于一个不同寻常的 Web 应用程序,您应该关注配置文件和数据库方面的问题,因为那里往往会出问题。您绝对必须将这些内容保存在源代码控制下,并且需要一种可预测、可重复的机制来确保它们在每个服务器/环境上保持更新。 - Neville Kuyt
@NevilleK 看起来Mark在下面的回答中也是和我想的一样。不过,如果你有更多的建议,我也很愿意考虑。 - ServAce85
3个回答

1

推送到生产服务器

我假设在你引用的回答中,回答中提到将代码推送到生产服务器是“另一回事”,因为你可以将任何旧版本的提交推送到测试服务器进行测试,但是你必须非常小心地只将经过彻底测试的版本推送到生产服务器。

我认为你所提到的方法(通过将代码推送到一个裸仓库并使用post-receive执行git checkout -f并适当设置GIT_WORK_TREE来部署)是从Git部署的好方法。

配置文件

这是一个合理的计划,但是你必须小心使用.gitignore来忽略配置文件-你可能需要查看这个答案以了解更多信息:

访问数据

我认为关于暂存服务器数据的问题实际上是一个单独的问题,因为这些数据都不会在您的版本控制系统中 - 在这里添加另一个关于该问题的问题可能是值得的。您可以编写一个脚本,在您的生产服务器上转储数据并将其导入到暂存服务器上,但我可以想象许多情况下这将是不可取的,特别是需要考虑客户详细信息和数据保护法律的情况。


谢谢您的回答。关于访问数据,我原本期望您会建议我将其作为一个单独的问题来提出...我之所以认为它可能与这个版本控制方案有关,是因为我认为可以设置不同的配置文件从各个服务器访问生产服务器上的数据,或类似的操作。 - ServAce85

0

Git FAQ建议使用this post-receive钩子脚本在推送后重置非裸库的头部。它将使用stash保存远程未提交的任何更改。个人而言,我宁愿在这种情况下拒绝推送,但这可以完成。

(请注意:许多答案包含过时的FAQ和脚本链接-希望这些链接至少在一段时间内保持有效)


0

我也使用git flow。在expressionengine中的配置文件中,我们使用ee master config,它基本上确定了所处的环境并应用了特定的配置。我想它可以很容易地修改为你正在做的任何事情。

对于部署,我们使用Beanstalk,它允许您将“[deploy:Environment]”添加到提交消息中,这将使它上传(ftp)您指定的分支(您提交的分支)到指定的环境,在您git push时在他们的Web界面中进行配置。

我一直在寻找一个有效的解决方案来处理.htaccess文件,以便我可以htpasswd其中一个环境,但不是所有环境。看起来在Apache 2.3中可能有可能实现,类似于这样:

<if "%{HTTP_HOST} == 'dev.example.com'">
    # auth directives
</if>

但是遗憾的是,我们使用的大多数生产服务器都运行着早期版本,不支持该指令 :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接