*** The custom activity is availabe for download here: http://cid-ee034c9f620cd58d.office.live.com/browse.aspx/BlogSamples?uc=1 ***
Often when creating different types of release builds (e.g. where you build something that should be installed or consumed by other applications) there is a need to check in the results of the build back
to source control. A common build type for us at Inmeta is Library Builds, which we use for common libraries that are shared among several applications. We have created a special build process template
for this scenario that handles versioning, copying of the resulting binaries to a pre-defined folder, optionally merges the assemblies using ILMerge, and finally checking that binaries back to TFS as part of the build.
When it comes to communicating with TFS source control during a build, I find that the most flexible appraoch is to wrap the command line tool tf.exe. This tool has all the functionality you need, and if you choose
to implement custom activities for the same functionality you would need to expose a lot of functionality that is very simple to call using tf.exe. There are two major drawbacks of this approach however:
- You need tf.exe on the build server, e.g. you must install Team Explorer. Generally it is a very good principle to keep the build server as minimal as possible.
- It is not that easy to invoke command line tools in TFS 2010 Build, it is hard to get the syntax and the paths correct.
If you can live with the first drawback, then we can at least reduce the problems of the other drawback by creating a simple custom activity that wraps some of the nitty gritty details of calling tf.exe.
This is a simple activity, but I have found it useful and hopefully some of you will too.
Here is an example of how it looks when it is used in a build process template:
- The property Command is an enum type which just enumerates all possible commands to tf.exe. This makes it easy to select the correct command and stop you from getting syntax errors.
The enum is available as well in the download packages
- You don’t need to know about how tf.exe is called
- There is an IgnoreError boolean property that will ignore any errors if true (default is false)
- The Arguments property is the argument to the tf.exe command. In this case, the resulting command will be tf.exe checkin *.dll /recursive
- WorkingDirectory is mapped to the InvokeProcess.WorkingDirectory. Generally when performing source control operations using tf.exe, you should point the working directory somewhere inside the workspace.
By doing so, you don’t need to bother about spefcifying workspace or collection URL:s.
The custom activity itself is pretty simple, it just wraps the call to InvokeProcess, with the standard output/error logging and error checking:
This activity is very simple, and can definitely be exended. Let me know if you find it useful and if you have any suggestions for improvements.