Criando um plugin de check-in no TFS 2013

Salve, salve galera….

No nosso dia-a-dia as vezes nos deparamos com situações onde a arquitetura padrão do TFS não atende 100% nossa necessidade e então precisamos estender as funcionalidades e adicionar recursos particulares para aquele cenário.

Hoje vamos ver de maneira bem simples como criar um plugin de check-in para o TFS 2013.

Mas antes de começarmos a colocar a mão na massa o que é um plugin para o TFS ?

Um plugin para o TFS é um assembly (.dll) que tem implementada alguma regra de negócio que queiramos executar e que faz uso das APIs do TFS (implementação essa em C#, VB.NET, etc). Esse assembly pode possuir validações, consultas, criação de work itens e qualquer operação que a API do TFS disponibilize (que a grosso modo é toda operação que realizamos via team explorer ou web access).

Esse plugin é invocado de maneira semelhante a uma trigger, quando executamos determinada operação dentro do TFS essa operação dispara a execução de todos os plugins que correspondem a ela.

Hoje vamos ver um exemplo de um plugin de check-in, quer dizer, toda vez que fizermos um check-in nosso plugin será disparado.

Vamos la ?

A primeira coisa que precisamos fazer é referenciar as bibliotecas do TFS que para esse caso são:

Microsoft.TeamFoundation.Framework.Server.dll ;
Microsoft.TeamFoundatin.Common.dll e
Microsoft.VisualStudio.Services.WebApi.dll.

Feito isso, vamos implementar uma interface chamada ISubscriber , que é por quem o engine do TFS busca quando executa as operações.


namespace MeuPlugin
{
    class MeuPlugin:ISubscriber
    {

         public string Name
         {
               get { throw new NotImplementedException(); }
         }

         public SubscriberPriority Priority
         {
               get { throw new NotImplementedException(); }
         }

         public EventNotificationStatus ProcessEvent(TeamFoundationRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, out int statusCode, out string statusMessage, out Microsoft.TeamFoundation.Common.ExceptionPropertyCollection properties)
         {
              throw new NotImplementedException();
         }

         public Type[] SubscribedTypes()
         {
              throw new NotImplementedException();
         }
}
}

Feito isso vamos começar a dar um cara mais particular para esse plugin alterando o nome dele para ficar mais fácil de rastrearmos caso haja algum problema. Vamos atribuir um nome para o nosso plugin.


public string Name
{
    get { return "MeuPlugin.NomeDoPlugin" ;}
}

Agora vamos dizer para o nosso plugin para qual evento do TFS ele irá responder, no nosso caso o evento de check-in.

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

Pronto, com isso quando fizermos o deploy do nosso plugin ele já responde ao evento de check-in.

Agora vamos começar a incluir nossas regras de negócio nele. Antes disso vamos aplicar o using nas seguintes referências:


using Microsoft.TeamFoundation.Framework.Server;

using Microsoft.TeamFoundation.VersionControl.Server;

Feito isso vamos implementar (finalmente) nossa regra que simplesmente irá olhar o conteúdo sendo submetido e irá verificar se há um comentário, caso o local do arquivo contenha Release no meio.

public EventNotificationStatus ProcessEvent(TeamFoundationRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, out int statusCode, out string statusMessage, out Microsoft.TeamFoundation.Common.ExceptionPropertyCollection properties)
{
     statusCode = 0;
     properties = null;
     statusMessage = string.Empty;

     try
     {
          if(notificationType == NotificationType.DecisionPoint &&
             notificationEventArgs is CheckinNotification)
          {
                  CheckinNotification args = notificationEventArgs as CheckinNotification;

                  if(string.IsNullOrEmpty(args.Comment))
                  {
                       foreach (string item in args.GetSubmittedItems(requestContext))
                       {
                            if(item.ToUpper().Contains("RELEASE"))
                            {
                                 statusMessage = "Check-in nos diretórios de Release precisam de um comentário";

                                 return EventNotificationStatus.ActionDenied;
                            }
                        }
                  }
            }

             return EventNotificationStatus.ActionPermitted;
     }
     catch(Exception ex)
     {
           statusMessage = "Algo deu errado no plugin. " + ex.Message;

           return EventNotificationStatus.ActionDenied;
      }
}

Feito isso, basta compilarmos nossa aplicação e fazermos o deploy dela.

Para fazermos o deploy basta copiarmos as DLLs geradas para o diretório C:\Program Files\Microsoft Team Foundation Server 12.0\Application Tier\Web Services\bin\Plugins. Feito isso o site do IIS do TFS será atualizado e o plugin entrará no ar.

Mas atenção: cuidado ao implementar plugins para o TFS por que podemos afetar sua performance e comprometer nosso servidor, então muita cautela nessa criação.

Gostou das possibilidades que temos em mãos ? Quer implementar recursos que otimizem sua operação ? Entre em contato  e vamos bater um papo.

 
Comments

No comments yet.