在使用git進行程式碼管理時候,有開發分支dev,線上分支pro。
在開發的時候,每個人會從dev分支上拉出自己的分支,進行開發,完成後合併到dev分支上面。
線上環境進行更新的時候,會從pro分支上面pull最近的程式碼,然後重新啟動服務運行。
這裡有一個問題,dev分支和pro分支,往往會存在幾個檔案不同情況,例如設定檔setting等等。在這種情況下應該如何處理比較適合?
如果git中不包含setting檔的話,如果設定檔需要更新的話,在線上環境就需要手動修改程式碼。
請問大家是如何做的?結合git做到自動化部署與回退?
多謝
高洛峰2017-05-02 09:27:01
生產環境與非生產環境(如開發環境,測試環境等)的區別,除了配置之外,可能還有一些依賴的資源也是不同的.
我這邊常用的方法是將生產環境和其他環境的設定通通寫入那個設定檔(或者是多個檔案config/dev.json,config/pro.json...),然後有一個設定處理器會負責讀取本地環境是什麼環境(這些都是包含在git範圍內的,有可能就是初始化模組),進而讀到設定檔中對應環境的設定.如果是只有一個設定檔,類似如下:
{
'pro':{
'ver':'0.1.0',
'configA':'value'
},
'dev':{
'ver':'0.1.12',
'configA':'value'
},
'test'{
'ver','0.1.32',
'configA':'value'
}
...
}
配置處理器如何知道當前環境是什麼?這裡需要有一個环境标识
,比较直接粗放的可以是IP地址,比如生产环境是部署在某个固定IP(适合单服单应用情况)上,配置文件的生产环境配置就写在这个IP下面,那配置处理器取到当前运行环境的IP后,去读取配置文件指定IP模块的配置.
还有一种方式是在使用一个标识文件
,比如应用运行的所有的环境下都有一个/data/tag文本文件(也可以在项目目录下,但是用.gitignore包含),这个文件不在git范围内就行,其中就只有一行,写了pro
或dev
,这样配置处理器通过读这个文件就知道取配置文件中的哪部分配置了.
最常用的方式还有环境变量,比如export APP_ENV=production
,然後先讀這個變數再讀所在環境的對應配置.
後期隨著應用大多是分散式部署,也就是可能同一個應用要部署到20幾台或更多的伺服器,這時必須有一個config server來專門處理,分發,更新各個伺服器的應用程式配置.
在這台config server上可以獨立配置哪些伺服器用什麼樣的配置(通常以請求方的ip來配),各個應用在啟動時會去config server請求自己的配置.
這樣一來應用可以做到完全無狀態,根本不再需要設定檔, 而配置可以隨意控制細粒度(比如某台伺服器我想把請求流量調大點),以及實現灰度發布(部分伺服器部署新程式碼), 我想這可能是目前大多數網路企業採用的方式.