持續(xù)繼承的概念主要引用自http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html 阮一峰的網絡日志講的很好
一嗡靡、概念
持續(xù)集成指的是,頻繁地(一天多次)將代碼集成到主干窟感。
它的好處主要有兩個讨彼。
(1)快速發(fā)現(xiàn)錯誤。每完成一點更新柿祈,就集成到主干哈误,可以快速發(fā)現(xiàn)錯誤,定位錯誤也比較容易躏嚎。
(2)防止分支大幅偏離主干蜜自。如果不是經常集成,主干又在不斷更新卢佣,會導致以后集成的難度變大重荠,甚至難以集成。
持續(xù)集成的目的虚茶,就是讓產品可以快速迭代戈鲁,同時還能保持高質量。它的核心措施是嘹叫,代碼集成到主干之前婆殿,必須通過自動化測試。只要有一個測試用例失敗罩扇,就不能集成婆芦。
Martin Fowler說過,"持續(xù)集成并不能消除Bug暮蹂,而是讓它們非常容易發(fā)現(xiàn)和改正。"
與持續(xù)集成相關的癌压,還有兩個概念仰泻,分別是持續(xù)交付和持續(xù)部署。
二滩届、持續(xù)交付
持續(xù)交付(Continuous delivery)指的是集侯,頻繁地將軟件的新版本,交付給質量團隊或者用戶帜消,以供評審棠枉。如果評審通過,代碼就進入生產階段泡挺。
持續(xù)交付可以看作持續(xù)集成的下一步辈讶。它強調的是,不管怎么更新娄猫,軟件是隨時隨地可以交付的贱除。
三生闲、持續(xù)部署
持續(xù)部署(continuous deployment)是持續(xù)交付的下一步,指的是代碼通過評審以后月幌,自動部署到生產環(huán)境碍讯。
持續(xù)部署的目標是,代碼在任何時刻都是可部署的扯躺,可以進入生產階段捉兴。
持續(xù)部署的前提是能自動化完成測試、構建录语、部署等步驟倍啥。它與持續(xù)交付的區(qū)別,可以參考下圖钦无。
四逗栽、流程
根據持續(xù)集成的設計,代碼從提交到生產失暂,整個過程有以下幾步彼宠。
4.1 提交
流程的第一步,是開發(fā)者向代碼倉庫提交代碼弟塞。所有后面的步驟都始于本地代碼的一次提交(commit)凭峡。
4.2 測試(第一輪)
代碼倉庫對commit操作配置了鉤子(hook),只要提交代碼或者合并進主干决记,就會跑自動化測試摧冀。
測試有好幾種。
- 單元測試:針對函數(shù)或模塊的測試
- 集成測試:針對整體產品的某個功能的測試系宫,又稱功能測試
- 端對端測試:從用戶界面直達數(shù)據庫的全鏈路測試
第一輪至少要跑單元測試索昂。
4.3 構建
通過第一輪測試,代碼就可以合并進主干扩借,就算可以交付了椒惨。
交付后,就先進行構建(build)潮罪,再進入第二輪測試康谆。所謂構建,指的是將源碼轉換為可以運行的實際代碼嫉到,比如安裝依賴沃暗,配置各種資源(樣式表、JS腳本何恶、圖片)等等孽锥。
常用的構建工具如下。
Jenkins和Strider是開源軟件细层,Travis和Codeship對于開源項目可以免費使用忱叭。它們都會將構建和測試隔崎,在一次運行中執(zhí)行完成。
4.4 測試(第二輪)
構建完成韵丑,就要進行第二輪測試爵卒。如果第一輪已經涵蓋了所有測試內容,第二輪可以省略撵彻,當然钓株,這時構建步驟也要移到第一輪測試前面。
第二輪是全面測試陌僵,單元測試和集成測試都會跑轴合,有條件的話,也要做端對端測試碗短。所有測試以自動化為主受葛,少數(shù)無法自動化的測試用例,就要人工跑偎谁。
需要強調的是总滩,新版本的每一個更新點都必須測試到。如果測試的覆蓋率不高巡雨,進入后面的部署階段后闰渔,很可能會出現(xiàn)嚴重的問題。
4.5 部署
通過了第二輪測試铐望,當前代碼就是一個可以直接部署的版本(artifact)冈涧。將這個版本的所有文件打包( tar filename.tar *
)存檔,發(fā)到生產服務器正蛙。
生產服務器將打包文件督弓,解包成本地的一個目錄,再將運行路徑的符號鏈接(symlink)指向這個目錄乒验,然后重新啟動應用愚隧。這方面的部署工具有Ansible,Chef徊件,Puppet等奸攻。
4.6 回滾
一旦當前版本發(fā)生問題蒜危,就要回滾到上一個版本的構建結果虱痕。最簡單的做法就是修改一下符號鏈接,指向上一個版本的目錄辐赞。