互聯(lián)網(wǎng)軟件的開發(fā)和發(fā)布,,已經(jīng)形成了一套標準流程,最重要的組成部分就是持續(xù)集成(Continuous integration,,簡稱CI),。
本文簡要介紹持續(xù)集成的概念和做法。
一,、概念
持續(xù)集成指的是,,頻繁地(一天多次)將代碼集成到主干。
它的好處主要有兩個,。
(1)快速發(fā)現(xiàn)錯誤,。每完成一點更新,就集成到主干,,可以快速發(fā)現(xiàn)錯誤,,定位錯誤也比較容易。
(2)防止分支大幅偏離主干。如果不是經(jīng)常集成,,主干又在不斷更新,,會導致以后集成的難度變大,甚至難以集成,。
持續(xù)集成的目的,,就是讓產(chǎn)品可以快速迭代,同時還能保持高質(zhì)量,。它的核心措施是,,代碼集成到主干之前,必須通過自動化測試,。只要有一個測試用例失敗,,就不能集成。
Martin Fowler說過,,"持續(xù)集成并不能消除Bug,,而是讓它們非常容易發(fā)現(xiàn)和改正。"
與持續(xù)集成相關(guān)的,,還有兩個概念,,分別是持續(xù)交付和持續(xù)部署。
二,、持續(xù)交付
持續(xù)交付(Continuous delivery)指的是,,頻繁地將軟件的新版本,交付給質(zhì)量團隊或者用戶,,以供評審,。如果評審通過,代碼就進入生產(chǎn)階段,。
持續(xù)交付可以看作持續(xù)集成的下一步,。它強調(diào)的是,不管怎么更新,,軟件是隨時隨地可以交付的,。
三、持續(xù)部署
持續(xù)部署(continuous deployment)是持續(xù)交付的下一步,,指的是代碼通過評審以后,,自動部署到生產(chǎn)環(huán)境。
持續(xù)部署的目標是,,代碼在任何時刻都是可部署的,,可以進入生產(chǎn)階段。
持續(xù)部署的前提是能自動化完成測試,、構(gòu)建,、部署等步驟。它與持續(xù)交付的區(qū)別,可以參考下圖,。
(圖片來源)
四,、流程
根據(jù)持續(xù)集成的設(shè)計,代碼從提交到生產(chǎn),,整個過程有以下幾步,。
4.1 提交
流程的第一步,是開發(fā)者向代碼倉庫提交代碼,。所有后面的步驟都始于本地代碼的一次提交(commit),。
4.2 測試(第一輪)
代碼倉庫對commit操作配置了鉤子(hook),只要提交代碼或者合并進主干,,就會跑自動化測試,。
測試有好幾種,。
- 單元測試:針對函數(shù)或模塊的測試
- 集成測試:針對整體產(chǎn)品的某個功能的測試,,又稱功能測試
- 端對端測試:從用戶界面直達數(shù)據(jù)庫的全鏈路測試
第一輪至少要跑單元測試。
4.3 構(gòu)建
通過第一輪測試,,代碼就可以合并進主干,,就算可以交付了。
交付后,,就先進行構(gòu)建(build),,再進入第二輪測試。所謂構(gòu)建,,指的是將源碼轉(zhuǎn)換為可以運行的實際代碼,,比如安裝依賴,配置各種資源(樣式表,、JS腳本,、圖片)等等。
常用的構(gòu)建工具如下,。
Jenkins和Strider是開源軟件,,Travis和Codeship對于開源項目可以免費使用。它們都會將構(gòu)建和測試,,在一次運行中執(zhí)行完成,。
4.4 測試(第二輪)
構(gòu)建完成,就要進行第二輪測試,。如果第一輪已經(jīng)涵蓋了所有測試內(nèi)容,,第二輪可以省略,當然,,這時構(gòu)建步驟也要移到第一輪測試前面,。
第二輪是全面測試,單元測試和集成測試都會跑,有條件的話,,也要做端對端測試,。所有測試以自動化為主,少數(shù)無法自動化的測試用例,,就要人工跑,。
需要強調(diào)的是,新版本的每一個更新點都必須測試到,。如果測試的覆蓋率不高,,進入后面的部署階段后,很可能會出現(xiàn)嚴重的問題,。
4.5 部署
通過了第二輪測試,,當前代碼就是一個可以直接部署的版本(artifact)。將這個版本的所有文件打包( tar filename.tar * )存檔,,發(fā)到生產(chǎn)服務(wù)器,。
生產(chǎn)服務(wù)器將打包文件,解包成本地的一個目錄,,再將運行路徑的符號鏈接(symlink)指向這個目錄,,然后重新啟動應用。這方面的部署工具有Ansible,,Chef,,Puppet等。
4.6 回滾
一旦當前版本發(fā)生問題,,就要回滾到上一個版本的構(gòu)建結(jié)果,。最簡單的做法就是修改一下符號鏈接,指向上一個版本的目錄,。
五,、參考鏈接
- Gergely Nemeth, Continuous Deployment of Node.js Applications
- Codeship, Continuous Integration Essentials
(完)