// This goes with this blog post: http://www.traceofthought.net/2008/01/02/CustomizingTFSTeamBuildBuildNumbers.aspx public class GetBuildNumber : Task { public override bool Execute() { bool result = true; try { ValidateProperties(); string buildNumber = GetLastBuildNumber(); _buildNumber = string.Format("{0}_{1}_{2}.{3}.{4}", BuildType, BaseBuildName, DateTime.Now.ToString("yyyyMMdd"), ChangesetNumber, buildNumber); } catch (Exception e) { result = false; BuildErrorEventArgs eventArgs; eventArgs = new BuildErrorEventArgs ( "", "", BuildEngine.ProjectFileOfTaskNode, BuildEngine.LineNumberOfTaskNode, BuildEngine.ColumnNumberOfTaskNode, 0, 0, "GetBuildNumber failed: " + e.Message, "", "" ); BuildEngine.LogErrorEvent(eventArgs); throw; } return result; } private string GetLastBuildNumber() { string buildNumber = "0"; string[] parts = LastBuildNumber.Split('.'); int number = 0; try { // This logic is dependent on how the build number is formatted // up above in the Execute method. int changeSet = Int32.Parse(parts[parts.Length - 2]); // If same changeset, increment the number. if (changeSet == int.Parse(ChangesetNumber)) { number = int.Parse(parts[parts.Length - 1]); number++; buildNumber = number.ToString(); } } catch { } return buildNumber; } private void ValidateProperties() { if (String.IsNullOrEmpty(ChangesetNumber)) { throw new ArgumentException("BaseBuildName is null"); } } [Output] public string BuildNumber { get { return _buildNumber; } set { _buildNumber = value; } } private string _buildNumber = String.Empty; [Required] public string BaseBuildName { get { return _baseBuildName; } set { _baseBuildName = value; } } private string _baseBuildName; [Required] public string ChangesetNumber { get { return _changesetNumber; } set { _changesetNumber = value; } } private string _changesetNumber; [Required] public string BuildType { get { return _buildType; } set { _buildType = value; } } private string _buildType; public string LastBuildNumber { get { return _lastBuildNumber; } set { _lastBuildNumber = value; } } private string _lastBuildNumber; }