應用程序的部署與發佈

《持續交付 發佈可靠軟件的系統方法》讀書筆記

創建發佈策略

當在項目一開始創建發佈策略的第一個版本時,應該考慮下列內容:

創建這個策略只是一個開始而已,隨着項目的進行,它也會改變。發佈策略的一個關鍵部分就是發佈計劃,它用來描述如何執行發佈。

發佈計劃

通常來說,第一次發佈風險最高,需要細緻地做個計劃。而這種計劃活動的結果可能是產出一些文檔、自動化腳本或其他形式的流程步驟(procedure),用來保證應用程序在生產環境上的部署過程具有可靠性和可重複性。除了在發佈策略中的這些材料以外,還要包括以下內容:

有時候,還要考慮一些其他方面的事情。例如,如果新系統是某個遺留系統的替代品,應該把向新系統遷移用戶的步驟寫下來,另外還有如何停止舊系統,特別是不要忘記制訂一個回滾流程,以應對突發問題。

發佈產品

對於商業產品軟件來說,還有如下一些事情需要考慮:

應用程序的部署和晉級

要讓軟件的部署活動能以一種可靠且一致的方式進行,其關鍵在於每次部署時都使用同樣的實踐方法,即使用相同的流程向每個環境進行部署,包括生產環境在內。在首次向測試環境部署時就應該使用自動化部署。寫個簡單的腳本來做這件事,而不是手工將軟件部署到環境中。

首次部署

項目首個迭代的主要目標之一就是在迭代結束時,讓部署流水線的前幾個階段可以運行,且能夠部署並展示一些成果,即使可展示的東西非常少。儘管我們不建議讓技術價值的優先級高於業務價值的優先級,但此時是個例外。

對發佈過程進行建模並讓構建晉級

隨着應用程序變得越來越複雜,部署流水線的實現也會越來越複雜。

需要考慮的細節:

部署回滾和零停機發布

萬一部署失敗,回滾部署是至關重要的。在運行的生產環境中通過調試直接查找問題的這種做法幾乎總會導致晚上加班、具有嚴重後果的錯誤和用戶的不滿。當出現問題時,你應該有某種方法恢復服務,以便自己能在正常的工作時間內調試所發現的錯誤。

聲明兩個重要的約束,首先是數據,如果發佈流程會修改數據,回滾操作就比較困難。另一個是需要與其他系統集成。如果發佈中涉及兩個以上的系統,回滾流程也會變得比較複雜。

當制定發佈回滾計劃時,需要遵循兩個通用原則。首先,在發佈之前,確保生產系統的狀態(包括數據庫和保存在文件系統中的狀態)已備份。其次,在每次發佈之前都練習一下回滾計劃,包括從備份中恢復或把數據庫備份遷移回來,確保這個回滾計劃可以正常工作。

通過重新部署原有的正常版本來進行回滾

如果你有自動化部署應用程序的流程,讓應用程序恢復到良好狀態的最簡單方法就是從頭開始把前一個沒有問題的版本重新部署一遍。這包括重新配置運行環境,讓它能夠完全和從前一樣。

零停機發布

零停機發布(也稱爲熱部署),是一種將用戶從一個版本幾乎瞬間轉移到另一個版本上的方法。更重要的是,如果出了什麼問題,它還要能在瞬間把用戶從這個版本轉回到原先的版本上。

零停機發布的關鍵在於將發佈流程中的不同部分解耦,儘量使它們能獨立發生。尤其是,在升級應用程序之前,就應該能將應用程序所依賴的共享資源(比如數據庫、服務和一些靜態資源)的新版本放在適當的位置。

藍綠部署

有兩個相同的生產環境版本,一個叫做 “藍環境”,一個叫做 “綠環境”。

