Alguns dos pedidos mais frequentes que ouço durante as consultorias que dou, são:

  • Gostaria de fechar um Work Item pai, quando todos os filhos forem fechados;
  • Quando eu atualizar as horas de uma tarefa, eu quero que a User Story ou o PBI mostre as horas restantes consolidadas;
  • Assim que uma atividade filha (task) tiver o seu status alterado para “In Progress” eu gostaria que o pai fosse automaticamente alterado para “In Progress” também.

Uma das formas de atender esses pedidos é utilizar o SDK do TFS assinando eventos de servidor, porém essa abordagem exige um conhecimento avançado do produto para que você possa manipular as APIs de conexão e de work items. Outra forma que também atende essas necessidades, porém de uma maneira muito mais simples, pois ela encapsula toda a manipulação das APIs do TFS, é com a utilização de um plug-in open source chamado TFS Aggregator.

Com o TFS Aggregator, você pode configurar ações para interpretar mudanças em work items e atualizar campos dos próprios work items alterados, campos de work items pais, simplesmente manipulando um único arquivo xml. Vamos conhecê-lo um pouco melhor:

Instalação

O processo de instalação do TFS Aggregator é bastante simples. Basta você fazer o download do plug-in e descompactar o arquivo dentro da pasta de plug-ins do TFS, normalmente no seguinte endereço: C:\Program Files\Microsoft Team Foundation Server 2010\Application Tier\Web Services\bin\Plugins.

Após descompactar o zip, você verá dois arquivos:

  • TFSAggregator.dll: é o plug-in que fará a interpretação dos eventos;
  • AggregatorItems.xml: é o arquivo onde definiremos os eventos que iremos tratar;

pasta plugins tfs

Configuração

O processo de configuração também é bastante simples. Dentro do arquivo XML, você possui um elemento principal chamado AggregatorItems, onde você definirá a URL do seu servidor TFS e depois você criará uma série de elementos do tipo AggregatorItem, onde cada elemento desse tipo representa um regra que o plug-in irá tratar.

O arquivo de configuração, de maneira bastante simplificada, fica da seguinte forma:

<?xml version="1.0" encoding="utf-8"?> 
<AggregatorItems tfsServerUrl="http://tfs2010dev:8080/tfs" >
<AggregatorItem operationType="Numeric" operation="Sum" 
		linkType="Self" workItemType="Task">
	<TargetItem name="Estimated Work"/>
	<SourceItem name="Estimated Dev Work"/>
	<SourceItem name="Estimated Test Work"/>
</AggregatorItem>
</AggregatorItems>

No exemplo acima, temos a configuração do nosso servidor e uma única regra de agregação que monitora todos os work items do tipo Task, soma os valores dos campos Estimated Dev Work e Estimated Test Work e insere no campo Estimated Work.

Obviamente existem cenários bem mais complexos que esse e para conhecer todo o potencial do plug-in, não deixe de visitar a documentação do TFS Aggregator.

Cenários de Utilização

Vamos ver abaixo como o plug-in resolve de forma bastante objetiva algumas das principais dúvidas citadas no início do post:

Cenário 1: Fechar um work item pai quando todos os filhos forem fechados

<AggregatorItem operationType="String" linkType="Parent" linkLevel="1" workItemType="Task">
  <Mappings>
    <Mapping targetValue="Done" inclusive="And">
      <SourceValue>Done</SourceValue>
    </Mapping>
  </Mappings>
  <TargetItem name="State"/>
  <SourceItem name="State"/>
</AggregatorItem>

Cenario 1

Cenário 2: Somar o remaining work de todos os filhos e inserir em um campo do work item pai

<AggregatorItem operation="Sum" linkType="Parent" linkLevel="1" workItemType="Task">
  <TargetItem name="Business Value"/>
  <SourceItem name="Remaining Work"/>
</AggregatorItem>

Cenario 2

Cenário 3: Mudar um PBI para Commited assim que qualquer tarefa tiver seu status como In Progress

<AggregatorItem operationType="String" linkType="Parent" linkLevel="1" workItemType="Task">
  <Mappings>
    <Mapping targetValue="Committed" inclusive="Or">
      <SourceValue>In Progress</SourceValue>        
    </Mapping>
  </Mappings>
  <TargetItem name="State"/>
  <SourceItem name="State"/>
</AggregatorItem>

Cenario 3

Agora, você que já teve que trabalhar com a API do TFS para fazer a mesma coisa deve estar se perguntando: “Por que eu não descobri isso antes?”. Pois é, foi a pergunta que me fiz quando descobri esse plug-in.

Espero que seja útil para vocês.

Até a próxima,
André Dias