摘要:使用Microsoft Web Deploy技術自動部署
使用Microsoft Web Deploy技術自動部署
[原文發表位置]:Automating Deployment with Microsoft Web Deploy
[原文發表時間]:2010/9/13 1:40 AM
這是我寫的關於VS2010和.Net4的部落格系列的第28篇。
這篇文章繼續以前部落格,介紹關於我們在Web部署領域所作的改進。我在該系列的第一篇文章裡,概述了VS 2010 Web部署技術的新功能。
今天的文章裡,我會介紹Microsoft Web Deploy—一個採用全面的發佈和部署機制的免費伺服器技術。Web Deploy不僅僅讓你發佈檔案—還可以部署資料庫結構/資料,運行變更的資料庫腳本,設置安全存取控制列表等等。所有這些部署步驟都可以用Visual Studio自動完成。
本篇文章將提供一個循序漸進的課程,教你如何在一台Web服務期上安裝和啟用Web Deploy。接著我們Demo如何使用Visual Studio透過Web Deploy直接(將檔案)發佈到伺服器上,以及如何使用Visual Studio建立自動部署你的應用程式的安裝檔。
Web Deploy—為什麼你會喜歡它
部署一個Web應用程式或網站包含好幾個步驟。您通常需要:
1. 複製檔案和資料夾;
2. 提供資料庫結構,或許還要生成一些資料庫資料;
3. 在檔案和資料夾上設置相應的讀寫和安全存取控制列表;
4. 安裝和配置SSL認證;
5. 部署其它雜七雜八的依賴項(事件日誌,GAC庫,COM元件等等)。
手工執行上面的步驟又累又慢又危險(因為手工部署總是容易出錯)。使用自動化流程,可以讓你在一台伺服器上快速維護和部署應用程式,減少出錯的幾率,並極大加快你在應用程式上的更新放到作業伺服器上的週期。
Microsoft Web Deploy
Web Deploy是由我的團隊建立,用來改進Web部署的免費技術。它是運行在一台伺服器上的部署服務,可以讓你在本地或遠端將程序部署到它上面。Web Deploy內建了在IIS裡建立虛擬目錄和應用程式、複製檔案和資料夾、生成資料庫(SQL Server和MySQL)、設置檔案系統ACL的支援等等。(它甚至還內建了類似於設置機碼,註冊COM元件等功能)。除了這些內建的部署功能,它還支援基於.NET的提供程序API,允許你建立和嵌入你自己的部署步驟—這樣你可以按自己的方式自訂它。
Web Deploy的繫結協議是HTTPS—也就是說Web Deploy可以穿過防火牆(使部署程序到遠端宿主伺服器上簡便、安全)。Web Deploy還同時支援管理員帳號和非管理員帳號的部署方案。非管理方案下,允許管理員在伺服器上配置好Web Deploy,然後委派一部分部署工作給在作業伺服器上沒有管理員權限的程式設計師。這實現了一個非常安全並有彈性的部署方式。在本系列的下一篇文章裡,我會講到啟用委派部署場景的配置步驟。
在Windows Server 2008上安裝Web Deploy
在安裝Visual Studio 2010(或Visual Web Developer 2010 Express)時,預設情況下會將Web Deploy安裝到你的開發機上。它會在VS裡提供建立Web部署安裝檔,還有將它們發佈到啟用了Web Deploy服務的遠端機上要用到的東西。
下面是在一台運行IIS 7.x的Windows Server 2008或Windows Server 2008 R2作業伺服器安裝Web Deploy的步驟:
1. 在作業伺服器上下載並運行Microsoft Web Platform Installer。
2. 在Web Platform Installer上點擊「Web平台」,接著點擊「Web伺服器」下面的「自訂」連結。選擇「Web部署工具1.1」還有「管理服務」功能。
3. 點擊「安裝」按鈕。就會下載和安裝Web部署安裝檔,並啟用Windows內建的IIS管理服務功能。
在Windows Server 2008啟用部署功能
現在我們已經裝好了Web Deploy—下一步就是啟用它。
Web Deploy支援管理員和非管理員部署(即委派部署)。在本文中,我將Demo使用一個在伺服器上有管理員權限的帳號啟用部署。本系列的下一篇文章,我會說明委派部署的啟用方法。
1) 啟用Web Deploy的第一步是打開IIS管理器(開始->運行->inetmgr.exe)。接著在主介面上按兩下「Management Service Delegation」圖示:
按兩下「Management Service Delegation」圖示後,會打開類似下圖的頁面。在動作面板上,點擊「Edit Feature Settings …」連結,打開「Edit Feature Settings」對話框—選中「Allow administrators to bypass rules」選項。這允許有伺服器上管理員帳號的用戶跳過Web管理服務的委派設置,而是使用管理員的權限進行操作:
然後回到IIS管理器的主介面,並按兩下「管理服務」圖示:
按兩下「管理服務」圖示後會打開下面的頁面。選中「Enable Remote Connections」復選框來啟用遠端部署。另外你也可以選擇填寫正在運行的管理服務的IP和埠號—還有允許那些客戶端IP可以連接進來。你可以透過調整這些設置來限制存取部署服務的人員。
在「操作」頁簽點擊「啟動」連接就會在服務期上啟動Web管理服務:
現在這台伺服器已經使用管理員帳號的Web Deploy安裝了部署服務。
重要事項:一個需要關注的事情是你的伺服器上是否啟用了防火牆,或你的伺服器在叢集中的位置。管理服務預設使用HTTPS協議運行在8172這個端口。這個端口可能預設被你主機的設置關閉了。這樣的話,要麼你需要在防火牆/或宿主上打開它—要麼選擇一個允許的埠號。要測試管理服務是否可用,只需要打開瀏覽器並存取類似https://yourservername:8172/MsDeploy.axd 的連結就可以—如果你被要求提供用戶名/密碼,那說明它沒有被防火牆阻擋。如果是超時則說明防火牆禁用了端口。
在非Windows Server 2008的作業系統上啟用Web Deploy
上面的步驟Demo了如何在Windows Server 2008或Windows Server 2008 R2作業系統上啟用Web Deploy服務。IIS 7管理服務內建於這些作業系統裡,Web Deploy可以直接用它。
如果你要在Windows 7,Windows Vista或者Windows Server 2003上嘗試上面的步驟時,你會發現上面沒有IIS管理服務(和在IIS管理器裡的圖示)。而你需要稍微改變一下上面的步驟來啟用Web Deploy服務。
在Windows 7,Windows Vista和Windows Server 2003上啟用Web Deploy
你可以使用下面的步驟,在Windows 7,Windows Vista和Windows Server 2003上啟用Wed Deploy發佈服務:
1) 打開一個管理員權限命令提示字元視窗(即你需要按右鍵並透過「以管理員身份執行」啟動)。
2) 輸入「net start msdepsvc」來啟動「Web部署代理服務」:
3) 為了確認發佈服務是否在運行,更換目錄到「c:\Program Files\IIS\Microsoft Web Deploy」,然後輸入命令「msdeploy –verb:dump –source:appHostConfig,computername=localhost」:
這會導致本地的msdeploy客戶端連接到你剛剛啟動的發佈服務上,並列印出你Web伺服器上ApplicationHost.Config檔案的目前狀態:
如果有很多東西顯示出來,你就會知道所有的東西工作正常,而且你剛剛啟用了Wed Deploy。使用這種方法不能啟用「受托存取」(就是允許非管理員發佈內容—我下篇文章會詳細介紹到)—但是會允許有管理員權限的帳號在這台機器上進行部署。
在Visual Studio裡使用「發佈Web」對話框
現在我們有啟動了Web Deploy的Web伺服器,讓我們試著在Visual Studio IDE上發佈一些東西。
VS 2010包含了一個可以讓你快速部署一個Web應用程式到遠端伺服器上的新「發佈Web」功能。你可以在任何一個ASP.NET Web應用程式項目上透過按右鍵(Web表單和MVC),然後選擇「發佈」命令使用它:
接下來會打開「發佈Web」對話框,用來讓你配置發佈設置。你可以使用這個對話框,透過FTP/FTPS, Web Deploy和FrontPage Server Extensions,將ASP.NET應用程式發佈到遠端機器上。
我們在下拉選單裡選擇「Web部署」選項,然後輸入我們Web部署伺服器的發佈訊息:
請注意你只需要輸入這些設定一次—然後你就可以使用頂端的「儲存/重新命名/刪除」按鈕將它們保存為一個「發佈配置檔案」。發佈配置檔案允許你保存多個部署/發佈選項,並可以在你要用的伺服器之間快速切換。
下面是你可用選項的一些說明:
服務 URL: |
這是Web部署管理服務的URL地址。如果你用的是 Windows Server 2008,那URL的預設格式是https://mysite:8172/MsDeploy.axd 。請注意協議是「https://」,而且埠號必須與你在上面啟用IIS管理服務的埠號一致。 如果你在往Windows Server 2003, Windows 7或者Windows Vista的機器上部署,那麼URL的預設格式是http://server-name (不是https—因為使用內建Windows身份驗證發送的安全憑證是加密的)。你也不需要為Windows Server 2003, Windows 7或者Windows Vista的機器指定埠號。 |
網站/應用程式: |
允許您指定遠端伺服器上要安裝應用程式網站的名稱(和可選的應用程式的名稱)。你可以把你的項目發佈為一個網站,這樣你必須指定類似www.mysite.com的東西作為網站名,或者是「預設Web網站」,如果你只想發佈到根目錄上的話。 注意:指定的網站名必須與在IIS管理器裡的網站名一致。因此如果你將www.scottgu.com網站在IIS註冊時,用的是顯示名稱「ScottGu』s Site」或者「scottgu.com」的話,你必須確保在發佈設置裡指定的也是顯示名稱(即你要指定「ScottGu』s Site」,而不是www.scottgu.com)。如果你設置錯誤,你會收到一個遠端代理「無法連接」的錯誤。 要麼你可以使用類似「www.mysite.com/myapplication」或「ScottGu Site/myapplication」的值發佈到一個子應用程式上,如果應用程式的/myapplication虛擬目錄尚不存在,那麼Web Deploy服務會先為你建立一個,然後將你的項目發佈上去。 你也可以勾選「標記為目標上的IIS應用程式」來指明你要將這個子路經設置為虛擬目錄(預設值)或是一個應用程式。 |
憑證: |
如果你要向不屬於你Windows域的遠端機上部署,你需要在發佈對話框裡指明你的用戶名/密碼。用戶名/密碼要麼映射到遠端機的Windows帳號,要麼映射為IIS用戶名(這樣可以使用更有彈性的授權選項—我的下一篇文章會涉及)。 注意:除非你在遠端機上安裝了簽過名的SSL認證,否則請勾選「允許不受信任的證書」復選框。預設情況下Web Deploy會安裝一個唯一(而且沒有簽過名)的證書—如果你不勾選這個復選框,那麼你就不能登錄,因為VS不信任一個未簽名的證書。 |
其它: |
還有一個復選框,允許你指明「保留目標上的多餘檔案」與否。如果你不選它,那麼在你發佈的網站/應用程式的現有檔案裡,不在你的VS項目裡的檔案會被刪除掉。 |
一旦你填好了發佈設置,你可以點擊「發佈」按鈕,連接到遠端Web部署服務來將你的程序部署到指定的位置。Visual Studio的「輸出」窗口會顯示類似下面的輸出,來解釋部署步驟中執行的操作。
上面的項目是一個包含幾個檔案和資料夾的基本Web工程。Web Deploy會負責將所有的檔案和相應的存取列表複製到遠端伺服器上(比如說:將\app_data資料夾設置為讀/寫)。本系列的下一篇文章裡,我將介紹如何將部署資料庫的操作包含在Web Deploy過程中—還有如何自動更換web.config的檔案設置(例如連接字串)。
我們已經將網站發佈到遠端機上。右鍵單擊項目工程,再選一次「發佈」命令就可以再發佈一次—再次打開發佈對話框(預設情況下使用上一次發佈的相同設置)。另外,你也可以在VS 2010里啟用「Web一鍵式發佈」工具欄—它允許你在已存的發佈配置檔案之間快速切換,點擊右邊的「發佈」按鈕就可以將項目工程發佈到目標伺服器上(不需要打開對話框):
請注意Web Deploy足夠聰明,它會對比你本地項目和遠端伺服器(的檔案)—並只複製需要的檔案。所以如果你只是對一個大項目做一點改動,並重新發佈的話—只有修改過的檔案會被複製過去。不會重新複製沒有被修改的檔案。這就讓重新部署/更新一個網站快很多—特別是那些有很多靜態內容和大圖片的項目。
預設情況下,Web Deploy將檔案複製到Web Deploy服務之前會壓縮檔案—減少傳輸大小和加快部署。
在VS 2010裡建立發佈套件
VS 2010還支援一個打包選項,用來讓你打包你的ASP.NET Web應用程式(還有像web.config,資料庫,ACL等它的依賴項)到一個Web Deploy支援的zip格式的安裝檔裡。接著你把安裝檔交給一個可以使用IIS管理器部署它的人手上,或者透過一個命令行/PowerShell腳本將它安裝到一個使用Web Deploy的遠端伺服器上。
你建立的安裝檔可以選擇公開那些可複寫的應用程式設置(例如目錄路徑,資料庫連結字串等)。當使用IIS管理器時,安裝嚮導會提示管理員輸入可變更得設置項—這樣你可以在不用寫任何程式碼的前提下提供乾淨的自訂體驗。當使用命令行或者PowerShell腳本部署程序到遠端伺服器時,這些設置可以當作命令行參數輸入。
要在VS 2010里建立一個Web部署套件,只要在解決方案資源管理器裡在你的ASP.NET Web項目上按右鍵,並選擇「產生部署套件」選單:
之後VS 2010就會建立一個Web Deploy兼容的部署包。在項目的「屬性」對話框,你可以配置安裝檔在磁碟裡的位置(選擇「打包/發佈Web」標籤)。在「輸出」窗口的生成內容裡會顯示生成Web Deploy部署包的磁碟路徑(這樣找起來很容易):
生成的部署包是一個.zip檔案,包含了一個Wed Deploy清單,讓你方便地透過IIS管理器或命令行將它部署遠端伺服器上。
用IIS管理器安裝部署套件
一旦你建立了.zip的部署套件,你就可以用IIS管理器安裝它。在IIS管理器裡,點擊在「工作」面板上的「匯入伺服器套件或網站套件…」連結(Web Deploy安裝後才有):
這會打開一個對話框讓你選擇.zip部署套件。當你在IIS管理器做這些的時候,它會對管理員顯示在安裝檔裡自動化的部署步驟:
跟著精靈走,它就會自動地將程式維護到你的伺服器上。
使用命令提示字元部署安裝檔
另外,你也可以使用一個命令行窗口將包部署到遠端伺服器上。
打開命令提示字元窗口(管理員權限),更換目錄到部署套件.zip檔案所在的磁碟目錄。除了.zip安裝檔,你可以看到VS在那個目錄裡還添加了一起其他檔案:
ProjectName.deploy.cmd檔案為你提供將包部署到遠端伺服器上的預置腳本。
ProjectName.SetParameters.xml檔案包含了一些可設置的部署參數(例如網站名稱,連結字串的路徑等)。你可以使用Visual Studio的項目屬性面板來設置生成到該檔案的參數的預設值。管理員們可以在之後編輯/修改它們(避免將它們透過命令行參數輸入)。請打開這個檔案並確保預設值是否正確。特別要確保將要部署的網站名/應用程式名是正確的。
要將包安裝到遠端Web Deploy伺服器上,執行下面的命令:
ProjectName.deploy.cmd /y /M:https://WebDeployUrl:8172/MsDeploy.axd /u:username /p:password –allowUntrusted /A:basic
下面是參數的一些說明:
/y |
指明Web Deploy應該將程序部署到遠端伺服器上。 另外除了/y選項,你也可透過/t來執行一個試驗安裝,它會模擬部署過程來幫助你確認所有的東西是否準備好了(而不是實際安裝)。 |
/M: parameter |
指明部署包的那台伺服器的發佈端點。它需要匹配你設置的發佈服務URL(要和「發佈Web」對話框裡的「Service URL」參數一致)。如果是發佈到一台 Windows Server 2008或者2008 R2伺服器上,應該是一個「https」的URL。 |
-allowUntrusted |
如果遠端Web Deploy的SSL認證沒有簽過名(預設情況就不是),需要這個選項。 |
/A:basic |
如果遠端伺服器沒有使用Windows身份驗證來識別用戶,需要這個選項(指明你將用基於http的SSL身份驗證)。 |
執行命令後,它會將套件部署到遠端伺服器上, 執行所有的部署步驟(比如維護資料庫,設置檔案ACL之類的東西),並在安裝過程中將狀態傳回到命令列提示字元視窗。
從一個建置伺服器或持續整合伺服器上自動部署
除了由程式設計師/管理員顯式啟動部署過程,你還可以讓它作為一個持續集成過程或者生成伺服器的一部分自動執行。自動建立一個Web Deploy .zip套件所需的命令可以作為MSbuild的任務。用它們,要麼你可以在生成過程中建立一個部署套件,要麼再加上自動部署程序的過程。
我將在後續的一篇部落格裡講到啟用自動生成的場景。
在一個 Web Farm 裡部署
Web Deploy還可以與Microsoft Web Farm Framework一起使用在Web農場裡實現自動部署。你可以在Web Farm Framewor k叢集的主伺服器上安裝和配置Web Deploy—叢集裡的輔助伺服器接著可以監視並複製所有你發佈的程式。這樣就允許你在一個Web Farm 裡任意多的機器上以自動化的方式執行部署網站和程序相同的步驟。
請參閱我的前一篇關於Microsoft Web Farm Framework的文章來瞭解啟用的過程。
總結
Web Deploy提供了一個將ASP.NET Web程序部署到遠端伺服器上強大並有彈性的自動化方式。Web Deploy不僅允許你發佈檔案—還可以維護資料庫結構/資料,執行資料庫變更腳本,設置安全ACL以及更多。
你可以在Visual Studio裡直接部署到啟用Web Deploy的遠端伺服器上,或者建立可以用管理工具或命令行安裝的部署包。你還可以將打包和部署作為一個生成伺服器或者持續集成流程的一部分,來實現不間斷的交付模式。
下一篇文章裡我會提到使用Web Deploy實現授權方案,我還會在部落格文章裡講到在部署過程中修改/定制web.config檔案,在Web Deploy過程中部署資料庫,以及將所有這些整合到一個自動化的生成過程的步驟。
希望這能對您有所幫助。
附:[除了寫部落格以外,我現在也使用推特(Twitter)來及時更新狀態和分享連結,您可以到這個地址「推」我一下:twitter.com/scottgu