Automatizando a criação de Work Items

Muitas vezes quando trabalhamos com Work Items no TFS realizamos tarefas repetitivas como criar as tarefas para uma determinada atividade. Veja o cenário abaixo:

Perceba que nesse cenário para cada User Story temos a repetição de várias Tasks, para automatizar a criação dessas Tasks vamos codificar um componente que vai ser executado depois do evento save de um Work Item do tipo User Story e vamos criar automaticamente os Work Items do tipo Task

Criando o Projeto

Crie um projeto do tipo Class Library e adicione as seguintes referências

c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\

Microsoft.TeamFoundation.dll

Microsoft.TeamFoundation.Client.dll

Microsoft.TeamFoundation.Common.dll

Microsoft.TeamFoundation.WorkItemTracking.Client.dll

C:\Program Files\Microsoft Team Foundation Server 2010\Application Tier\Web Services\bin\

Microsoft.TeamFoundation.Framework.Server.dll

Microsoft.TeamFoundation.WorkItemTracking.Server.Dataaccesslayer.dll

Agora adicione uma nova classe chamada WorkItemChangedEventHandler.cs

[sourcecode language=”csharp”]
public class WorkItemChangedEventHandler : ISubscriber
{
public string Name
{
get { return "WorkItemChangedEventHandler"; }
}

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

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

return EventNotificationStatus.ActionPermitted;
}

public Type[] SubscribedTypes()
{
return new Type[1] { typeof(WorkItemChangedEvent) };
}
}
[/sourcecode]

Veja que nossa classe está implementando uma interface ISubscriber que possui um método ProcessEvent que será invocado quando um Work Item for criado

Veja abaixo a implementação do método ProcessEvent

[sourcecode language=”csharp”]
public EventNotificationStatus ProcessEvent(
TeamFoundationRequestContext requestContext,
NotificationType notificationType,
object notificationEventArgs,
out int statusCode,
out string statusMessage,
out ExceptionPropertyCollection properties)
{
statusCode = 0;
properties = null;
statusMessage = String.Empty;

try
{
if (notificationType == NotificationType.Notification && notificationEventArgs is WorkItemChangedEvent)
{
WorkItemChangedEvent ev = notificationEventArgs as WorkItemChangedEvent;

// código do work item
int workItemId = ev.CoreFields.IntegerFields[0].NewValue;

if (ev.ChangeType == ChangeTypes.New)
{
if((ev.CoreFields.StringFields[0].Name.Equals("Work Item Type")) && (ev.CoreFields.StringFields[0].NewValue.Equals("User Story")))
{
// responsável pelo WI
string assignTo = string.Empty;
if (!String.IsNullOrEmpty(ev.CoreFields.StringFields[5].NewValue))
assignTo = ev.CoreFields.StringFields[5].NewValue;

// Recupera o projeto especifico
WorkItemStore workItemStore = GetWorkItemStore(requestContext);
Project teamProject = workItemStore.Projects[ev.PortfolioProject];

// cria o tipo de work item
WorkItemType tipoWI = teamProject.WorkItemTypes["Task"];

// cria a relação do work item
WorkItemLinkTypeEnd linkTypeEnd = workItemStore.WorkItemLinkTypes.LinkTypeEnds["Parent"];

// criar os work item do tipo Task
Create(tipoWI, workItemId, linkTypeEnd, "Levantamento de Requisitos", assignTo, "Realizar Levantamento de Requisitos");
Create(tipoWI, workItemId, linkTypeEnd, "Desenvolvimento", assignTo, "Realizar a codificação");
Create(tipoWI, workItemId, linkTypeEnd, "Testes", assignTo, "Executar os testes");
Create(tipoWI, workItemId, linkTypeEnd, "Publicação", assignTo, "Fazer a publicação nos ambientes");

EventLog.WriteEntry("WorkItemChangedEventHandler", "WorkItem created [" + ev.WorkItemTitle + "]");
}
}
}
}
catch (Exception ex)
{
EventLog.WriteEntry("WorkItemChangedEventHandler", "Erro: " + ex.Message);
}

return EventNotificationStatus.ActionPermitted;
}
[/sourcecode]

Deploy do Projeto

Para que o TFS possa chamar esse componente temos que colocar a DLL no seguinte diretório C:\Program Files\Microsoft Team Foundation Server 2010\Application Tier\Web Services\bin\Plugins

TestandoVisual Studio

Agora vamos criar um novo Work Item do tipo Use Story e perceba que as Tasks ja foram criadas automáticamente

Testando Portal do Projeto

Essa solução também funciona quando criamos uma User Story pelo portal do projeto

Download do Projeto

Segue abaixo o código completo para download

WorkItemEvent

Deixe seu comentário, opinião, critica

Aquele abraço!

Sobre Leandro Prado

Leandro Silveira Prado é Premier Field Engineer na Microsoft especializado em Application Lifecycle Management.