系統的用戶被引導到當前正在作爲生產環境的綠環境中。現在我們要發佈一個新版本,所以先把這個新版本發佈到藍環境中,然後讓應用程序先熱身一下(你想多長時間都行),這根本不會影響綠環境。我們可以在藍環境上運行冒煙測試,來檢查它是否可以正常工作。當一切準備就緒以後,向新版本遷移就非常簡單了,只要修改一下路由配置,將用戶從綠環境導向藍環境即可。這樣,藍環境就成了生產環境。這種切換通常在一秒鐘之內就能搞定。

在做這種藍綠部署時,要小心管理數據庫。通常來說,直接從綠數據庫切換到藍數據庫是不可能的,因爲如果數據庫結構有變化的話,數據遷移要花一定的時間。解決這個問題的一種方法是在切換之前暫時將應用程序變成只讀狀態一小段時間。然後把綠數據庫複製一份,並恢復到藍數據庫中,執行遷移操作,再把用戶切換到藍系統。如果一切正常,再把應用程序切換到讀寫方式。如果出了什麼問題,只要把它再切回綠數據庫就可以了。

金絲雀發佈

金絲雀發佈就是把應用程序的某個新版本部署到生產環境中的部分服務器中,從而快速得到反饋。這是一個能大大減少新版本發佈風險的方法。

緊急修復

總會遇到這種情況:發現了一個嚴重的缺陷,必須儘快修復。此時,需要牢記在心的最重要的事情是:任何情況下,都不能破壞流程。緊急修復版本也要走同樣的構建、部署、測試和發佈流程,與其他代碼變更沒什麼區別。

爲什麼這麼說呢?因爲我們看到過很多場合,修復版本直接被放到生產環境中,而產生一個未受控版本。這會導致兩個不幸的後果。首先是這種緊急修改沒有做適當的測試,可能引發迴歸問題,或者該補丁不但沒有修復問題,反而引起了更嚴重的問題。

有時候並不真正需要緊急修復一個缺陷。你需要考慮多少人會受到缺陷的影響,這個缺陷是否經常發生,發生後對用戶有多大的影響。如果缺陷隻影響少數人,而且發生頻率不高,影響較低,而部署一個新版本的風險相對較高的話,可能就沒有必要做緊急修復了。當然,通過有效的配置管理和自動部署過程來減少部署風險還有一些爭議。

持續部署

使用部署流水線,並讓最後一步(部署到生產環境)也自動化。這樣,如果某次提交的代碼通過了所有的自動化測試,就直接部署到生產環境中。如果想讓這種做法不引發問題,自動化測試(應該包括自動化的單元測試、組件測試、功能性和非功能性驗收測試)就必須異乎尋常的強大,覆蓋整個應用程序。必須先寫所有的測試(包括驗收測試),然後再寫代碼。這樣你才能做到,只有用戶故事完成的最後那次代碼提交才能使驗收測試通過。

持續部署可以與金絲雀發佈結合使用。首先通過一個自動化過程將一個新版本發佈給一小撮用戶使用。一旦確認(可能是人爲決策)新版本沒有問題,就把它發佈給所有的用戶。由良好的金絲雀發佈系統提供的這層安全網讓持續部署的風險甚至更小。

小貼士和竅門

小結

只要權限正確的話,部署流水線應該能夠通過 “單擊按鈕” 就能將任意一個已通過前面幾個階段的構建版本部署到任意一種環境中。還應該讓團隊中的每個人都明確地看到哪個構建版本被部署到了哪個環境中,該構建版本包含哪些修改。

降低發佈風險的最佳方法是真正地做發佈演練。越頻繁地將應用程序發佈到不同的測試環境中越好。尤其是,你越頻繁地將應用程序發佈到新的測試環境上,這個過程就越可靠,從而在生產環境上發佈時遇到問題的可能性就越小。

發佈計劃最關鍵的部分是將來自組織各部門參與交付的代表組織起來:構建、基礎設施、運維團隊、開發團隊、測試團隊、DBA 和技術支持團隊。在整個項目週期中,這些人應該不斷地交流,持續合作,從而使交付過程更加高效。

推薦閱讀

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ye7gKubZd-FT5tydUR6MEw