互聯(lián)網(wǎng)軟件的開發(fā)和發(fā)布莫湘,已經(jīng)形成了一套標準流程哄尔,最重要的組成部分就是持續(xù)集成(Continuous integration振愿,簡稱CI)毅糟。
一红选、概念
持續(xù)集成(Continuous Integration)指的是,頻繁地(一天多次)將代碼集成到主干姆另。
持續(xù)集成的目的喇肋,就是讓產(chǎn)品可以快速迭代,同時還能保持高質(zhì)量迹辐。
它的核心措施是蝶防,代碼集成到主干之前,必須通過自動化測試明吩。只要有一個測試用例失敗间学,就不能集成。
它的好處主要有:
1. 提高開發(fā)效率
持續(xù)集成可以把工程師從繁瑣的任務(wù)中解放出來印荔,提高工作效率菱鸥。并且能有效減少發(fā)布版本中的錯誤和 Bug 數(shù)量。防止分支大幅偏離主干躏鱼。如果不是經(jīng)常集成氮采,主干又在不斷更新,會導(dǎo)致以后集成的難度變大染苛,甚至難以集成
2. 快速發(fā)現(xiàn)并定位 Bugs
通過各種例行測試鹊漠,您的團隊可以在問題變嚴重前就發(fā)現(xiàn)并定位到程序的 Bugs。減少由程序錯誤帶來的損失茶行。每完成一點更新躯概,就集成到主干,可以快速發(fā)現(xiàn)錯誤畔师,定位錯誤也比較容易娶靡。
3.更快速的發(fā)布更新
持續(xù)集成可以幫助您的團隊更快速、更積極的發(fā)布程序更新程序看锉。在發(fā)布時可自動完成大量重復(fù)工作完成姿锭,節(jié)省人力。
持續(xù)集成的目的伯铣,就是讓產(chǎn)品可以快速迭代呻此,同時還能保持高質(zhì)量。它的核心措施是腔寡,代碼集成到主干之前焚鲜,必須通過自動化測試。只要有一個測試用例失敗,就不能集成忿磅。
Martin Fowler說過糯彬,"持續(xù)集成并不能消除Bug,而是讓它們非常容易發(fā)現(xiàn)和改正葱她。"
與持續(xù)集成相關(guān)的情连,還有兩個概念,分別是持續(xù)交付和持續(xù)部署览效。
二却舀、持續(xù)交付
持續(xù)交付(Continuous delivery)指的是,頻繁地將軟件的新版本锤灿,交付給質(zhì)量團隊或者用戶挽拔,以供評審。如果評審?fù)ㄟ^但校,代碼就進入生產(chǎn)階段螃诅。
持續(xù)交付可以看作持續(xù)集成的下一步。它強調(diào)的是状囱,不管怎么更新术裸,軟件是隨時隨地可以交付的。
持續(xù)交付在持續(xù)集成的基礎(chǔ)上亭枷,將集成后的代碼部署到更貼近真實運行環(huán)境的「類生產(chǎn)環(huán)境」(production-like environments)中袭艺。比如,我們完成單元測試后叨粘,可以把代碼部署到連接數(shù)據(jù)庫的 Staging 環(huán)境中更多的測試猾编。如果代碼沒有問題,可以繼續(xù)手動部署到生產(chǎn)環(huán)境中升敲。
三答倡、持續(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)容虚茶,第二輪可以省略戈鲁,當(dāng)然,這時構(gòu)建步驟也要移到第一輪測試前面嘹叫。
第二輪是全面測試婆殿,單元測試和集成測試都會跑,有條件的話罩扇,也要做端對端測試婆芦。所有測試以自動化為主怕磨,少數(shù)無法自動化的測試用例,就要人工跑消约。
需要強調(diào)的是肠鲫,新版本的每一個更新點都必須測試到。如果測試的覆蓋率不高或粮,進入后面的部署階段后导饲,很可能會出現(xiàn)嚴重的問題。
4.5 部署
通過了第二輪測試氯材,當(dāng)前代碼就是一個可以直接部署的版本(artifact)渣锦。將這個版本的所有文件打包( tar filename.tar *
)存檔,發(fā)到生產(chǎn)服務(wù)器氢哮。
生產(chǎn)服務(wù)器將打包文件袋毙,解包成本地的一個目錄,再將運行路徑的符號鏈接(symlink)指向這個目錄命浴,然后重新啟動應(yīng)用娄猫。這方面的部署工具有Ansible,Chef生闲,Puppet等媳溺。
4.6 回滾
一旦當(dāng)前版本發(fā)生問題,就要回滾到上一個版本的構(gòu)建結(jié)果碍讯。最簡單的做法就是修改一下符號鏈接悬蔽,指向上一個版本的目錄。