Click here to Skip to main content
15,887,676 members
Articles / Programming Languages / XML

Generate Automated Builds for Source Code from Multiple Branches using Team Foundation Server and Team Builds

Rate me:
Please Sign up or sign in to vote.
4.83/5 (29 votes)
14 Mar 2010CPOL3 min read 64.6K   537   50  
Generate automated builds for source code from multiple branches using Team Foundation Server and Team Builds
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
//using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Build.Client;

namespace Suresh.TeamFoundation.Addins
{
    public partial class ConfigureBuildAgentsForm : Form
    {
        private string TeamFoundationServerName = string.Empty;
        private string TeamProjectName = string.Empty;
        private TeamFoundationServer tfsServer;
        private IBuildServer buildServer;
        public ConfigureBuildAgentsForm(string tfsServerName, string teamProjectName)
        {
            this.TeamFoundationServerName = tfsServerName;
            this.TeamProjectName = teamProjectName;

            InitializeComponent();
        }

        private void ConfigureBuildAgentsForm_Load(object sender, EventArgs e)
        {
            LoadConfigureBuildAgentsForm();
        }

        private void LoadConfigureBuildAgentsForm()
        {
            tfsServer = TeamFoundationServerFactory.GetServer(this.TeamFoundationServerName);
            buildServer = tfsServer.GetService(typeof(IBuildServer)) as IBuildServer;
            IBuildAgent[] buildAgentsAll = buildServer.QueryBuildAgents(this.TeamProjectName);
            lstBoxAgentstoConfigure.DataSource = buildAgentsAll;
            lstBoxAgentstoConfigure.DisplayMember = "Name";
        }

        private bool NoBuildAgentsSelected()
        {
            return lstBoxAgentstoConfigure.SelectedItems.Count <= 0;
        }

        private void btnConfigure_Click(object sender, EventArgs e)
        {
            try
            {
                ConfigureBuildAgents();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception occurred while performing operation - " + ex.Message);
            }
            finally
            {
                this.Close();
            }
        }

        private void ConfigureBuildAgents()
        {
            if (NoBuildAgentsSelected())
                return;

            IBuildAgent[] selectedBuildAgents = new IBuildAgent[lstBoxAgentstoConfigure.SelectedItems.Count];
            for (int iCount = 0; iCount < selectedBuildAgents.Length; iCount++)
            {
                selectedBuildAgents[iCount] = lstBoxAgentstoConfigure.SelectedItems[iCount] as IBuildAgent;
            }

            List<IBuildDefinition> buildDefinitionsToQueue = new List<IBuildDefinition>();
            IdentifyBuildDefinitionToQueue(buildDefinitionsToQueue);

            QueueSelectedBuildDefnsOnSelectedBuildAgents(buildDefinitionsToQueue, selectedBuildAgents);
        }

        private void IdentifyBuildDefinitionToQueue(List<IBuildDefinition>  buildDefinitionsToQueue)
        {
            IBuildDefinition[] allBuildDefinitions = buildServer.QueryBuildDefinitions(this.TeamProjectName);
            foreach (IBuildDefinition buildDefinition in allBuildDefinitions)
            {
                if (IsBuildTasksDefinition(buildDefinition))
                {
                    buildDefinitionsToQueue.Add(buildDefinition);
                }
            }

            foreach (IBuildDefinition buildDefinition in allBuildDefinitions)
            {
                if (IsBuildTargetsDefinition(buildDefinition))
                {
                    buildDefinitionsToQueue.Add(buildDefinition);
                }
            }
        }

        private void QueueSelectedBuildDefnsOnSelectedBuildAgents(List<IBuildDefinition> BuildDefinitionsToQueue, IBuildAgent[] specifiedBuildAgents)
        {
            foreach (IBuildDefinition buildDefinition in BuildDefinitionsToQueue)
                QueueBuildDefinitionOnSpecifiedBuildAgents(buildDefinition, specifiedBuildAgents);
        }

        private static bool IsBuildTargetsDefinition(IBuildDefinition buildDefinition)
        {
            return buildDefinition.Name.Contains(".BuildTargets.");
        }

        private static bool IsBuildTasksDefinition(IBuildDefinition buildDefinition)
        {
            return buildDefinition.Name.Contains(".BuildTasks.");
        }

        private void QueueBuildDefinitionOnSpecifiedBuildAgents(IBuildDefinition buildDefinition, IBuildAgent[] specifiedBuildAgents)
        {
            IBuildRequest buildRequest = buildDefinition.CreateBuildRequest();
            buildRequest.CommandLineArguments = "/p:prmQueueSelfOnAllOtherBuildAgents=false";
            foreach (IBuildAgent buildAgent in specifiedBuildAgents)
            {
                if (buildAgent.Status == AgentStatus.Enabled)
                {
                    buildRequest.BuildAgent = buildAgent;
                    buildServer.QueueBuild(buildRequest);
                    buildAgent.Refresh();
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer PROTEANS SOFTWARE SOLUTIONS LTD.(www.proteans.com)
India India
I am currently working in an outsourced software product development company, PROTEANS SOFTWARE SOLUTIONS LTD.(www.proteans.com) as a Module Lead.

Comments and Discussions