嚴格分離構建和運行
基準代碼 轉(zhuǎn)化為一份部署(非開發(fā)環(huán)境)需要以下三個階段:
- 構建階段是指將代碼倉庫轉(zhuǎn)化為可執(zhí)行包的過程软驰。構建時會使用指定版本的代碼,獲取和打包依賴項心肪,編譯成二進制文件和資源文件锭亏。
- 發(fā)布階段會將構建的結果和當前部署所需配置相結合,并能夠立刻在運行環(huán)境中投入使用硬鞍。
- 運行階段(或者說“運行時”)是指針對選定的發(fā)布版本慧瘤,在執(zhí)行環(huán)境中啟動一系列應用程序進程。
12-factor 應用嚴格區(qū)分構建固该,發(fā)布锅减,運行這三個步驟
舉例來說,直接修改處于運行狀態(tài)的代碼是非常不可取的做法伐坏,因為這些修改很難再同步回構建步驟怔匣。
release.png
部署工具通常都提供了發(fā)布管理工具,最引人注目的功能是退回至較舊的發(fā)布版本桦沉。
比如劫狠, Capistrano 將所有發(fā)布版本都存儲在一個叫
releases
的子目錄中,當前的在線版本只需映射至對應的目錄即可永部。該工具的rollback
命令可以很容易地實現(xiàn)回退版本的功能独泞。
每一個發(fā)布版本必須對應一個唯一的發(fā)布 ID,例如可以使用發(fā)布時的時間戳(2011-04-06-20:32:17)苔埋,亦或是一個增長的數(shù)字(v100)懦砂。發(fā)布的版本就像一本只能追加的賬本,一旦發(fā)布就不可修改组橄,任何的變動都應該產(chǎn)生一個新的發(fā)布版本荞膘。
新的代碼在部署之前,需要開發(fā)人員觸發(fā)構建操作玉工。但是羽资,運行階段不一定需要人為觸發(fā),而是可以自動進行遵班。如服務器重啟屠升,或是進程管理器重啟了一個崩潰的進程。因此狭郑,運行階段應該保持盡可能少的模塊腹暖,這樣假設半夜發(fā)生系統(tǒng)故障而開發(fā)人員又捉襟見肘也不會引起太大問題。構建階段是可以相對復雜一些的翰萨,因為錯誤信息能夠立刻展示在開發(fā)人員面前脏答,從而得到妥善處理。
參考: