DevOps是當(dāng)前炒的很火熱的概念,實(shí)踐DevOps的方法涉及兩個(gè)方面,一是如何持續(xù)管理需求、變更和及時(shí)處理用戶(hù)反饋,通過(guò)工具固化一定的流程,有效的管理需求和變更。另一方面就是如何持續(xù)交付。
作為DevOps流程的核心實(shí)踐持續(xù)交付(Continuous Delivery)在這其中能夠?yàn)檐浖?xiàng)目帶來(lái)什么價(jià)值呢?本文將結(jié)合持續(xù)交付的具體實(shí)踐展開(kāi)分析與討論。
入手持續(xù)交付
持續(xù)交付最基本的原則是:
提前并頻繁地內(nèi)部交付,將幾乎所有事情自動(dòng)化
持續(xù)交付最核心的實(shí)踐是自動(dòng)化,通過(guò)將每一次改動(dòng)都提交到一個(gè)模擬產(chǎn)品環(huán)境中,使用嚴(yán)格 的自動(dòng)化測(cè)試,確保業(yè)務(wù)應(yīng)用和服務(wù)能符合預(yù)期,使用完全的自動(dòng)化過(guò)程來(lái)把每個(gè)變更自動(dòng)的提交到測(cè)試環(huán)境。
實(shí)現(xiàn)自動(dòng)化的持續(xù)交付基于部署流水線模式。

