Aleksei Poliakov
Aleksei Poliakov

Reputation: 1332

How to manage A LOT of similar configurations in TFS

I have an ASP .Net MVC application with 4 different publishing profiles: dev, test, demo and prod.

These publising profiles are build using the same two steps: NuGet restore followed by an MSBuild. Then, they are deployed to lots of different servers: a few dev servers (one server dev per team), one test server, one demo server and several production servers.

msbuild /p:Configuration="$(Configuration)"
        /p:PlatformTarget="any cpu"
        /p:DeployOnBuild="True"
        /p:DeployTarget="MsDeployPublish"
        /p:MSDeployServiceURL="$(MSDeployServiceURL)"
        /p:DeployIISAppPath="portal"
        /p:CreatePackageOnPublish="False"
        /p:MsDeployPublishMethod="WMSVC"
        /p:AllowUntrustedCertificate="True"
        /p:UserName="Deploy_User_For_TFS"
        /p:Password="P@ssw0rd"
        /p:AutoParameterizationWebConfigConnectionStrings=False
        /p:ExcludeFilesFromDeployment="Cache"

Currently I have 4 TFS Build configurations (one for every publishing profile) and a file where I have all the possible values for MSDeployServiceURL parameter.

There are two issues with this approach:

  1. When we had to add a new parameter AutoParameterizationWebConfigConnectionStrings we had to change it in 4 places instead of one.
  2. We have to have a shared file as the source for the parameters. it is not easy to understand where which value should be copied and people often make mistakes.

So I have two questions:

  1. Is there any way to have a one universal template where I can specify only my parameters Configuration and list of possible MSDeployServiceURLs and have everything else stay the same? Having such a template should fix problem #1.
  2. Is there a way to define a drop-down like variable, where the value could not be typed in by the user, but should be selected from a pre-defined list of values?

Upvotes: 1

Views: 58

Answers (1)

Jacob Maki
Jacob Maki

Reputation: 366

Is there any way to have a one universal template where I can specify only my parameters Configuration and list of possible MSDeployServiceURLs and have everything else stay the same? Having such a template should fix problem #1.

You could simplify such that the release configuration creates a templated publish profile. Then using TFS's release management, you could update the publish profile with the appropriate values. Based on your description, it seems like you are trying to combine both the compilation and the release.

For example, in TFS you could have one build (for example, MyApp-Release) that builds the code in the release configuration. As part of that process, it passes in placeholders for things like the deploy URL. For example, /p:MSDeployServiceURL="$(MSDeployServiceURL)" would be /p:MSDeployServiceURL="__MSDeployServiceURL__".

In the TFS release, you'd have a step that the replaces tokens (if you need one, you can use Colin's ALM Corner Custom Build Tasks) in the publish profile. The replace token task would then update the __MSDeployServiceURL__ with the value from an release environment variable with the same name (minus the underscores). So your release would have a dev, test, demo, and prod environment and for each environment, there would be a variable named MSDeployServerURL in each with a different value and a replace tokens step.

Upvotes: 1

Related Questions