|
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.
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