Here is a handy TFS 2013 build activity for getting the last build by build number filter. In this case:
- We get the 4th version node number: we call it the revision number
- We use semantic versioning and some of our branches are “version named” i.e. 1.4.10
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using System.IO;
using System.Text.RegularExpressions;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Build.Workflow;
namespace Alm.BuildActivities
{
[BuildActivity(HostEnvironmentOption.Agent)]
public sealed class GetVersionNamedBranchLastRevisionNumber : CodeActivity
{
#region arguments
[RequiredArgument]
public InArgument<string> BuildDefinitionName { get; set; }
public InArgument<string> CollectionUrl { get; set; }
public InArgument<string> ProjectName { get; set; }
public InArgument<string> VersionNamedBranch { get; set; }
public OutArgument<int> CurrentRevisionNumber { get; set; }
#endregion
protected override void Execute(CodeActivityContext context)
{
#region initialize fields
context.SetValue(this.CurrentRevisionNumber, 0);
string buildDefinitionName = context.GetValue(this.BuildDefinitionName);
string collectionUrl = context.GetValue(this.CollectionUrl);
string projectName = context.GetValue(this.ProjectName);
string versionNamedBranch = context.GetValue(this.VersionNamedBranch);
int currentRevisionNumber = 0;
#endregion
try
{
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri(collectionUrl));
tpc.EnsureAuthenticated();
if (!(tpc == null))
{
var bs = tpc.GetService<IBuildServer>();
var buildDefSpec = bs.CreateBuildDefinitionSpec(projectName, buildDefinitionName);
buildDefSpec.PropertyNameFilters.Add("Name");
buildDefSpec.Options = QueryOptions.None;
var buildDef = bs.QueryBuildDefinitions(buildDefSpec).Definitions.FirstOrDefault();
var buildSpec = bs.CreateBuildDetailSpec(buildDef);
//gets only "stable builds" of the version named branch
buildSpec.BuildNumber = string.Format("*_{0}.?", versionNamedBranch);
buildSpec.QueryDeletedOption = QueryDeletedOption.IncludeDeleted;
buildSpec.MaxBuildsPerDefinition = 1;
//gets last stable build of the version named branch
buildSpec.QueryOrder = BuildQueryOrder.StartTimeDescending;
var buildQuery = bs.QueryBuilds(buildSpec).Builds.FirstOrDefault();
if (buildQuery == null)
{
currentRevisionNumber = 0; //there aren no stable builds of this version named branch
context.SetValue(this.CurrentRevisionNumber, currentRevisionNumber);
}
else
{
var lastStableBuildNumber = buildQuery.BuildNumber;
string currentRevisionNumberString = lastStableBuildNumber
.Substring(lastStableBuildNumber.LastIndexOf(".") + 1);
bool result = Int32.TryParse(currentRevisionNumberString, out currentRevisionNumber);
if (result)
{
context.SetValue(this.CurrentRevisionNumber, currentRevisionNumber);
}
else
{
string text = "ERROR: unable to parse to int the currentRevisionNumberString value:";
throw new Exception(string.Format("{0} {1}.", text, currentRevisionNumberString));
}
}
}
else
{
throw new Exception("ERROR: unable to connect to TFS collection");
}
}
catch (Exception ex)
{
throw new Exception(string.Format("ERROR. Exception message: {0}", ex.Message));
}
}
}
}