部署流水線的目的是讓軟件交付過(guò)程中的每個(gè)人都能看到每個(gè)構(gòu)建版本從提交到發(fā)布的整個(gè)過(guò)程,將開(kāi)發(fā)機(jī)構(gòu)的文化、流程和工具整合到一起,這也符合了DevOps的核心理念將開(kāi)發(fā)機(jī)構(gòu)的文化、流程和工具整合到一起。
下面討論部署流水線的細(xì)節(jié)。
腳本化構(gòu)建與部署
腳本化構(gòu)建與部署應(yīng)以迭代的方式來(lái)識(shí)別最困難的步驟,并將其自動(dòng)化,沿著部署流水線,逐步完善自動(dòng)化構(gòu)建和部署能力。腳本化構(gòu)建與部署應(yīng)該遵循如下原則:
- 為部署流水線的每個(gè)階段創(chuàng)建腳本,表達(dá)構(gòu)建流程。
- 使用同樣的腳本向所有環(huán)境部署,保證在所有環(huán)境上都能運(yùn)行。
- 確保部署過(guò)程是冪等的。
- 增量式部署。
提交
提交階段發(fā)生在像版本控制庫(kù)提交代碼,是流水線的入口。提交階段應(yīng)遵循如下原則:
- Dev保證本地構(gòu)建成功后提交
- 測(cè)試不通過(guò)令提交失敗,并記錄錯(cuò)誤信息,反饋Dev盡快修復(fù),Dev對(duì)自己的問(wèn)題負(fù)責(zé)
- 提交失敗后可以回滾版本
- 降低構(gòu)造測(cè)試環(huán)境的復(fù)雜性,保證測(cè)試代碼整潔有效性。
自動(dòng)化驗(yàn)收測(cè)試
單元測(cè)試不能保證捕獲所有問(wèn)題,因此需要驗(yàn)收測(cè)試來(lái)保證軟件質(zhì)量。頻繁的手工測(cè)試帶來(lái)高昂成本,采用自動(dòng)化驗(yàn)收測(cè)試便于頻繁發(fā)布軟件。
自動(dòng)化驗(yàn)收測(cè)試使得團(tuán)隊(duì)成員都關(guān)注于真正的工作:業(yè)務(wù)價(jià)值,為軟件能否滿(mǎn)足標(biāo)準(zhǔn)提供了更高得信心,快速向開(kāi)發(fā)團(tuán)隊(duì)反饋問(wèn)題,便于軟件大規(guī)模重構(gòu)。
非功能性需求測(cè)試
非功能需求測(cè)試包括容量、吞吐量以及性能測(cè)試。
將非功能性需求加入到部署流水線上,便于軟件設(shè)計(jì)執(zhí)行實(shí)驗(yàn)場(chǎng)景來(lái)幫助診斷預(yù)測(cè)問(wèn)題。
對(duì)于非功能需求,過(guò)早地關(guān)注容量?jī)?yōu)化是低效且昂貴的,有可能造成過(guò)度設(shè)計(jì),除非性能有問(wèn)題,不在代碼可讀性上讓步。
發(fā)布
頻繁地將軟件發(fā)布到不同的測(cè)試環(huán)境中,能夠降低發(fā)布的風(fēng)險(xiǎn),降低上線壓力。
發(fā)布過(guò)程將組織各部門(mén)聯(lián)系起來(lái):運(yùn)維團(tuán)隊(duì),開(kāi)發(fā)團(tuán)隊(duì),測(cè)試團(tuán)隊(duì),技術(shù)支持團(tuán)隊(duì),交付團(tuán)隊(duì),促進(jìn)交流合作。
持續(xù)交付對(duì)于運(yùn)維的改變
DevOps將敏捷方法引入到系統(tǒng)管理與運(yùn)營(yíng),有兩點(diǎn)主要原則:
- 強(qiáng)調(diào)合作
- 利用敏捷技術(shù)對(duì)基礎(chǔ)設(shè)施進(jìn)行有效管理
運(yùn)維負(fù)責(zé)將代碼部署到生成環(huán)境中,持續(xù)交付從一開(kāi)始就讓運(yùn)維參與進(jìn)來(lái),兩者共同的利益是
讓發(fā)布有價(jià)值、穩(wěn)定得軟件成為一件低風(fēng)險(xiǎn)的事
持續(xù)交付的核心實(shí)踐 盡可能頻繁的發(fā)布 保證了這一點(diǎn),從而成為了DevOps的關(guān)鍵步驟。
自動(dòng)化環(huán)境管理
對(duì)于運(yùn)維人員的工作,關(guān)鍵的痛點(diǎn)在于部署系統(tǒng)到不同配置的大量基礎(chǔ)設(shè)施上,對(duì)基礎(chǔ)設(shè)置的管理往往利用腳本管理,修改基礎(chǔ)設(shè)施的技術(shù)也應(yīng)該是發(fā)布的一部分。
將基礎(chǔ)設(shè)施的配置自動(dòng)化,納入流水線并配置測(cè)試會(huì)大大便于運(yùn)維的部署管理工作。
另一種方案,使用docker進(jìn)行持續(xù)集成
在業(yè)務(wù)不斷增長(zhǎng)過(guò)程中,企業(yè)的組件也隨之不斷擴(kuò)張,隨之帶來(lái)了對(duì)基礎(chǔ)設(shè)施的復(fù)雜配置管理工作。采用自動(dòng)化部署配置管理無(wú)疑產(chǎn)生巨大成本,使用Docker——以“容器化”的方式去部署應(yīng)用。 Docker像集裝箱一樣,打包了所有依賴(lài),再在其他服務(wù)器上部署很容易,不至于換服務(wù)器后發(fā)現(xiàn)各種配置文件散落一地,這樣就解決了編譯時(shí)依賴(lài)和運(yùn)行時(shí)依賴(lài)的問(wèn)題。
利用Docker進(jìn)行持續(xù)集成的流程如下:
- 開(kāi)發(fā)者提交代碼;
- 觸發(fā)鏡像構(gòu)建;
- 構(gòu)建鏡像上傳至私有倉(cāng)庫(kù);
- 鏡像下載至執(zhí)行機(jī)器;
- 鏡像運(yùn)行。
價(jià)值
貫穿持續(xù)交付始終的是自動(dòng)化手段,這也恰恰是軟件行業(yè)所追求的,自動(dòng)化的交付過(guò)程帶來(lái)了諸多益處:
- 快速發(fā)現(xiàn)錯(cuò)誤。每完成一點(diǎn)更新,就集成到主干,可以快速發(fā)現(xiàn)錯(cuò)誤,定位錯(cuò)誤也比較容易。
- 快速發(fā)布。能夠應(yīng)對(duì)業(yè)務(wù)需求,并更快地實(shí)現(xiàn)軟件價(jià)值。
- 編碼->測(cè)試->上線->交付的頻繁迭代周期縮短,同時(shí)獲得迅速反饋;
- 高質(zhì)量的軟件發(fā)布標(biāo)準(zhǔn)。整個(gè)交付過(guò)程標(biāo)準(zhǔn)化、可重復(fù)、可靠,
- 整個(gè)交付過(guò)程進(jìn)度可視化,方便團(tuán)隊(duì)人員了解項(xiàng)目成熟度;
- 更先進(jìn)的團(tuán)隊(duì)協(xié)作方式。從需求分析、產(chǎn)品的用戶(hù)體驗(yàn)到交互 設(shè)計(jì)、開(kāi)發(fā)、測(cè)試、運(yùn)維等角色密切協(xié)作,相比于傳統(tǒng)的瀑布式軟件團(tuán)隊(duì),更少浪費(fèi)。
- 更平滑的開(kāi)發(fā)過(guò)程,減少上線風(fēng)險(xiǎn),增強(qiáng)團(tuán)隊(duì)信心。