Nella continuous integration uno dei punti fondamentali è quello di correggere il prima possibile una build che fallisce.
Per notificare al team che la build è fallita possiamo creare una activity personalizzata nel workflow o agganciarsi agli event di tfs.
In rete esistono una serie di divertenti implementazioni dal coniglio al razzo.
Nel mio scenario volevo inviare una mail a chi ha eseguito l’archiviazione che ha portato alla rottura della build.
Avevo già parlato in un post precedente di come lavorare con gli event.
Creiamo quindi attraverso i power tools di tfs 2010 all’interno dell’alert explorer un nuova sottoscrizione.
All’interno del nostro web service
public void Notify(string eventXml, string tfsIdentityXml)
{
//Deserializza il messaggio
BuildCompletionEvent2 buildCompletionEvent = Serialization.XMLDeserialize<BuildCompletionEvent2>(eventXml);
//Ottine chi ha scatenato la build
string requestFor = buildCompletionEvent.RequestedFor;
string displayName = GetDisplayName(requestFor);
string mail = GetDisplayName(requestFor);
//TODO:
//Inviare la mail
}
/// <summary>
/// Dal nome del dominio ritorna il nome completo dell'utente
/// Questo metodo viene utilizzato per completare quei campi ad esempio assegnato a che vogliono
/// il nome completo e non lo user di dominio
/// </summary>
/// <param name="domainName">domain\Roberto</param>
/// <returns>Roberto Cappelletti</returns>
public string GetDisplayName(string domainName)
{
TeamFoundationServer tfs = new TeamFoundationServer("url", "credentials");
IGroupSecurityService gss = (IGroupSecurityService)tfs.GetService(typeof(IGroupSecurityService));
Identity identity = gss.ReadIdentity(SearchFactor.AccountName, domainName, QueryMembership.None);
return identity.DisplayName;
}
/// <summary>
/// Dal displayName ritorna l'indirizzo email dell'utente
/// </summary>
/// <param name="domainName">Roberto Cappelletti</param>
/// <returns>roberto.cappelletti[at]elfo[punto]net</returns>
public string GetAddressMail(string displayName)
{
TeamFoundationServer tfs = new TeamFoundationServer("url", "credentials");
IGroupSecurityService gss = (IGroupSecurityService)tfs.GetService(typeof(IGroupSecurityService));
Identity identity = gss.ReadIdentity(SearchFactor.EveryoneApplicationGroup, "Team Foundation Valid Users", QueryMembership.Expanded);
Identity[] identities = gss.ReadIdentities(SearchFactor.Sid, identity.Members, QueryMembership.None);
foreach (Identity iden in identities)
{
if (iden.Type == IdentityType.WindowsUser)
if (string.Equals(iden.DisplayName, displayName))
return iden.MailAddress;
}
return null;
}