Git:应用程序配置和不同的环境

Git:应用程序配置和不同的环境,git,deployment,development-environment,configuration-files,web-deployment-project,Git,Deployment,Development Environment,Configuration Files,Web Deployment Project,我们在商店中构建的大多数web应用程序都使用这种技术,尽管应用程序本身使用了各种技术(PHP、Rails等),但我们通常为每个站点提供一个登台和生产服务器。通常,这些服务器具有不同的数据库凭据集以及不同的基于环境的配置设置(例如缓存)。我们的工作流程通常涉及每个项目维护两个git分支:反映生产服务器的master和反映暂存的staging。新功能在登台(或分支)上开发,并在完成和部署后合并回主功能 我的问题是关于维护特定于分支和环境的配置文件的最佳方法。我已经从类似的问题和问题中看到了答案,但这

我们在商店中构建的大多数web应用程序都使用这种技术,尽管应用程序本身使用了各种技术(PHP、Rails等),但我们通常为每个站点提供一个登台和生产服务器。通常,这些服务器具有不同的数据库凭据集以及不同的基于环境的配置设置(例如缓存)。我们的工作流程通常涉及每个项目维护两个git分支:反映生产服务器的master和反映暂存的staging。新功能在登台(或分支)上开发,并在完成和部署后合并回主功能

我的问题是关于维护特定于分支和环境的配置文件的最佳方法。我已经从类似的问题和问题中看到了答案,但这两个问题都没有让我满意。主要的两种方法似乎是a)使用.gitignore排除将配置文件保留在git的权限之外,或b)编写反射性的、环境感知的代码,以根据主机名确定要使用的数据库凭据。我对a)的问题是,它只允许代码库中存在一组配置文件(与当前分支无关),因此其他环境的配置文件会丢失。b) 另一方面,似乎只需要以一种与应用程序功能无关的方式对代码库进行不必要的修改

理想情况下,我希望有一种方法可以“锁定”某个分支中的配置文件,这样每当我签出master时,我就可以得到master配置文件,每当我签出staging时,我就可以得到staging配置文件。此外,将登台合并到主机中不应以任何方式影响主机配置文件。到目前为止,我们已经通过在git根目录之外放置包含特定于环境的配置文件的文件夹来解决这个问题,并在部署时手动将适当的文件移动到代码库中,但这当然是不必要的黑客行为(并且可能是危险的)

使用git有什么方法可以实现这一点吗


谢谢你的考虑

我假设,
master
通常只保存已经在
暂存中的提交。如果您向
master
添加了一个额外的提交,其中包含两个分支之间的配置差异,那么在从
staging
中提取的任何内容之上对该提交进行重定,应该可以维护配置。这并不像“将暂存合并到主配置文件中不应以任何方式影响主配置文件”那么简单,但在这些情况下,您可能会遇到合并冲突,这可能已经足够接近了。

不确定为什么人们认为他们可以在没有某种安装工具的情况下逃脱。Git是关于跟踪源代码的,而不是关于部署。您仍然应该有一个“makeinstall”类型的工具,用于从git repo到实际部署,该工具可以执行各种操作,如模板扩展或选择备用文件


例如,您可能将“config.staging”和“config.production”签入git,当您部署到staging时,安装工具选择“config.staging”复制到“config”。或者您可能有一个“config.template”文件,该文件将被模板化以在部署中进行“config”。

您可以尝试使用合并后或签出后挂钩来验证所有内容是否正确,并以其他方式修复它。实际上是这样

这个概念基本上是将这些钩子编写为迷你“makeinstall”脚本,以确保按照分支、主机、其他文件的存在或内容以及您喜欢的任何内容进行正确配置。钩子甚至可以重写您的配置文件或通过填充模板重新创建它们。

试试看

它完全是为管理多环境下的微服务配置而设计的


您可以拥有基本配置文件和特定于环境的覆盖。然后使用它来生成特定环境的最终结果。

会与这里的帮助结合起来吗?是的,我通常就是这样做的。我使用一个部署工具(我主要使用Django,所以我使用Fabric,或Capistrano,在我正在Rails应用程序上工作的罕见实例中),在部署时自动移动或设置到正确配置文件的符号链接。