Click here to Skip to main content
15,891,136 members
Articles / Programming Languages / C#

Auto-Deployment Using Microsoft Web Deploy on Build Quality Change Event of TFS 2010

Rate me:
Please Sign up or sign in to vote.
5.00/5 (3 votes)
14 Feb 2011CPOL5 min read 44.1K   402   17  
This article explains the auto-deployment of build using Microsoft Web deploy on build quality change event of TFS 2010
using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Diagnostics;
using System.Collections.Generic;

using Microsoft.TeamFoundation.Common;
using Microsoft.TeamFoundation.Build.Server;
using Microsoft.TeamFoundation.Framework.Server;

namespace AutoDeploymentOnBuildQualityChanged
{
    public class BuildQualityChanged : ISubscriber
    {
        public string Name
        {
            get
            {
                return "BuildQualityChangedNotificationEventHandler";
            }
        }

        public SubscriberPriority Priority
        {
            get
            {
                return SubscriberPriority.High;
            }
        }

        public EventNotificationStatus ProcessEvent(TeamFoundationRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, out int statusCode, out string statusMessage, out ExceptionPropertyCollection properties)
        {
            BuildQualityChangedNotificationEvent buildEvent = notificationEventArgs as BuildQualityChangedNotificationEvent;
            if (notificationType == NotificationType.Notification && buildEvent != null && buildEvent.Build.Status == BuildStatus.Succeeded)
            {
                if (buildEvent.NewValue.Equals("Ready for Deployment", StringComparison.OrdinalIgnoreCase))
                {
                    DirectoryInfo directory = new DirectoryInfo(buildEvent.Build.DropLocation);

                    FileInfo[] deployFiles = directory.GetFiles("*.deploy.cmd", SearchOption.AllDirectories);
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(buildEvent.Build.Definition.ProcessParameters);
                    string msDeployParameters = GetMSDeployParameters(doc);
                    if (deployFiles.Length > 0)
                    {
                        ProcessStartInfo processStartInfo = null;
                        for (int count = 0; count < deployFiles.Length; count++)
                        {
                            processStartInfo = new ProcessStartInfo("cmd.exe", @"/C " + deployFiles[count].FullName + msDeployParameters);
                            processStartInfo.CreateNoWindow = false;
                            processStartInfo.UseShellExecute = false;

                            Process process = Process.Start(processStartInfo);
                        }
                    }
                }
            }
            statusCode = 1;
            statusMessage = "Deployed";
            properties = null;
            return EventNotificationStatus.ActionApproved;
        }

        private string GetMSDeployParameters(XmlDocument xmlDoc)
        {
            StringBuilder msDeployParameters = new StringBuilder(@" /Y");

            string[] msBuildArgumentsArr = GetMSBuildArguments(xmlDoc);
            if (msBuildArgumentsArr != null && msBuildArgumentsArr.Length > 0)
            {
                for (int count = 0; count < msBuildArgumentsArr.Length; count++)
                {
                    string[] msBuildArgsKeyValueArr = msBuildArgumentsArr[count].Split('=');
                    if (msBuildArgsKeyValueArr.Length > 1)
                    {
                        if (msBuildArgsKeyValueArr[0].Equals("MsDeployServiceUrl", StringComparison.OrdinalIgnoreCase))
                        {
                            msDeployParameters.Append(@" /M:" + msBuildArgsKeyValueArr[1]);
                        }
                        if (msBuildArgsKeyValueArr[0].Equals("UserName", StringComparison.OrdinalIgnoreCase))
                        {
                            msDeployParameters.Append(@" /U:" + msBuildArgsKeyValueArr[1]);
                        }
                        if (msBuildArgsKeyValueArr[0].Equals("Password", StringComparison.OrdinalIgnoreCase))
                        {
                            msDeployParameters.Append(@" /P:" + msBuildArgsKeyValueArr[1]);
                        }
                    }
                }
            }
            return msDeployParameters.ToString();
        }

        private string[] GetMSBuildArguments(XmlDocument xmlDoc)
        {
            string[] msBuildArgumentsArr = null;
            string msBuildArguments = string.Empty;
            XmlNode msBuildArgumentNode = GetMSBuildArgumentNode(xmlDoc);
            if (msBuildArgumentNode != null)
            {
                msBuildArguments = msBuildArgumentNode.InnerText;
                if (!string.IsNullOrEmpty(msBuildArguments))
                {
                    msBuildArgumentsArr = msBuildArguments.Split(new string[] { "/p:" }, StringSplitOptions.RemoveEmptyEntries);
                }
            }
            return msBuildArgumentsArr;
        }

        private XmlNode GetMSBuildArgumentNode(XmlDocument xmlDoc)
        {
            XmlNode msBuildArgumentNode = null;
            XmlNodeList xmlNodeList = xmlDoc.GetElementsByTagName("String", @"http://schemas.microsoft.com/winfx/2006/xaml");
            if (xmlNodeList.Count > 0)
            {
                foreach (XmlNode xmlNode in xmlNodeList)
                {
                    XmlNode attributeNode = xmlNode.Attributes.GetNamedItem("Key", @"http://schemas.microsoft.com/winfx/2006/xaml");
                    if (attributeNode.Value.Equals("MSBuildArguments", StringComparison.OrdinalIgnoreCase))
                    {
                        msBuildArgumentNode = xmlNode;
                        break;
                    }
                }
            }
            return msBuildArgumentNode;
        }

        public Type[] SubscribedTypes()
        {
            return new Type[1] { typeof(BuildQualityChangedNotificationEvent) };
        }
    }
}

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
Software Developer
India India
I am a Microsoft technology enthusiast having experience on various flavors of Microsoft Technologies which includes ASP.Net, Winforms to Silverlight, WPF.

I hold MCTS Certification on .Net 2.0 and Silverlight 4.0

Comments and Discussions