簡體   English   中英

使用msdeploy部署MVC站點,包括來自CI服務器的IIS設置(沒有虛擬目錄設置)

[英]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。

我有類似的工具,並且可以自動構建和部署:

  • git回購
  • vs 2010,asp.net mvc 3
  • 團隊精神7.1
  • msbuild
  • msdeploy

我將構建,打包和部署步驟分開。 我不使用msdeploy xml文件,但在命令行上執行相同的操作。

這些是我的步驟:

步驟1:編輯Visual Studio項目屬性

右鍵單擊“ MyAppName”項目->“屬性...”,然后單擊“打包/發布Web”選項卡...

  • 配置:活動(調試)-這意味着“調試”配置在VS中處於活動狀態,並且您正在對其進行編輯。 “調試”和“發布”配置均可選擇和獨立編輯。
  • Web部署程序包設置-選中“將部署程序包創建為zip文件”。 我們需要ZIP文件,以便以后可以單獨部署。
  • IIS網站/應用程序名稱-必須與目標服務器上的IIS網站條目匹配。 我在路徑后沒有應用名稱的情況下使用“ MyAppName /”,因為我是在IIS中手動創建的。 這就是它在Web服務器配置上的外觀。

我第一次手動創建IIS網站(也許您可以自動化,但我沒有)。 使用MSDeploy時,它將把您的應用程序推送到匹配的網站名稱-您不必對任何目標文件夾路徑或任何內容進行硬編碼。

將其保存在您的項目中,並確保將所做的更改檢入到Git中(按原點/主鍵)。 當CI服務器運行構建步驟時,將從設置控制中撤消那些設置。

步驟2:在TeamCity配置中添加構建步驟

我編輯構建步驟,並添加第二個構建步驟,以使用msbuild直接構建MyAppName.sln。 您可以根據需要進行修改,因為您可能已經以某種方式進行了修改。

步驟3:通過安裝Microsoft Visual Studio 2010 Shell(集成)可再發行組件包來修復生成錯誤

基本上,我們需要在構建服務器上安裝VS,手動復制文件,或者安裝Microsoft Visual Studio 2010 Shell(集成)可再發行組件包

在生成服務器上找不到Microsoft.WebApplication.targets。 您有什么解決方案?

這將使它得以構建。 仍然沒有部署到服務器。

步驟5:安裝MS Web部署工具

我在這里獲取Web部署工具並進行安裝。 重新啟動后,TeamCity登錄名出現404錯誤。 事實證明,Web Deploy具有監聽端口80的服務,但TeamCity Tomcat服務器也監聽。 短期而言,我將在控制面板中停止Web Deploy Web服務,然后啟動TeamCity Web服務。 Web部署代理服務的目的是接受其他服務器對該服務器的請求。 我們不需要這樣做,因為TeamCity服務器將充當客戶端,並部署到其他Web服務器。

Web部署工具也必須安裝在目標Web服務器上。 我在這里不做過多介紹,但是您必須將服務也配置為偵聽,因此,當您運行Deployment命令時,它將接受該命令並安裝在服務器上。 對於服務器,我設置了一個名為“ webdeploy”的新帳戶,並具有安裝許可。

步驟6:創建一個MSBuild命令來打包Web項目

我為打包和部署執行單獨的步驟。 如果需要,這將允許您構建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命令中引用該軟件包文件。

步驟7:創建Web Deploy命令以部署項目##

"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文件。

步驟8:從TeamCity構建步驟調用MSDEPLOY

由於現在有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM