I was answering a question related to programmatically creating team build types today and realized there weren’t too many examples on the web. I didn’t see any examples that included all the details I was looking for – for example:
- Adding the solution to be built to the new build type
- Turning on/off test execution
- Turning on/off code analysis
An example containing these details may exist, I just didn’t come across it during my initial search.
So, with that said, I decided to post the main part of the example application I put together to test out some concepts. The items listed above are included in the example code below.
The example code includes two methods:
- CreateBuildType – this method accepts six arguments that can be used to programmatically create a new build type.
- VersionControlItemExists – this is a helper method that determines whether an item already exists in version control.
Although the example below can be used to create a new build type “as is”, there is always room for improvement. For example:
- Add a parameter to specify the default build agent. Currently, the first build agent returned is used as the default when creating the build type.
- Add a parameter to control the exact placement of the build type in version control (a common pattern is used in the example below).
- Throw exceptions instead of displaying message boxes when exceptional conditions arise. The message boxes were used for example purposes only.
With that said, here is the source code…
using System;
using System.Windows.Forms;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Build.Common;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.VersionControl.Common;
private static bool CreateBuildType(string serverName, string teamProject, string buildName, string solutionPath, string dropFolder, bool runTests)
{
// Get a connection to Team Foundation Server
TeamFoundationServer tfServer = TeamFoundationServerFactory.GetServer(serverName, new UICredentialsProvider());
// Get a reference to a build service
IBuildServer buildServer = (IBuildServer)tfServer.GetService(typeof(IBuildServer));
// Get a list of build agents associated with the specified team project
IBuildAgent[] buildAgents = buildServer.QueryBuildAgents(teamProject);
if (buildAgents.Length == 0)
{
MessageBox.Show(
@"The specified Team Project does not have any build agents associated with it. Please create at least one build agent.",
"No Default Build Agent Found",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
// Create the new build type definition
IBuildDefinition buildType = buildServer.CreateBuildDefinition(teamProject);
// Specify the name of the new build type
buildType.Name = buildName;
// Specify where the new build type should be stored in version control
buildType.ConfigurationFolderPath = string.Format(@"$/{0}/TeamBuildTypes/{1}", teamProject, buildName);
// Set the default build agent
buildType.DefaultBuildAgent = buildAgents[0];
// Set the default drop location
buildType.DefaultDropLocation = dropFolder;
if (!VersionControlItemExists(tfServer, buildType.ConfigurationFolderPath))
{
IProjectFile projectFile = buildType.CreateProjectFile();
// Add a new solution to be built to the project
ISolutionToBuild solution = projectFile.AddSolutionToBuild();
// Set the path of the solution to build
solution.SolutionPath = solutionPath;
// Specify whether tests should be ran or not
projectFile.RunTest = runTests;
// Run code analysis if the project is setup to do so
projectFile.RunCodeAnalysis =
CodeAnalysisRunType.Default;
// Save the project file
projectFile.Save(buildType.ConfigurationFolderPath);
// Save the new build type
buildType.Save();
}
else
{
// The specified build type already exists
MessageBox.Show(
"The specified Build Type already exists. Please specify a different Build Type name.",
"Build Type Already Exists",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
return true;
}
private static bool VersionControlItemExists(TeamFoundationServer tfServer, string itemPath)
{
string projectFilePath = VersionControlPath.Combine(itemPath, BuildConstants.ProjectFileName);
return ((VersionControlServer)tfServer.GetService(typeof(VersionControlServer))).ServerItemExists(
projectFilePath, VersionSpec.Latest, DeletedState.NonDeleted, ItemType.File);
}