在使用git进行代码管理时候,有开发分支dev,线上分支pro。
在开发的时候,每个人会从dev分支上拉出自己的分支,进行开发,完成后合并到dev分支上面。
线上环境进行更新的时候,会从pro分支上面pull最近的代码,然后重启服务运行。
这里有一个问题,dev分支和pro分支,往往会存在几个文件不同情况,例如配置文件setting等等。在这种情况下应该如何处理比较合适?
如果git中不包含setting文件的话,如果配置文件需要更新的话,在线上环境就需要手动修改代码。
请问大家是如何做的?结合git做到自动化部署和回退?
多谢
环境的区别:
生产环境与非生产环境(如开发环境,测试环境等)的区别,除了配置之外,可能还有一些依赖的资源也是不同的.
配置文件:
我这边常用的方法是将生产环境和其他环境的配置通通写入那个配置文件(或者是多个文件config/dev.json,config/pro.json...),然后有一个配置处理器会负责读取本地环境是什么环境(这些都是包含在git范围内的,有可能就是初始化模块),进而读到配置文件中对应环境的配置.如果是只有一个配置文件,类似如下:
环境标识
配置处理器如何知道当前环境是什么呢?这里需要有一个
环境标识
,比较直接粗放的可以是IP地址,比如生产环境是部署在某个固定IP(适合单服单应用情况)上,配置文件的生产环境配置就写在这个IP下面,那配置处理器取到当前运行环境的IP后,去读取配置文件指定IP模块的配置.还有一种方式是在使用一个
标识文件
,比如应用运行的所有的环境下都有一个/data/tag文本文件(也可以在项目目录下,但是用.gitignore包含),这个文件不在git范围内就行,其中就只有一行,写了pro
或dev
,这样配置处理器通过读这个文件就知道取配置文件中的哪部分配置了.最常用的方式还有环境变量,比如
export APP_ENV=production
,然后先读这个变量再读所在环境的对应配置.Config Server
后期随着应用大多是分布式部署,也就是可能同一个应用要部署到20几台或更多的服务器,这时必须有一个config server来专门处理,分发,更新各个服务器的应用配置.
在这台config server上可以独立配置哪些服务器用什么样的配置(通常以请求方的ip来配),各个应用在启动时会去config server请求自己的配置.
这样一来应用可以做到完全无状态,根本不再需要配置文件, 而配置可以随意控制细粒度(比如某台服务器我想把请求流量调大点),以及实现灰度发布(部分服务器部署新代码), 我想这可能是目前大多数互联网企业采用的方式.
设置忽略文件,忽略文件中存放不同配置参数。