### 嚴格分離構建和運行
[基準代碼](http://12factor.net/zh_cn/codebase)?轉化為一份部署(非開發環境)需要以下三個階段:
* *構建階段*?是指將代碼倉庫轉化為可執行包的過程。構建時會使用指定版本的代碼,獲取和打包?[依賴項](http://12factor.net/zh_cn/dependencies),編譯成二進制文件和資源文件。
* *發布階段*?會將構建的結果和當前部署所需?[配置](http://12factor.net/zh_cn/config)?相結合,并能夠立刻在運行環境中投入使用。
* *運行階段*?(或者說“運行時”)是指針對選定的發布版本,在執行環境中啟動一系列應用程序?[進程](http://12factor.net/zh_cn/processes)。

**12-facfor 應用嚴格區分構建,發布,運行這三個步驟。**?舉例來說,直接修改處于運行狀態的代碼是非常不可取的做法,因為這些修改很難再同步回構建步驟。
部署工具通常都提供了發布管理工具,最引人注目的功能是退回至較舊的發布版本。比如,?[Capistrano](https://github.com/capistrano/capistrano/wiki)?將所有發布版本都存儲在一個叫?`releases`?的子目錄中,當前的在線版本只需映射至對應的目錄即可。該工具的?`rollback`?命令可以很容易地實現回退版本的功能。
每一個發布版本必須對應一個唯一的發布 ID,例如可以使用發布時的時間戳(`2011-04-06-20:32:17`),亦或是一個增長的數字(`v100`)。發布的版本就像一本只能追加的賬本,一旦發布就不可修改,任何的變動都應該產生一個新的發布版本。
新的代碼在部署之前,需要開發人員觸發構建操作。但是,運行階段不一定需要人為觸發,而是可以自動進行。如服務器重啟,或是進程管理器重啟了一個崩潰的進程。因此,運行階段應該保持盡可能少的模塊,這樣假設半夜發生系統故障而開發人員又捉襟見肘也不會引起太大問題。構建階段是可以相對復雜一些的,因為錯誤信息能夠立刻展示在開發人員面前,從而得到妥善處理。