How to tell TFS to deploy multiple webapps containing in one solution?
Asked Answered
E

4

16

We have a single solution which contains one webapp project and some accompanying projects. Our TFS 2010 is building this solution every night and deploys the webapp to an IIS server. It runs like a breeze.

In the Process tab of the TFS build definition you can specify the "MSBuild Arguments". This is the value which is set in our build definition (all in one line):

/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> 

This blog post explains the whole setup: http://vishaljoshi.blogspot.com/2010/11/team-build-web-deployment-web-deploy-vs.html.

So far, so good.

Now we have added a second webapp project which we want to be deployed also to the same IIS every night. Unfortunately in this case the setup is not applicable. The TFS deploys only one webapp.

There are others with the same problem out there:

TFS 2010 + MSDeploy when solution has multiple web applications

and

WebDeploy to deploy multiple web sites

Vishal R. Joshi suggests to add some properties to each webapp project. Now the release build will generate the webpackage (zip file) for each webapp project which has the following properties defined:

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

Ok. But how to bring the TFS to deploy each webapp to the IIS? Any other ideas?

Erastian answered 23/6, 2011 at 16:1 Comment(2)
possible duplicate of TFS 2010 + MSDeploy when solution has multiple web applicationsVoltammeter
As you say, others have the same problem, which makes this a duplicate question. Please take some time to read the faq.Voltammeter
G
13

As Vishal describes in the blog article you linked to yourself, all the MSBuild paramaters can be moved inside the csproj. This then means each project can have its own settings.

I have a single solution with 6 projects, 4 class libraries and 2 web (WCF and MVC app). I followed the directive from Vishal's blog and simply moved all my MSBuild paramaters into each csproj file.. 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> 
    ...

Make sure you then remove the paramaters from the build definition.

TFS then deploys as expected.. each project into the correct folder specified as the home directory for each IIS site.

Also its worth noting that you can not include the DeployIisAppPath in the PropertyGroup as above but use the project's properties page to specify this for each build configuration. (Right Click on each project > Properties > Package/Publish Web).

Grapnel answered 1/8, 2011 at 23:7 Comment(1)
Can you please elaborate a bit more on your build definition arguments. Did you select each project to be built or just the solution? Did you specify the folders in the "Source Settings" or did you just set the main folder?Unmoved
A
5

It took me 2 days on this problem. I found a freaking simple solution that works for me.

I created 2 more configurations by using solution's Configuration Manager named DeployMvc1, DeployMvc2. Uncheck build for MVC2 project in DeployMvc1 and uncheck build for MVC1 project in DeployMvc2.

Next, I created 2 build definitions DeployMvc1Build and DeployMvc2Build. The first one listens to MVC1 project with

/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}

The second one listens to MVC2 project with

/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}

Then my problem solved.

Airboat answered 22/3, 2013 at 17:23 Comment(0)
C
1

I have a similar situation where I have a TFSBuild.proj build file and I generate a handful of installers and packages at the end of the build, targetting each of the deployment environments: Development, Test, Staging, and Production. Properties defined in @Matt Shepherd's answer can also be provided directly to the MSBuild task instead of writing them into the individual project files.

<!-- 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>

In this case it is possible to specify the DeployIisAppPath and that value will be written to the deployment package parameters file.

Copperplate answered 13/2, 2012 at 22:0 Comment(0)
B
0

One option would be to write this in a MSBuild task. In this way, you could support multiple IE unlimited webapp deployments. I have yet to port over our existing proj files that do this which is why I haven't ran into this issue. Anyway, here is an article that outlines that process:

Article

Hope that helps

Brookite answered 24/6, 2011 at 19:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.