p.251 ~ 266
本章的重點整理
專案一開始,就要擬定發布的策略,要找來相關的人一起討論出一個策略方向,大家跟著這個方向前進,過程中可能會修修改改,但重要的事所有修正都要有文件做紀錄
這個 policy 需要考慮的東西有以下列的這些
這些只是盡可能的考慮進去,執行過程中會有許多的變化。
「唯一不變的事就是需求一直在變」
不管是用文件、腳本、或是步驟流程來紀錄發布流程,都需要保證這個流程是具有可靠性及可重複性的。
那這個流程內容需要有:
這裡特別強調備份及還原的重要性,再引用一下前輩說過的話
「重點不是怎樣備份,而是要想怎麼樣去還原」
這裡提到比較多跟商業的考量,我想要提一下關於 license 的部分,曾經聽過一個前輩提醒說,要小心 GPL license,
基於 GPL license 有感染性的特性,有參考到 GPL 的軟體要懷著感恩的心,將你的軟體也開源
所以假設再開發的時後有用到 GPL license 的套件,你的軟體也適用 GPL,這個前輩是個個人開發者,開發的東西被敵對大公司眼紅盯上,就抓到 GPL 著個特性,就威脅你要把軟體開源,這樣一來你開發賣錢的東西就不值錢了。
所以提醒大家,在發布產品這個階段也可以把 license 問題考慮進去
如果要讓部署具有一定的可靠性及一致性,最好是每次部署都使用同樣的方法
這裡提到首次部署的重要性,我能想到在首次部署就使用實作出來的部署方法作部署的好處:
因為像是環境建置比較屬於一次性的,建置完成沒多久就忘了,最好的方式還是用腳本或文件做紀錄
所以我們需要盡量在首次部署的時候就使用同一套部署方法
在首次部署後我們可以得到的:
這裡探討到 staging 到底要多像 production 環境?
A: 就依 production 環境為主
至少作業系統、package 要一致,不要裝 IDE
前面提到的發布策略、計畫,到自動化部屬,那應用程式越來越複雜,這整個 pipeline 也需要更嚴謹的對待,需要再多考慮一些像是
另外 pipeline 中還需要可以看到哪些版本通過階段測試,並且提供按鈕可以讓該審核人員可以透過 點擊 來將建置進入下個階段測試或是部署
讓自動化來部署、測試,讓不是技術人員也可以輕易操作,跟看到目前的狀態
這裡指的是 configuration,主要部署的不只是 binary,可能有時候設定檔也需要更新,所以最好的做法是用簡單的冒煙測試,也把設定檔做個驗證
然後再把所有元件 一起 晉級到下個階段,盡量避免分開來晉級,以免發生一些不可預期的錯誤,像是資料庫腦裂啊等等的錯誤
假設服務越來越多,有些服務的相依性太複雜,或是共用同樣環境,可以考慮用虛擬化或是 dockerize 的方式來解耦合
最後當然是部署到跟正試環境非常接近的環境試跑,做最後的整合測試,如果公司的 $$ 夠的話,最好是複製一組正式環境,可以順便做容量效能的測試
萬一部署失敗是很嚴重的事,所以怎麼還原也是很重要的,下面講到兩種 zero-downtime 的方法,藍綠部署、金絲雀部署
所以在做發布動作之前,先確保目前狀態的備份及還原的可行性,還是套一句前輩的話
「重點不是怎樣備份,而是要想怎麼樣去還原」
當然最簡單還原的方法就是,把前一個OK的版本在部署一次,但這樣的話部署過程就會有 downtime,以及較難除錯
所以才需要下面提到的 zero-downtime 的部署方法
就是在正常服務的情況下,瞬間無異常的轉移到新版本,另一方面假設進版有任何錯誤,也要能瞬間轉回原來版本上
準備兩套一模一樣的環境,將新版部署到另一個環境中,再將線上流量切換過來
另外還有 shadow environment releasing 就是流量切過去另一組之後,退下來的那一組就拿來當測試環境
儘管測試再怎麼多,總還是會有 loss 的地方,這時就蠻適合用金絲雀部署方式來測試
就是把新版本部署到少部分的機器上,並在這邊收集新版本的問題,好處是
最後還是建議線上環境中,盡量不要太多不同的版本,以免增加管理上的負擔,也可能會出現一些不可預期的錯誤