Adding custom properties to TFS build templates

To add custom fields into a TFS build template, you need to merge in the following sections:

<Activity>
  <x:Members>
    <x:Property Name="YourProperty" Type="InArgument(x:String)" />
  </x:Members>
 
  <this:Process.Metadata>
    <mtbw:ProcessParameterMetadataCollection>
      <mtbw:ProcessParameterMetadata Category="#400 GroupName" Description="Property Description" DisplayName="Display Name" ParameterName="Parameter Name" />
    </mtbw:ProcessParameterMetadataCollection>
  </this:Process.Metadata>
 
  <Sequence.Variables>
    <Variable x:TypeArguments="x:String" Name="MSBuildProperties" />
  </Sequence.Variables>
  <Sequence DisplayName="Update Build Arguments" mtbwt:BuildTrackingParticipant.Importance="Low">
    <Assign x:TypeArguments="x:String" mtbwt:BuildTrackingParticipant.Importance="None" To="[MSBuildProperties]" Value="[String.Format(&quot;{0} /p:YourProperty=&quot;&quot;{0}&quot;&quot;&quot;, MSBuildProperties, YourProperty.Replace(&quot;\&quot;, &quot;\\&quot;))]" />
  </Sequence>
 
</Activity>

Then update all instances of the <mtbwa:MSBuild /> tags to reference this additional variable, e.g.

<mtbwa:MSBuild CommandLineArguments="[String.Format(&quot;/p:SkipInvalidConfigurations=true {0} {1} &quot;, MSBuildArguments, MSBuildProperties)]" Configuration="[platformConfiguration.Configuration]" DisplayName="Run MSBuild for Project" GenerateVSPropsFile="[True]" MaxProcesses="[If (MSBuildMultiProc, 0, 1)]" OutDir="[BinariesDirectory]" Platform="[platformConfiguration.Platform]" Project="[localBuildProjectItem]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" Targets="[New String() { &quot;Clean&quot; }]" TargetsNotLogged="[New String() {&quot;GetNativeManifest&quot;, &quot;GetCopyToOutputDirectoryItems&quot;, &quot;GetTargetPath&quot;}]" ToolPlatform="[MSBuildPlatform]" Verbosity="[Verbosity]" />
 
<mtbwa:MSBuild CommandLineArguments="[String.Format(&quot;/p:SkipInvalidConfigurations=true {0} {1} &quot;, MSBuildArguments, MSBuildProperties)]" Configuration="[platformConfiguration.Configuration]" DisplayName="Run MSBuild for Project" GenerateVSPropsFile="[True]" LogFileDropLocation="[logFileDropLocation]" MaxProcesses="[If (MSBuildMultiProc, 0, 1)]" OutDir="[outputDirectoryPerProject]" Platform="[platformConfiguration.Platform]" Project="[localProject]" RunCodeAnalysis="[RunCodeAnalysis]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" TargetsNotLogged="[New String() {&quot;GetNativeManifest&quot;, &quot;GetCopyToOutputDirectoryItems&quot;, &quot;GetTargetPath&quot;}]" ToolPlatform="[MSBuildPlatform]" Verbosity="[Verbosity]" />

The results look something like this:

Example of a customized build template

Example of a customized build template

Whilst the replace isn’t strictly necessary, it’s a good habit to get into to avoid getting stung by common things like file-paths later.

Enabling Secure Sockets Layer (SSL) on Team Foundation Server 2010

I recently attempted to enable HTTPS on my Team Foundation Server.

Easy right? Just add a HTTPS binding to the tfs website.

Actually, it’s a bit trickier than that, you see, TFS2010 likes to use your local machine name for internal communications by default. In order to get the web UI to play nicely, you have 2 options.

  1. Add a HTTPS binding for the machine name to the TFS Website too (e.g. https://tfsbox)
  2. Add the tfs binding into the web config (e.g. https://tfs.mydomain.com)

After I got #1 working, I pursued the ideal solution, which was option #2.

To do this, follow these steps:

  1. Open “Application Tier/Web Access/Web/web.config” in the TFS directory
  2. Find the <tfsServers> block
  3. Add in a <clear /> tag to prevent any incorrect or old bindings from being included
  4. Add in your server like so¬†<add name=”https://tfs.mydomain.com/tfs” />

At the end, you should end up with something that looks like this:

1
2
3
4
<tfServers>
    <clear />
    <add name="https://tfs.mydomain.com/tfs" />
</tfServers>

Without this, you’ll keep on getting the error “TFS30063: You are not authorized to access ‘tfs.mydomain.com'” and similar errors everywhere from the Web UI, all the way through to the Change URL screen in the Team Foundation Server Administration Console.

IMPORTANT NOTE: You’ll notice that there was already a commented sample server in the web.config. It’s important that you either ignore this line, or correct it, as it will be missing the trailing /tfs that is required to get everything working.