《持續(xù)交付發(fā)布可靠軟件的系統(tǒng)方法》讀書筆記
引言
發(fā)布到生產(chǎn)環(huán)境和部署到測試環(huán)境的差異應(yīng)該被封裝在一組配置文件中,遵循一樣的部署過程。啟動自動部署系統(tǒng),將要部署的軟件版本與環(huán)境名稱告訴它,點(diǎn)擊開始,后綴部署與發(fā)布使用相同的流程铣墨。
我們需要有一個列表,其中包含能夠部署到每個環(huán)境的所有構(gòu)建办绝,并且只要通過點(diǎn)擊就可以選擇一個軟件版本向某個環(huán)境進(jìn)行自動部署伊约。同時這種方式是對環(huán)境修改的唯一途徑(包括對操作系統(tǒng)和第三方軟件配置的修改)。
創(chuàng)建發(fā)布策略(文檔)
- 每個環(huán)境的部署由發(fā)布由誰負(fù)責(zé)
- 創(chuàng)建一個資產(chǎn)和配置管理策略
- 部署時所用的技術(shù)的描述孕蝉。運(yùn)維團(tuán)隊與開發(fā)團(tuán)隊?wèi)?yīng)對其達(dá)成共識
- 實現(xiàn)部署流水線的計劃
- 枚舉所有的環(huán)境屡律,包括用于驗收測試、容量測試降淮、集成測試超埋、用戶驗收測試的環(huán)境,以及每個構(gòu)建在這些環(huán)境中的移動過程
- 描述在測試和生產(chǎn)環(huán)境中部署時應(yīng)該遵循的流程佳鳖,比如一個變更申請霍殴,及申請授權(quán)等
- 對應(yīng)用程序的監(jiān)控需求,包括用于通知運(yùn)維團(tuán)隊關(guān)于應(yīng)用程序相關(guān)狀態(tài)的API和服務(wù)
- 討論部署時和運(yùn)行時的配置方法如何管理系吩,以及它們與自動化部署流程是如何關(guān)聯(lián)在一起的
- 描述應(yīng)用程序如何與所有外部系統(tǒng)集成
- 如何記錄日志詳情有鹿,以便運(yùn)維人員能夠確定應(yīng)用程序的狀態(tài)军拟,識別出錯原因
- 制定災(zāi)難恢復(fù)計劃,以便在災(zāi)難發(fā)生后,恢復(fù)應(yīng)用程序的狀態(tài)
- 對軟件的服務(wù)級別達(dá)成一致
- 生產(chǎn)環(huán)境的數(shù)量大小 及容量計劃:應(yīng)用程序會創(chuàng)建多少數(shù)據(jù)模庐,需要多少個日志文件或數(shù)據(jù)庫,需要多少帶寬或磁盤空間,用戶對響應(yīng)延遲的容忍度是什么?
- 制定一個歸檔策略菜皂,以便不必為了審計或技術(shù)支持而保留生產(chǎn)數(shù)據(jù)
- 如何對生產(chǎn)環(huán)境進(jìn)行首次部署
- 如何修復(fù)生產(chǎn)環(huán)境中出現(xiàn)的缺陷,并為其打補(bǔ)丁
- 如何升級生產(chǎn)環(huán)境中的應(yīng)用程序以及遷移數(shù)據(jù)
- 如何做應(yīng)用程序生產(chǎn)服務(wù)與技術(shù)支持
隨著項目的進(jìn)行厉萝,這個策略文檔也會改變
應(yīng)用程序的部署與晉級
每次部署時都使用同樣的方法恍飘,使用相同的流程向每個環(huán)境部署,包括生產(chǎn)環(huán)境冀泻。在首次向測試環(huán)境部署時就應(yīng)該使用自動化部署常侣。
首次部署
在第一個迭代里蜡饵,選擇一至兩個具有高優(yōu)先級但非常簡單的用戶故事或需求弹渔,讓部署流水線的前幾個階段可以運(yùn)行,且能夠部署并展示一些成果溯祸。把它看作實現(xiàn)部署流水線的“抽水泵”
這個啟動迭代結(jié)束后肢专,應(yīng)該已經(jīng)完成了以下內(nèi)容:
- 部署流水線線的提交階段
- 一個用于部署的類生產(chǎn)環(huán)境
- 通過一個自動化過程獲取在提交階段中生成的二進(jìn)制包,并將其部署到這個類生產(chǎn)環(huán)境(UAT)中
- 一個簡單的冒煙測試焦辅,用于驗證本次部署的正確性
對發(fā)布過程進(jìn)行建模并讓構(gòu)建晉級
在構(gòu)建中重點(diǎn)注意以下內(nèi)容
- 為了達(dá)到發(fā)布質(zhì)量博杖,一個構(gòu)建版本要通過哪些測試階段
- 每個階段需要設(shè)置怎樣的晉級門檻或者需要怎樣的簽字許可
- 對每個晉級門檻來說,誰有權(quán)批準(zhǔn)讓該構(gòu)建通過該階段
配置的晉級
除了二進(jìn)制需要晉級筷登,環(huán)境與應(yīng)用程序的配置信息也需要晉級剃根。但是并不是所有的配置都需要晉級,這就需要對配置信息進(jìn)行晉級管理前方。
- 用冒煙測試來驗證配置信息的正確性狈醉。
- 對于中間件的配置,利用像Nagios這樣工具來監(jiān)控這些設(shè)置惠险。
- 寫一些對基礎(chǔ)設(shè)置的測試苗傅,用于檢查關(guān)鍵設(shè)置,并將其返回給監(jiān)控軟件班巩。
聯(lián)合環(huán)境
SIT環(huán)境中更多的工作是部署每個應(yīng)用程序的新版本渣慕,直到所有應(yīng)用程序可以互相聯(lián)通。
部署到試運(yùn)行環(huán)境
項目開始時就需要計劃以下事情:
- 確保生產(chǎn)環(huán)境抱慌、容量測試環(huán)境和試運(yùn)行環(huán)境已準(zhǔn)備好
- 準(zhǔn)備好一個自動化過程逊桦,對環(huán)境進(jìn)行配置,包括網(wǎng)絡(luò)配置抑进、外部服務(wù)和基礎(chǔ)設(shè)置
- 確保部署流程是經(jīng)過充分冒煙測試的
- 度量應(yīng)用程序的“預(yù)熱”時長强经。如果應(yīng)用程序使用了緩存,這一點(diǎn)就尤其重要单匣,將它也納入到部署計劃中
- 與外部系統(tǒng)進(jìn)行測試集成
- 如果可能夕凝,發(fā)布之前就把應(yīng)用程序放在生產(chǎn)環(huán)境上部署宝穗。藍(lán)綠部署
- 如果可能,把應(yīng)用程序發(fā)布給所有人之前码秉,將它發(fā)布給一小部分用戶群逮矛。金絲雀發(fā)布
- 將每次已通過驗收測試的變更版本部署在試運(yùn)行環(huán)境中
部署回滾和零停機(jī)發(fā)布
制定回滾計劃時,需要遵循兩個原則:
- 發(fā)布前转砖,確保生產(chǎn)系統(tǒng)的狀態(tài)(數(shù)據(jù)庫和保存在文件系統(tǒng)中的狀態(tài))已備份
- 每次發(fā)布之前都練習(xí)一下回滾計劃须鼎,包括從備份中恢復(fù)或把數(shù)據(jù)庫備份遷移回來
通過重新部署歷史版本進(jìn)行回滾
優(yōu)點(diǎn):可預(yù)知時間內(nèi)恢復(fù),且風(fēng)險較低府蔗;部署操作經(jīng)過運(yùn)行晋控,而回滾頻率低,所以回滾腳本更不穩(wěn)定
缺點(diǎn):部署需要時間姓赤,業(yè)務(wù)有中斷赡译;覆蓋部署,難以查找問題原因不铆;新版本運(yùn)行時產(chǎn)生的數(shù)據(jù)丟失蝌焚。
零停機(jī)部署
將用戶從一個版本幾乎瞬間轉(zhuǎn)移到另一個版本,如果出問題誓斥,可以瞬間將用戶轉(zhuǎn)到碑的版本上只洒。不同版本應(yīng)用獨(dú)立部署。
藍(lán)綠部署
保留兩個相同的生產(chǎn)環(huán)境版本劳坑,“藍(lán)環(huán)境”毕谴、“綠環(huán)境”。
將新版本部署在“藍(lán)環(huán)境”下距芬,在藍(lán)環(huán)境下測試完成后涝开,將路由配置到藍(lán)環(huán)境。如果出現(xiàn)問題蔑穴,把路由器切回到綠環(huán)境上即可忠寻,此時藍(lán)環(huán)境用于查找問題。
藍(lán)綠部署要小心管理數(shù)據(jù)庫存和。解決辦法如下:
在切換之前暫時將應(yīng)用程序變成只讀狀態(tài)一小段時間奕剃,將綠數(shù)據(jù)庫復(fù)制一份,并恢復(fù)到藍(lán)數(shù)據(jù)庫中捐腿,執(zhí)行遷移操作纵朋,再將用戶切換到藍(lán)系統(tǒng)。如果一切正常茄袖,再把應(yīng)用程序切換到讀寫方式操软,如果出現(xiàn)問題,只要把它切回綠數(shù)據(jù)庫就可以了宪祥。
如果問題出現(xiàn)時聂薪,應(yīng)用程序中已經(jīng)寫入了一些數(shù)據(jù)到藍(lán)系統(tǒng)家乘,那么切回去之前需要將新記錄遷回到綠數(shù)據(jù)庫中
還可以找個辦法讓應(yīng)用程序的新版本把數(shù)據(jù)庫事務(wù)同時發(fā)向新舊兩個數(shù)據(jù)庫
如果只有一個生產(chǎn)環(huán)境,也可以使用藍(lán)錄部署藏澳。讓應(yīng)用程序兩個副本一起運(yùn)行在同一個環(huán)境中仁锯。
金絲雀發(fā)布
金絲雀發(fā)布:把應(yīng)用程序的某個新版本部署到生產(chǎn)環(huán)境中的部署服務(wù)器中,從而快速得到反饋翔悠。
- 部署新版本到一部分服務(wù)器上业崖,對新版本上做冒煙測試,容量測試蓄愁。
- 選擇一部分用戶双炕,把他們引到新版本上
- 還可以部署多個版本,將不同組用戶引導(dǎo)到不同版本上
好處:
- 非常容易回滾撮抓,只要不把用戶引到有問題的版本
- 將用記引致新舊版本妇斤,從而作A/B測試
- 可以通過逐漸增加負(fù)載,慢慢地把用戶引到新版本胀滚,檢驗應(yīng)用程序是否滿足容量需求
緊急修復(fù)
牢記:任何情況下趟济,都不能破壞流程乱投。緊急修復(fù)版本也需要走構(gòu)建咽笼、部署、測試和發(fā)布流程戚炫。
讓每個緊急修復(fù)都走完標(biāo)準(zhǔn)的部署流水線剑刑。
緊急修復(fù)的另一個做法是回滾到舊的好版本上。
處理生產(chǎn)環(huán)境的缺陷時應(yīng)用考慮以下因素:
- 別加班到深夜來做双肤,應(yīng)該與別人一起結(jié)對做
- 確保有一個已經(jīng)測試過的緊急修復(fù)流程
- 對于應(yīng)用程序的變更施掏,避免繞過標(biāo)準(zhǔn)的流程,除非在極端情況下
- 確保在試運(yùn)行環(huán)境上對緊急修復(fù)版本做過測試
- 有時候回滾比部署新的修復(fù)版本更劃算
持續(xù)部署
使用部署流水線茅糜、讓部署到生產(chǎn)也自動化七芭。如果某次提交的代碼通過了所有的自動化測試,就直接部署到生產(chǎn)環(huán)境中蔑赘。
持續(xù)部署可以與金絲雀發(fā)布結(jié)合狸驳,先通過自動過程發(fā)布給一小部分用戶,如果沒有問題缩赛,就發(fā)布給所有用戶耙箍。
小貼士
- 真正執(zhí)行部署操作的人應(yīng)該參與部署過程的創(chuàng)建
- 記錄部署活動
- 不要刪除舊文件,而是移動到別的位置
- 部署是整個團(tuán)隊的責(zé)任
- 服務(wù)器應(yīng)用程序不應(yīng)該有GUI
- 為新部署留預(yù)熱期
- 快速失敗
- 不要直接對生產(chǎn)環(huán)境進(jìn)行修改