2009-06-24 148 views
4

以下是這種情況:我們有多個開發人員,他們具有不同程度的命令行體驗,我們正在爲我們的網站制定部署解決方案。生產環境是2個SUSE Linux機器。開發環境也是SUSE Linux系統。每個開發人員都會在其主目錄中擁有SVN樹的副本,以進行開發和測試。SVN網站開發和部署解決方案

的目標是有一個版本系統,易於使用和易於恢復,將有多個生產服務器工作。如果一個非網頁開發者(仍然是一個不在網絡世界的編碼人員)也可以很容易地恢復任何網站,那將是一件好事。在一個最佳的世界裏,發佈會像在你想要發佈的網站上運行一個命令一樣簡單。該命令會更新生產服務器並在喚醒中留下恢復路徑。

我們目前部署的解決方案是有點笨重,很難恢復,慢如糞土。我們目前使用SVN檢入所有文件。然後運行一個腳本,基本上在SVN中創建一個標籤。然後運行第二個腳本,進入2個生產服務器的每一個,並運行「svn up」。

有什麼建議嗎?

+1

我嘗試了一些下面的建議,包括Capistrano和CruiseControl,並檢出了SpringLoops(非常酷的解決方案,但它不適用於我們)。 PHP Phing最終成爲了一個完美的搭檔。它很容易定製和設置。 – prime31 2009-07-09 17:50:32

回答

0

您可能遇到的其中一個問題是在不同版本中通過不同的數據庫結構向後和向前轉移。另外如果你有它需要的初始化數據。我記得這裏有一些被類似的問題,如果你搜索,但不太喜歡這個..

+0

我們使用自定義應用程序服務器作爲我們的SQL服務器(MYSQL和MSSQL)和客戶數據庫服務器之間的中間件,因此我們的數據已經處理完畢。 – prime31 2009-06-24 20:50:53

+0

Jas表示對數據庫(或數據庫中的數據)的更改無法使用恢復命令進行回滾。具有功能性的Web應用程序=數據庫+代碼一起工作。如果數據庫具有不同的模式,回到(以前)功能性代碼可能無法正常工作。 – Ted 2010-12-03 16:24:43

0

在我的經驗中,「恢復」功能幾乎是不可能維持,因爲沒有簡單的方法來處理破壞性更新。也就是說,你絕對可以做得比svn up更好。至少,你希望在代碼簽出後運行腳本,這可以修補應用程序(對數據庫進行更改等)。您可能想要將實際更新原子化爲原子,因此我建議您將svn export添加到臨時文件夾,然後在完成後更新符號鏈接以指向該文件夾。在運行補丁期間,您可能還想停止任何服務。

你可以考慮使用類似斯特拉努在一個包裝精美包裝了這一切。它帶有一個漂亮的基於我們的gui(Webistrano)。

2

我是一個.NET的傢伙,因此與在Windows世界的事情工作...話說回來,雖然我每日的基礎上合作,共同管理構建過程的技術,從你的世界來了! (Linux/java技術在括號中,但是我也包括了它們與Windows讀取器的等價物)我使用CruiseControl.NETCruiseControl),VisualSVNSVN),TortoiseNAntAnt)來照顧我所有的構建需求。

所有我的構建通常自動推並在檢查的時間標記,這是通過CruiseControl的,因爲它監視我的源控制(SVN或顛覆)來完成。當CruiseControl(CC)發現新代碼已被檢入時,它將執行一個CC項目,該項目又調用構建服務器上的Ant腳本。

Ant腳本在常見構建中爲我做了幾件事情。它將檢出最新代碼的副本並將其下載到構建服務器。然後它將構建代碼以確保至少編譯的東西。然後它設置我的數據庫的乾淨副本,並執行任何SQL腳本以構建基準數據庫直到當前版本。然後運行我所有的單元測試項目。然後運行集成測試,其中包括測試我的存儲庫層,以確保代碼仍與我的後端對齊(我通常在我的項目中使用ORM,因此它們很少不同步......但這是一個很好的步驟正在進行中)。一旦所有測試都通過(或失敗),我將數據庫回滾到乾淨狀態,並執行腳本以使其達到當前版本(這非常重要,因爲它爲團隊提供了一個乾淨的數據庫,以便在點擊時進行開發的按鈕)。如果構建成功,那麼我會將代碼部署到開發服務器(我也有一個點擊部署到我的登臺服務器和生產服務器)。如果您想在每次簽到時標記您的代碼庫,那麼您也可以在這裏做到這一點。

一旦所有這些完成,我喜歡使用NDepend,NDocNCover對我的代碼進行一些分析。 NDepend是一個代碼分析工具,用於確保事物在架構上是正確的,命名標準是應該的,並且是一個全部更多。 NDoc提取所有代碼註釋併爲我的代碼創建MSDN樣式文檔。 NCover告訴我是否對我的代碼進行了適當的單元測試。

然後,我寫了一個自定義Ant任務,它解析了我的各種// TODO和// CodeDebt標記的所有代碼,以生成另一份報告(通常在衝刺結束時)告訴我如何在我的代碼庫中建立了很多垃圾。這可以作爲下一個衝刺的考慮因素。

所有這些報告都包含在構建電子郵件中,或者鏈接太適當。

請記住,所有上述情況發生在每次檢查...並且沒有任何人必須點擊一個按鈕!這是真正的持續集成,應該是每個構建主人的目標。

CruiseControl有一個基於web的控制檯,它也允許非web開發人員(任何人)真正進入並執行這個推動,而不必檢查代碼......調用強制構建。

鑑於此框架,只要所有內容都受版本控制,就可以輕鬆地回滾推送。您需要另一個Ant腳本來執行相同的過程,但需要額外的第一個任務,因爲它必須獲取最新版本的代碼,而不是最近版本來執行構建過程。所有的Ant任務都可以與不同的執行目標重用。

1

只是爲了保持簡單,給SpringLoops一試。這是一個託管的svn服務,可以選擇部署(並恢復)到不同的服務器。它的使用和設置非常簡單,免費版本可以讓你部署到一臺服務器上,但是如果你願意付費,你可以部署到不同的服務器上(例如分段,開發和生產)。

您可以免費獲得30天的任何軟件包,因此您可以使用盡可能多的服務器進行測試。我不隸屬於springloops。我只是使用它,並發現它很有用和簡單。

2

Capistrano是一個很好的解決方案。儘管最初是爲Ruby on Rails平臺開發的,但我已經在許多PHP項目上成功地使用了它。它可以自動執行通過SSH執行的操作。部署是原子的,因爲每個部署都檢出到一個新目錄。

通過使用符號鏈接打開當前副本。最新版本的源代碼來自Subversion。您還可以設置靜態配置文件以在生產環境中使用。

Capistrano也支持回滾,但如果您在部署之間進行數據庫更改,則必須謹慎。考慮使用類似dbdeploy或rails migrations來解決此問題。