Customizando WorkItem no TFS 2010

Depois das festas de final de ano estou começando o ano a todo o vapor, nesses primeiros dias do ano estou estudando TFS – Team Foundation Server 2010 e fui designado a fazer uma customização do status nos WorkItems.

O problema?

Estamos inciando um projeto segundo o padrão Agile, porém esse padrão para cada WorkItem trabalha com os status Active e Resolved e o gerente de projeto queria os mesmos status do CMMI que é Proposed, Active, Resolved e Close.

A solução?

Customizar os workflow de status do Agile baseado no CMMI.

Passo 1

Primeiro de tudo temos que baixar o Team Foundation Server Integration Tools que pode ser encontrado aqui esse plugin serve para nos auxiliar na customização

Passo 2

Depois de instaldo o plugin, vamos exportar o work item do tipo Task para alterar seu workflow, entre em Tools -> Process Editor -> WorkItem Types -> Export WIT

Selecione a collection

Selecione o projeto

Clique em OK e escolha o local para salvar

Passo3

Vamos alterar o workflow, é possivel realizar essa alteração visualmente com o plugin que instalamos no VS, porém depois de alguns testes optei por fazer as alterações direto no arquivo XML

Abra o arquivo Task.xml em um editor (notepad) e procure pela tag (linha 138) veja que temos somente dois states (Active e Resolved) vamos adicionar mais dois states um chamado Proposed e outro chamado Resolved

[sourcecode language=”xml”]
<STATES>
<STATE value="Proposed">
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ClosedDate">
<EMPTY />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ClosedBy">
<ALLOWEXISTINGVALUE />
<EMPTY />
</FIELD>
</FIELDS>
</STATE>
<STATE value="Active">
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ClosedDate">
<EMPTY />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ClosedBy">
<ALLOWEXISTINGVALUE />
<EMPTY />
</FIELD>
</FIELDS>
</STATE>
<STATE value="Resolved">
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ClosedDate">
<EMPTY />
</FIELD>
<FIELD refname="System.AssignedTo">
<ALLOWEXISTINGVALUE />
<REQUIRED />
</FIELD>
</FIELDS>
</STATE>
<STATE value="Closed">
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ClosedBy">
<ALLOWEXISTINGVALUE />
<REQUIRED />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ClosedDate">
<REQUIRED />
</FIELD>
</FIELDS>
</STATE>
</STATES>
[/sourcecode]

Agora temos que definir as transactions entre os states conforme a figura abaixo

Transaction 1 – New to Proposed

[sourcecode language=”xml”]
<TRANSITION from="" to="Proposed">
<REASONS>
<DEFAULTREASON value="New" />
</REASONS>
<FIELDS>
<FIELD refname="System.AssignedTo">
<COPY from="currentuser" />
</FIELD>
</FIELDS>
</TRANSITION>
[/sourcecode]

Transaction 2 – Proposed to Active

[sourcecode language=”xml”]
<TRANSITION from="Proposed" to="Active">
<REASONS>
<REASON value="Investigate" />
<DEFAULTREASON value="Accepted" />
</REASONS>
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
<SERVERDEFAULT from="clock" />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
<ALLOWEXISTINGVALUE />
<COPY from="currentuser" />
<VALIDUSER />
</FIELD>
</FIELDS>
</TRANSITION>
[/sourcecode]

Transaction 3 – Active to Proposed

[sourcecode language=”xml”]
<TRANSITION from="Active" to="Proposed">
<REASONS>
<DEFAULTREASON value="Investigation Complete" />
</REASONS>
</TRANSITION>
[/sourcecode]

Transaction 4 – Proposed to Closed

[sourcecode language=”xml”]
<TRANSITION from="Proposed" to="Closed">
<REASONS>
<DEFAULTREASON value="Rejected" />
</REASONS>
</TRANSITION>
[/sourcecode]

Transaction 5 – Active to Resolved

[sourcecode language=”xml”]
<TRANSITION from="Active" to="Resolved">
<REASONS>
<DEFAULTREASON value="Complete and Requires Review / Test" />
</REASONS>
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
<READONLY />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
<ALLOWEXISTINGVALUE />
<READONLY />
</FIELD>
</FIELDS>
</TRANSITION>
[/sourcecode]

Transaction 6 – Resolved to Active

[sourcecode language=”xml”]
<TRANSITION from="Resolved" to="Active">
<REASONS>
<DEFAULTREASON value="Review/Test Failed" />
</REASONS>
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
<ALLOWEXISTINGVALUE />
<COPY from="currentuser" />
<VALIDUSER />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
<SERVERDEFAULT from="clock" />
</FIELD>
</FIELDS>
</TRANSITION>
[/sourcecode]

Transaction 7 – Resolved to Closed

[sourcecode language=”xml”]
<TRANSITION from="Resolved" to="Closed">
<REASONS>
<DEFAULTREASON value="Review / Test Passed" />
</REASONS>
<FIELDS>
<FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
<READONLY />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
<ALLOWEXISTINGVALUE />
<READONLY />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ClosedDate">
<SERVERDEFAULT from="clock" />
</FIELD>
<FIELD refname="Microsoft.VSTS.Common.ClosedBy">
<ALLOWEXISTINGVALUE />
<COPY from="currentuser" />
<VALIDUSER />
<REQUIRED />
</FIELD>
</FIELDS>
<ACTIONS>
<ACTION value="Microsoft.VSTS.Actions.Checkin" />
</ACTIONS>
</TRANSITION>
[/sourcecode]

Veja o resultado final do nosso WorkFlow

Passo 4

Depois de alterado nosso workflow, vamos importar nosso arquivo XML para o TFS, clique em Tools -> Process Editor -> Work Item Types -> Import WIT

Selecione o arquivo que customizamos e selecione o projeto que deseja alterar o workflow

Passo 5

Vamos fazer um teste criando um novo Work Item do tipo TASK para ver o resultado do nosso novo workflow, veja abaixo as imagens com todo o workflow customizado

Qualquer dúvida, opinião, reclamação mande seu comentário!

Um Abraço!

Sobre Leandro Prado

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