改進我們的部署策略
我們有一個在我們公司開發的電子商務應用程序。它是一個相當標準的 LAMP 應用程序,我們已經斷斷續續地開發了大約 3 年。我們在測試域上開發應用程序,在這裡我們添加新功能並修復錯誤等。我們的錯誤跟踪和功能開發都在託管的顛覆解決方案 (unfuddle.com) 中進行管理。當錯誤被報告時,我們在測試域上進行這些修復,然後當我們對錯誤已修復感到高興時將更改送出到 svn。我們遵循相同的程序添加新功能。
值得指出的是,我們的系統和跨伺服器應用程序的一般架構。每次開發新功能時,我們都會將此更新推廣到使用我們的應用程序的所有站點(始終是我們控制的伺服器)。每個使用我們系統的站點基本上都使用完全相同的文件來處理 95% 的程式碼庫。我們在每個站點中有幾個文件夾,其中包含為該站點定制的文件 - css 文件/圖像等。除此之外,每個站點之間的差異由每個站點數據庫中的各種配置設置定義。
這涉及到實際部署本身。當我們準備推出某種更新時,我們會在測試站點所在的伺服器上執行命令。這將執行複制命令 (cp -fru /testsite/ /othersite/) 並通過每個虛擬主機強制根據修改日期更新文件。我們託管的每台附加伺服器都有一個虛擬主機,我們將生產程式碼庫同步到該虛擬主機,然後我們在該伺服器上的所有站點上重複複製過程。在此過程中,我們移出不想被覆蓋的文件,並在復製完成後將它們移回。我們的推出腳本執行許多其他功能,例如應用 SQL 命令來更改每個數據庫、添加欄位/新表等。
我們越來越擔心我們的過程不夠穩定,不能容錯,也有點蠻力的方法。我們也知道我們沒有充分利用顛覆,因為我們的立場是,開發新功能會阻止我們推出重要的錯誤修復,因為我們沒有使用分支或標籤。我們在我們的伺服器上有如此多的文件複製似乎也是錯誤的。我們也無法輕鬆地對我們剛剛推出的內容執行回滾。我們確實在每次推出之前執行差異,因此我們可以獲得將要更改的文件列表,以便我們知道之後發生了什麼更改,但是回滾的過程仍然存在問題。在數據庫方面,我已經開始研究 dbdeploy 作為一種潛在的解決方案。不過,我們真正想要的是一些關於如何改進文件管理和部署的一般指導。理想情況下,我們希望文件管理更緊密地連結到我們的儲存庫,以便推出/回滾將更多地連接到 svn。類似於使用 export 命令來確保站點文件與 repo 文件相同。如果解決方案也可能會停止我們伺服器周圍的文件複製,那也很好。
忽略我們目前的方法,聽聽其他人如何解決同樣的問題真的很好。
總結…
- 使跨多個伺服器的文件與 svn 保持同步的最佳方法是什麼?
- 我們應該如何防止文件複製?符號連結/別的東西?
- 我們應該如何建構我們的 repo,以便我們可以開發新功能並修復舊功能?
- 我們應該如何觸發推出/回滾?
提前致謝
編輯:
我最近讀了很多關於使用Phing和Capistrano來完成這類任務的好東西。任何人都可以提供更多關於他們的資訊以及他們對這類任務有多好?
我對發布的建議是擁有功能版本和維護版本。功能版本將是獲得新功能的版本。這些被添加到您的顛覆主幹中。當您認為這些功能已完成時,您將它們分支到發布分支中。一旦您的 QA 流程對此版本感到滿意,您就可以標記該版本並將程式碼部署到您的伺服器。
現在,當您收到錯誤報告時,您將此修復送出到分支並將其移植到主幹。當您對修復的錯誤數量感到滿意時,您可以標記和部署維護版本。
擁有獨立於開發分支的實時程式碼庫分支(或能夠通過了解實時修訂來創建一個分支)非常重要,這樣您就能夠將修復部署到實時程式碼而無需部署新功能或未經測試的程式碼。
我建議使用您的發行版的本機打包系統來部署新程式碼。如果你有一個包含你所有程式碼庫的包,你知道你的所有程式碼已經部署在一種原子操作中,你可以一眼看到安裝的版本,可以使用你的包校驗和驗證你的程式碼庫。回滾只是安裝先前安裝的軟體包版本的情況。
我可以看到你實現這一點的唯一障礙是你似乎有多個程式碼庫副本,用於在單個伺服器上執行的不同客戶。我會嘗試安排您的程式碼,以便所有客戶執行相同的文件並且不使用副本。我不知道這對您來說有多容易,但是減少您必須處理的副本數量將大大減少您的頭痛。
我假設正如您提到的 LAMP,您使用的是 PHP 或其他不需要編譯過程的腳本語言。這意味著您可能會錯過一個稱為持續集成的精彩過程。這基本上意味著您的程式碼正在不斷地被測試以確保它仍然處於可發布狀態。每次有人簽入新程式碼時,都會有一個程序接受它並執行建構和測試過程。使用編譯語言,您通常會使用它來確保程式碼仍然編譯。對於每種語言,您都應該藉此機會執行單元測試(您的程式碼是在可測試的單元中,不是嗎?)和集成測試。對於網站來說,一個測試集成測試的好工具是 Selenium。在我們的 Java 建構中,我們還測量程式碼覆蓋率和程式碼指標,以了解隨著時間的推移我們的進展情況。我們為 Java 找到的最好的 CI 伺服器是 Hudson,但像 buildbot 這樣的東西可能對其他語言更有效。您可以使用 CI 伺服器建構包。