使用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。接著我們演示如何使用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支持管理員和非管理員部署(即委托部署)。在本文中,我將演示使用一個在服務器上有管理員權限的帳號啟用部署。本系列的下一篇文章,我會涉及委托部署的啟用方法。
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
上面的步驟演示了如何在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服務器擴展,將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農場里部署
Web Deploy還可以與Microsoft Web Farm Framework一起使用在Web農場里實現自動部署。你可以在Web Farm Framework集群的主服務器上安裝和配置Web Deploy—集群里的輔助服務器接著可以監視并復制所有你發布的程序。這樣就允許你在一個Web農場里任意多的機器上以自動化的方式執行部署站點和程序相同的步驟。
請參閱我的前一篇關于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
posted on 2010-11-23 14:52 aiaiwoo 閱讀(16438) 評論(0) 編輯 收藏 所屬分類: ASP.NET