Tip: Make TFS2012 build logging easier using extension methods in Microsoft.TeamFoundation.Build.Workflow.Activities

December 14, 2012

I’ve been writing a lot of custom Workflow Activities for Team Foundation Server 2012 (TFS2012) Builds lately.  A custom Workflow Activity lets you drop application-specific logic and steps into theout-of-the-box TFS build scripts (aka. “build process templates”).  When you write one of these Activities, you almost always need/want to write to the TFS build log when the build runs.

Turns out that I’ve been writing to the log the hard way.  I had my own utility method that would create a BuildMessage object, populate it, and then call Track() on the CodeActivityContext to put that message into the build script.  It worked but it wasn’t elegant.

public sealed class LogUtility
{
public static void WriteToLog(
CodeActivityContext context,
string message,
BuildMessageImportance importance)
{
var buildInfo =
new BuildInformationRecord();

BuildMessage newBuildMessage = new BuildMessage();

newBuildMessage.Importance = importance;
newBuildMessage.Message = message;

buildInfo.Value = newBuildMessage;

context.Track(buildInfo);  
}       
}

The real, right, and easy way to write to the log is to use the extension methods that are in Microsoft.TeamFoundation.Build.Workflow.Activities.  Drop in a using statement for Microsoft.TeamFoundation.Build.Workflow.Activities and VOILA! the CodeActivityContext object now how TrackBuildMessage(), TrackBuildWarning(), and TrackBuildError().

using System;
using System.Activities;
using System.Collections.Generic;
using System.Linq;
using Microsoft.TeamFoundation.Build.Client;

// this is the magic using statement
// that makes build logging much easier
using Microsoft.TeamFoundation.Build.Workflow.Activities;

namespace Benday.TeamBuild2012.Activities
{
[BuildActivity(HostEnvironmentOption.Agent)]
public sealed class MyCustomActivity : CodeActivity
{
protected override void Execute(
CodeActivityContext context)
{
**context.TrackBuildMessage("This is a message.");
context.TrackBuildWarning("This is a warning.");
context.TrackBuildError("This is an error.");
**        }
}
}

-Ben

-- Want to start doing automated builds but you’re not sure where or how to start?  Need help customizing your build process?  Dreaming of a better life with a streamlined development-to-testing flow using Team Foundation Server Lab Management?  Drop us a line at info@benday.com.

Categories: visual-studio-2012