構建與部署的腳本化
《持續交付 發佈可靠軟件的系統方法》讀書筆記
構建和部署系統必須一直保持活力,即這個系統不僅要從項目剛開始就開發,而且一直要持續到軟件在生產環境中的維護階段。一定要細心地設計和維護它,像對待其他源代碼一樣對待它,並定期使用,以便當我們需要時,可以確保它還能運行。
構建工具概覽
所有構建工具都有一個共同的核心功能,即 可以對依賴關係建模 。在執行過程中,它能以正確的順序執行一系列的任務,計算如何達到你所指定的目標,而且被依賴的任務也僅需要運行一次。
書中列舉的一些構建工具:Make、Ant、NAnt 與 MSBuild、Maven、Rake、Buildr、Psake。
構建部署腳本化的原則與實踐
下面列出構建部署腳本化時所要遵循的原則與實踐,無論你使用哪種技術它們都是適用的。
爲部署流水線的每個階段創建腳本
當項目剛開始時,可以將部署流水線中的每個操作都放在同一個腳本文件中,即使是那些還沒有被自動化的步驟,也可以有對應的啞操作。但是,一旦腳本變得太長,就要將它們分成獨立的腳本,讓部署流水線中的每個階段分別使用單獨的腳本。
這樣,一個提交階段的腳本就可以完成編譯、打包、運行提交測試套件和執行代碼靜態分析的工作。功能驗收測試腳本會調用部署工具,將應用程序部署到適當環境中,並準備相關數據,之後再運行驗收測試。你還可再用一個腳本運行任何非功能測試,比如壓力測試和安全測試。
確保將所有的腳本都放到版本控制庫中,並且最好和源代碼放在同一個版本 控制庫中。對於開發人員和運維人員來說,最關鍵的是要能夠合作完成構建腳本 和部署腳本,而想要做到這一點,就要把它們放在同一個倉庫中。
使用恰當的技術部署應用程序
在做自動化部署工作時,應該使用恰當的工具,而不是通用腳本語言(除非部署流程十分簡單)。
使用同樣的腳本向所有環境部署
“使用同樣的腳本部署每個環境” 和 “環境配置信息的不同(比如服務 URI 或 IP 地址)” 這兩件事應該分開管理,即將配置信息從腳本中分離出來,並將其保存在版本控制庫中,並用一些機制讓部署腳本去獲得這些信息。
這裏有兩個關鍵點:
-
構建和部署腳本在開發機器和類生產環境上都能運行;
-
開發人員使用這些腳本進行所有的構建和部署活動;
使用操作系統自帶的包管理工具
在本書中我們使用 “二進制包” 指代部署過程中需要放在目標環境中的所有內容。大多數情況下,它是構建過程中產生的一堆文件,以及應用程序所需的庫文件,可能還包括版本庫中的某些靜態文件。
可是,“將一堆文件分別部署到文件系統的不同位置” 這種做法效率非常低,維護起來也非常麻煩,尤其是在升級、回滾和卸載時。這也是包管理工具出現的原因。如果只有一種目標操作系統,或者一組相似的操作系統,我們強烈推薦使用操作系統自身的包管理技術把需要部署的文件打包在一起。
確保部署流程是冪等的(Idempotent)
無論開始部署時目標環境處於何種狀態,部署流程應該總是令目標環境達到同樣(正確)的狀態,並以之爲結束點。
部署系統的增量式演進
每個人都能看到一個完全自動化的部署過程的魅力,即 “單擊按鈕即可發佈軟件”。
當某個大型企業應用系統以這種方式部署時,看起來就像變魔術一般。但魔術有一個問題,即從外部看會顯得極爲複雜。事實上,當你查看我們的部署系統時會發現,它只是由一組非常簡單的、增量的步驟組成的複雜系統,而這些步驟也是隨着項目的進行不斷完善的。
我們想說的是,並不是完成所有的步驟之後才能獲得價值。事實上,當你第一次寫了一個腳本用於在本地的開發環境上部署應用程序,並將其分享給整個團隊時,就已經節省了很多開發人員的時間。
部署腳本化
環境管理的核心原則之一就是:對測試和生產環境的修改只能由自動化過程執行。
多層的部署和測試
對於軟件交付或某個複雜系統的構建和部署,假如說有一個基礎的核心原則的話,那就是應該總是把根基紮在已知狀態良好的基礎之上。我們不去測試那些沒有編譯成功的代碼,也不會對沒有通過提交測試的代碼進行驗收測試等。
測試環境配置
任何一個層級的部署出錯,都可能導致應用程序無法正常運行。所以,當準備每一層級時,都要對其進行測試。如果發現問題,就要讓環境配置流程快速失敗,而測試結果也應該給出清晰指示,指出錯誤出現在哪裏。
小貼士
-
總是使用相對路徑;
-
消除手工步驟;
-
從二進制包到版本控制庫的內建可追溯性;
-
不要把二進制包作爲構建的一部分放到版本控制庫中;
-
“test” 不應該讓構建失敗;
-
用集成冒煙測試來限制應用程序;
小結
“腳本” 這個術語被廣泛應用,通常是指輔助我們進行構建、測試、部署和發佈應用程序的所有自動化腳本。
強烈建議你使用構建和部署流程作爲組建該腳本集的一個指導。請以迭代的方式來識別最令你痛苦的步驟,並將其自動化,沿着部署流水線,逐步完善自動化構建和部署能力。請時刻牢記最終目標,即在開發、測試和生產環境中共享同一種部署機制,但不要過早地糾結於工具的創建。
腳本應該貫穿應用程序的整個生命週期。我們應該對這些腳本進行版本控制、維護、測試和重構,並且將其用作部署應用程序的唯一機制。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/JTLT3ZaTFZDxnYvsCZz7kw