關於Web應用開發流程的總結
以下內容為個人工作總結,如果不當,謝謝指出錯誤。
假設最簡單的情況,一個開發人員,開發所有的程式碼,一個測試人員。一個測試的伺服器,一個生產的伺服器。
開發人員需要為公司開發一個專案,開發人員首先分析產品經理的需求,建立相應的模型,然後進行如下步驟:
- 編寫程式碼
- 專案打包部署到測試伺服器
- 測試人員測試,將Bug提交給開發人員
- 如果測試通過則進行第5步。如果仍然有Bug,開發人員解決Bug,並重復第2步,第3步。
- 專案測試通過後,打包部署到生產環境
這樣就完成了一次迭代。
但是隨後,任務變多,開發人員增多,共同維護一套程式碼,採用Git進行版本管理,不同的開發人員將程式碼提交到同一個倉庫。先建三個分支,預設分支master,和即將釋出的分支release,和初始化分支initialize。master是主分支,是最新的程式碼。release分支就是即將要釋出到生產環境的程式碼。開發人員在一個迭代週期的初期,拉取最新的master程式碼,並在此基礎上進行開發。假如專案釋出後出現了一個緊急的Bug,需要立刻修復,而這時新的迭代已經開始,此時專案負責人需要將release上的程式碼合併到initialize分支上,那麼負責修改那個緊急Bug的開發人員就需要從initialize分支上拉取最新的程式碼,並在此基礎上進行開發,Bug解決後,將initialize分支上的程式碼打包部署到測試伺服器上,測試無誤後,將initalize分支上的程式碼合併到release分支上,然後將release分支上的程式碼釋出到生產環境。
隨後,龐大而臃腫的單體專案已經不能滿足需求了,後面一次大的版本迭代開始對專案開始採用的分散式。一個整體的系統,進行分解,分解成最小程度依賴關係的單元,各個單元之間通過輕量級的資料交換和呼叫,這樣做可以降低系統耦合度,且方便擴充套件,也可以合理分配資源。然而被拆解後,系統的容錯率就會降低,假如單元A被單元B C所依賴,一旦A發生故障,可能會影響B C,不過現在也有很多框架可以解決這樣的問題,提高容錯率。
然後是打包方面的問題,目前都是將專案打成可以執行的檔案包,或者是可以在容器中執行的檔案包。然後部署在伺服器並執行專案。這樣手動操作未免較為繁瑣,可以採用Jenkins持續整合工具。Jenkins本身也是一個服務,打個比方來說,開發到釋出的各個環節就像一個個獨立的機器,開發人員需要將每次生產出來的產品放到下一個機器中繼續加工,這樣很繁瑣。而Jenkins就像連線各個裝置的傳送帶,只需要在Jenkins一鍵操作,就可以完成一些工作。Jenkins配置流程大致如下:
- 首先將Jenkins服務執行在一臺伺服器上,假設這臺伺服器叫做Assembly
- 在Jenkins上配置好專案所在倉庫的地址,這樣Jenkins就可以呼叫版本管理工具拉取程式碼到Assembly
- 有在Jenkins上配置好打包工具,這樣Jenkins就可以呼叫打包工具將原始碼打包成可以執行的包(或是在容器內執行的包),假設這個包叫做Component
- 假設有一臺生產用的伺服器叫做Produce,在Assembly和Produce之間建立通訊,Jenkins呼叫傳輸工具將Assembly上的Component傳輸到Produce
- 現在Component已經在Produce上了,Jenkins呼叫通訊工具將一些命令告知Produce去啟動Component的,這樣Component就在Produce上執行起來了
之後,Jenkins的工作流程就是:拉取程式碼 打包專案 部署專案 執行專案。這樣開發人員只需要將程式碼提交到倉庫,測試環境和生產環境就能保持同步更新了。需要說明的上述只是一個抽象的總結,實際情況,很有可能Assembly和Produce是同一臺伺服器。