Как сообщить TFS о развертывании нескольких webapps, содержащихся в одном решении?

У нас есть одно решение, которое содержит один проект webapp и некоторые сопутствующие проекты. Наш TFS 2010 строит это решение каждую ночь и развертывает webapp на сервере IIS. Он работает как ветерок.

На вкладке "Процесс" определения сборки TFS вы можете указать "Аргументы MSBuild". Это значение, которое задано в нашем определении сборки (все в одной строке):

/p:DeployOnBuild=True 
/p:DeployTarget=MsDeployPublish 
/p:CreatePackageOnPublish=True 
/p:MSDeployPublishMethod=WMSVC
/p:MSDeployServiceUrl=<service url of IIS> 
/p:DeployIisAppPath="<a website>" 
/p:UserName=<domain>\<user 
/p:Password=<password> 

В этом блоге объясняется вся настройка: http://vishaljoshi.blogspot.com/2010/11/team-build-web-deployment-web-deploy-vs.html.

До сих пор так хорошо.

Теперь мы добавили второй проект webapp, который мы хотим развернуть также в один и тот же IIS каждую ночь. К сожалению, в этом случае установка не применима. TFS развертывает только один webapp.

Есть другие проблемы с такой же проблемой:

TFS 2010 + MSDeploy, когда решение имеет несколько веб-приложений

и

WebDeploy для развертывания нескольких веб-сайтов

Vishal R. Joshi предлагает добавить некоторые свойства в каждый проект webapp. Теперь сборка release будет генерировать webpackage (zip файл) для каждого проекта webapp, который имеет следующие свойства:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DeployOnBuild>True</DeployOnBuild>
    <DeployTarget>Package</DeployTarget>
    <CreatePackageOnPublish>true</CreatePackageOnPublish>
</PropertyGroup>

Ok. Но как привести TFS для развертывания каждого webapp в IIS? Любые другие идеи?

Ответы

Ответ 1

Как пишет Vishal в статье в блоге, которую вы связали с собой, все параметры MSBuild могут быть перемещены внутри csproj. Это значит, что каждый проект может иметь свои собственные настройки.

У меня есть одно решение с 6 проектами, 4 классами и 2 веб-приложениями (WCF и MVC). Я следил за директивой из блога Vishal и просто переместил все мои параметры MSBuild в каждый файл csproj.. i.e.

  <PropertyGroup>
    <DeployOnBuild>True</DeployOnBuild>
    <DeployTarget>MsDeployPublish</DeployTarget>
    <CreatePackageOnPublish>True</CreatePackageOnPublish>
    <MSDeployPublishMethod>InProc</MSDeployPublishMethod>
    <MSDeployServiceUrl>localhost</MSDeployServiceUrl>
    <DeployIisAppPath>Dev.Auzzy\Web</DeployIisAppPath>
    <UserName>Username</UserName>
    <Password>Password</Password> 
    ...

Убедитесь, что вы удалили параметры из определения сборки.

Затем TFS развертывает, как ожидалось. каждый проект в правильную папку, указанную как домашний каталог для каждого сайта IIS.

Также стоит отметить, что вы не можете включить DeployIisAppPath в PropertyGroup, как указано выше, но используйте страницу свойств проекта, чтобы указать это для каждой конфигурации сборки. (Щелкните правой кнопкой мыши по каждому проекту > Свойствa > Пакет/Публиковать веб-сайт).

Ответ 2

Мне потребовалось 2 дня на эту проблему. Я нашел свободное решение, которое работает для меня.

Я создал еще 2 конфигурации с помощью решения Configuration Manager с именем DeployMvc1, DeployMvc2. Снимите флажок build для проекта MVC2 в DeployMvc1 и снимите флажок build для проекта MVC1 в DeployMvc2.

Далее я создал 2 определения сборки DeployMvc1Build и DeployMvc2Build. Первый прослушивает проект MVC1 с помощью

/p:DeployObBuild=true
/p:Deploytarget=MsDeployPublish
/p:Configuration=DeployMvc1
/p:Platform="Any CPU"
/p:MSDeployPublishMethod=WMSvc
/p:MsDeployServiceUrl="https://{server1}:8172/MsDeploy.axd"
/p:DeployIisAppPath="mvc1"
/p:AllowUntrustedCertificate=True
/p:Username="{username}"
/p:Password={password}

Второй прослушивает проект MVC2 с помощью

/p:DeployObBuild=true
/p:Deploytarget=MsDeployPublish
/p:Configuration=DeployMvc2
/p:Platform="Any CPU"
/p:MSDeployPublishMethod=WMSvc
/p:MsDeployServiceUrl="https://{server2}:8172/MsDeploy.axd"
/p:DeployIisAppPath="mvc2"
/p:AllowUntrustedCertificate=True
/p:Username="{username}"
/p:Password={password}

Тогда моя проблема решена.

Ответ 3

У меня есть аналогичная ситуация, когда у меня есть файл сборки TFSBuild.proj, и я создаю несколько инсталляторов и пакетов в конце сборки, нацеливая каждую среду развертывания: разработку, тестирование, постановку и производство. Свойства, определенные в ответе @Matt Shepherd, также могут быть предоставлены непосредственно заданию MSBuild вместо того, чтобы записывать их в отдельные файлы проекта.

<!-- After build -->
<Target Name="AfterCompileSolution">

  <!-- Create SynchWorkflow deployment packages -->
  <CallTarget Targets="PackageSynchWorkflow" />

</Target>

<!-- Build deployment package for each target environment -->
<ItemGroup>
  <BuildMode Include="Development"/>
  <BuildMode Include="Test"/>
  <BuildMode Include="Staging"/>
  <BuildMode Include="Production"/>
</ItemGroup>
<PropertyGroup>
  <PackageLocation>$(OutDir)</PackageLocation>
</PropertyGroup>

<Target Name="PackageSynchWorkflow" Outputs="%(BuildMode.Identity)">
  <Message Text="Building %(BuildMode.Identity)"/>

  <MSBuild Projects="$(SolutionRoot)\SynchWorkflow\SynchWorkflow.csproj"
           Properties="Platform=Any CPU;
                       Configuration=%(BuildMode.Identity);
                       DeployOnBuild=true;
                       DeployTarget=Package;
                       DeployIisAppPath=Default Web Site/SynchWorkflow;
                       OutputPath=$(PackageLocation)\SynchWorkflow.%(BuildMode.Identity)Package;"/>
</Target>

В этом случае можно указать DeployIisAppPath, и это значение будет записано в файл параметров пакета развертывания.

Ответ 4

Один из вариантов - записать это в задаче MSBuild. Таким образом, вы можете поддерживать несколько неограниченных развертываний Webapp без IE. Мне еще предстоит перенести наши существующие файлы proj, которые делают это, поэтому я не столкнулся с этой проблемой. Во всяком случае, вот статья, в которой описывается этот процесс:

Статья

Надеюсь, что поможет