![](/img/trans.png)
[英]MSdeploy deploys an MVC 2 application with wrong virtual directory name
[英]deploy MVC site with msdeploy including IIS settings from CI server that doesn't have virtual directory setup
我試圖弄清楚如何在我的MVC站點上使用msdeploy,以便能夠自動化部署,包括在遠程服務器上設置IIS。
我使用以下命令創建程序包:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe Clients\PokerLeagueWebSite\PokerLeagueWebSite.csproj /T:Package /p:Configuration=Deployment
我的設置如下:
local dev box using VS2010 + GIT
GITHUB for repo
Teamcity for CI server (different machine to dev box)
remote (same network) UAT server
如果我勾選“包括在IIS中配置的IIS設置”和“包括該Web項目使用的應用程序池設置”,然后在我的開發框中構建該程序包,然后從那里發布,效果很好。 這是我使用的命令:
C:\myproject\Packages\Deployment\PokerLeagueWebSite>PokerLeagueWebSite.deploy.cmd /Y /M:192.168.10.98:8172 /U:administrator /P:password
這將在我的UAT服務器中創建虛擬目錄,一切正常。 問題是當我提交到github並且CI服務器下載並構建它時。 自然,CI服務器上未設置虛擬目錄,因此構建/軟件包失敗。
我想做的是使用msdeploy提供的包裝,並能夠遠程部署站點和IIS。 我猜有幾種選擇:
1)將MVC項目文件更改為硬編碼iis設置,以便無論何時何地運行構建包,它都會使用正確的設置創建XML文件,以便可以從任何計算機上進行部署。 我認為可以使用項目根目錄中的package.xml文件來完成此操作,但是我不知道如何設置所有應用程序池和虛擬目錄設置。 感覺就像我已經到了一半,但無法獲得最終的成功。
2)使用powershell更改創建的包XML文件,以便添加IIS提取設置。
第一個選項是可取的,因為它可以將所有信息都保存在一個位置,並且您無需記住在部署之前運行額外的腳本。
我相信我可以通過使用VS創建程序包並獲取所需的設置然后編寫腳本來找出第二個選項,但是我沒有任何線索,花了很多時間閱讀有關它的內容,但對我的操作沒有任何成功選項一。
NB
在發布此文章之前,請閱讀一些建議的問題,我可以看到一些可能性:
MSdeploy部署了具有錯誤虛擬目錄名稱的MVC 2應用程序
這個問題是關於在msdeploy命令上傳遞額外的值的問題,看起來可以,但是在構建過程中不是可以的。 不確定要使用的所有命令,但可以確定,可以谷歌搜索。
該鏈接似乎與上面的內容相同: http : //msdn.microsoft.com/zh-cn/library/ee814764.aspx
此頁面介紹了選項2的可能性。http://learn.iis.net/page.aspx/1082/web-deploy-parameterization/
認為這是這樣的:在網站的根目錄中使用parameter.xml來獲取項目內容: http : //vishaljoshi.blogspot.com/2010/07/web-deploy-parameterization-in-action.html
編輯
我一直在繼續閱讀和測試。 我認為,使用項目根目錄中的parameters.xml文件,我可以在那里得到幾乎所有的參數。 我的問題似乎是archive.xml文件。 這是完全不同的,如果我沒有選中“使用IIS設置”復選框,這就是導致軟件包無法正確安裝的原因。 我已經開始閱讀有關[project] .wpp.targets文件的信息,該文件可能會有所幫助,但由於該atm而非常丟失。
編輯2
因此,我認為我需要做的是獲取[project] .sourcemanifest.xml文件來更改其一些設置。 我相信這就是驅動archive.xml的原因,而這與現在有所不同。 我認為parameters.xml可以正常工作。
不使用IIS時,sourcemanifest.xml如下所示:
<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
<IisApp path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" managedRuntimeVersion="v4.0" />
<setAcl path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclResourceType="Directory" />
<setAcl path="C:\hoh_code\GIT\ai-poker- project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>
但是,當我勾選使用IIS設置時,它看起來像這樣:
<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
<appHostConfig path="Default Web Site/PokerLeague" />
<contentPath path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" />
<setAcl path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclResourceType="Directory" />
<setAcl path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>
在[project] .wpp.targets文件上工作時,不確定如何更改它,但是在黑暗的atm中摸索着。
編輯3
好,所以我想我待了一會兒。 在我的[project] .wpp.targets文件中,我有:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AddContentPathToSourceManifestDependsOn>
SetCustomACLs;
</AddContentPathToSourceManifestDependsOn >
</PropertyGroup>
<Target Name="SetCustomACLs">
<ItemGroup>
<MsDeploySourceManifest Include="appHostConfig">
<Path>Default Web Site/PokerLeague</Path>
</MsDeploySourceManifest>
</ItemGroup>
<ItemGroup>
<MsDeploySourceManifest Include="contentPath">
<Path>$(_MSDeployDirPath_FullPath)</Path>
</MsDeploySourceManifest>
</ItemGroup>
</Target>
</Project>
它將構建,創建一個部署程序包,然后可以將其從我的開發箱部署到UAT服務器,並且可以正常工作。 但是,當我在CI服務器上運行它時,它不會構建部署包,它會在清單階段退出,並顯示以下錯誤:
One or more entries in the manifest 'sitemanifest' are not valid.
清單文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
<appHostConfig path="Default Web Site/PokerLeague" />
<contentPath path="C:\TeamCity\buildAgent\work\71e78d4c543e0594\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" />
<IisApp path="C:\TeamCity\buildAgent\work\71e78d4c543e0594\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" managedRuntimeVersion="v4.0" />
<setAcl path="C:\TeamCity\buildAgent\work\71e78d4c543e0594\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclResourceType="Directory" />
<setAcl path="C:\TeamCity\buildAgent\work\71e78d4c543e0594\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>
我猜是因為它仍然具有IisApp以及我添加的appHostConfig。 我只是在猜測,還不知道如何刪除它。
編輯4
確定,所以我找到了從清單和參數中刪除IISAPP的設置:
<DeployAsIisApp>False</DeployAsIisApp>
這進入wpp.targets文件。
現在,這已經創建了一個新問題,它將不再部署。 我認為這與處理站點的apphostconfig和處理虛擬目錄的iisapp有關。
編輯5
因此,我一直在研究使用IIS和我的自定義選項之間的區別。
sourcemanifest.xml文件是相同的systeminfo.xml是相同的
setparameters.xml:
IIS Web應用程序名稱部分不同。 IIS版本的值為“默認網站/撲克者”,而我的版本為“ C:\\ websites \\ pokerleague”。
我認為這是導致parameters.xml錯誤的原因:
IIS Web應用程序具有相同的值,並且tags屬性具有物理屬性而不是iisapp。
我有類似的工具,並且可以自動構建和部署:
我將構建,打包和部署步驟分開。 我不使用msdeploy xml文件,但在命令行上執行相同的操作。
這些是我的步驟:
右鍵單擊“ MyAppName”項目->“屬性...”,然后單擊“打包/發布Web”選項卡...
我第一次手動創建IIS網站(也許您可以自動化,但我沒有)。 使用MSDeploy時,它將把您的應用程序推送到匹配的網站名稱-您不必對任何目標文件夾路徑或任何內容進行硬編碼。
將其保存在您的項目中,並確保將所做的更改檢入到Git中(按原點/主鍵)。 當CI服務器運行構建步驟時,將從設置控制中撤消那些設置。
我編輯構建步驟,並添加第二個構建步驟,以使用msbuild直接構建MyAppName.sln。 您可以根據需要進行修改,因為您可能已經以某種方式進行了修改。
基本上,我們需要在構建服務器上安裝VS,手動復制文件,或者安裝Microsoft Visual Studio 2010 Shell(集成)可再發行組件包 。
在生成服務器上找不到Microsoft.WebApplication.targets。 您有什么解決方案?
這將使它得以構建。 仍然沒有部署到服務器。
我在這里獲取Web部署工具並進行安裝。 重新啟動后,TeamCity登錄名出現404錯誤。 事實證明,Web Deploy具有監聽端口80的服務,但TeamCity Tomcat服務器也監聽。 短期而言,我將在控制面板中停止Web Deploy Web服務,然后啟動TeamCity Web服務。 Web部署代理服務的目的是接受其他服務器對該服務器的請求。 我們不需要這樣做,因為TeamCity服務器將充當客戶端,並部署到其他Web服務器。
Web部署工具也必須安裝在目標Web服務器上。 我在這里不做過多介紹,但是您必須將服務也配置為偵聽,因此,當您運行Deployment命令時,它將接受該命令並安裝在服務器上。 對於服務器,我設置了一個名為“ webdeploy”的新帳戶,並具有安裝許可。
我為打包和部署執行單獨的步驟。 如果需要,這將允許您構建Release軟件包但手動部署它的情況。
這是msbuild軟件包命令:
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"
MyAppName/MyAppName/MyAppName.csproj
/T:Package
/P:Configuration=Debug;PackageLocation="C:\Build\MyAppName.Debug.zip"
讓我解釋一下命令部分:
MyAppName.csproj:要構建的VS項目文件的路徑。 從項目的“屬性”選項卡中可以設置其中的重要選項。
/ T:Package:創建一個ZIP包
/ P:Configuration = Debug; PackageLocation = ***:運行調試配置。 這與在Visual Studio中選擇“調試”設置的情況相同。 “包裝位置”是它創建的。 我們稍后將在Deployment命令中引用該軟件包文件。
"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy.exe" -verb:sync
-source:package="C:\Build\MyAppName.Debug.zip"
-dest:auto,wmsvc=webservername,username=webdeploy,password=*******
-allowUntrusted=true
此命令也值得詳細說明:
-verb:sync:使網站從源同步到目標
-source:package =“ C:\\ Build \\ MyAppName.Debug.zip”:源是MSBuild zip文件包
-dest:auto,wmsvc = webservername:使用軟件包文件中的設置將其部署到服務器。 用戶帳戶是具有權限的操作系統級別帳戶。 指定了主機名,但未指定IIS網站名稱(該名稱先前在項目屬性的MSBuild項目文件中指定)。
部署后,我檢查了IIS Web服務器文件,以確保它們具有最新的DLL和web.config文件。
由於現在有2個好的命令(要打包的MSBUILD.exe,要部署的MSDEPLOY.exe),請將它們添加到構建步驟中。 我使用命令行運行程序,並且只輸入了與前面2個步驟相同的命令。
使用這些步驟運行構建時,如果它們成功,則可以直接從git進行自動部署。
現在,每次新代碼合並並推送到git origin / master分支時,它將自動構建和部署開發服務器。
如您所見,這避免了您的原始問題:
問題是當我提交到github並且CI服務器下載並構建它時。 自然,CI服務器上未設置虛擬目錄,因此構建/軟件包失敗。
CI服務器僅生成和打包。 然后將其部署到目標Web服務器。
看看Appveyor。 我們剛剛發布了v2.0,恕我直言,它是WebDeploy的強大替代品。 整個部署過程可以通過CI服務器上的PowerShell編寫腳本,並且有PS掛鈎可自定義過程。
免責聲明:我是Appveyor開發人員。 我不是想在這里做廣告,但是很高興看到它是否對您有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.