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;
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>
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>
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>
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
André Dias
André Dias é sócio-fundador da Lambda3, Visual Studio ALM Ranger & MVP e Professional Scrum Developer Trainer pela Scrum.Org. É graduado em Ciência da Computação pela Unip, atua na área de desenvolvimento de softwares a mais de 13 anos e nos últimos anos tem se dedicado as práticas de ALM (Application Lifecycle Management) e de Agilidade. Foi consultor de ALM da Microsoft Brasil, morou na Irlanda onde trabalhou em projetos para o governo Irlandês. No Brasil atuou em dezenas de projetos, muitos deles para o governo e para grandes instituições financeiras. Tem participação ativa na comunidade através da realização de palestras, organização de eventos, seu blog e seu twitter em @AndreDiasBR