Integrando sua aplicação com Work Items do Team Foundation Server 2010

Integrando sua aplicação com Work Items do Team Foundation Server 2010

Quando estamos trabalhando com o Team Foundation Server podemos realizar varias customizações, porém algumas vezes precisamos algo específico como fazer que uma aplicação externa acesse as informações do TFS. Para isso a Microsoft disponibilizou uma API para que possamos se conectar ao TFS e fazer algumas operações com Projects, Work Items, etc.

Hoje vamos ver como podemos fazer com que uma aplicação ASP NET MVC possa criar e pesquisar WorkItems no TFS

Primeiro de tudo temos que adicionar as referências para as seguintes DLLs

  • Microsoft.TeamFoundation.dll
  • Microsoft.TeamFoundation.Client.dll
  • Microsoft.TeamFoundation.WorkItemTracking.Client.dll

Agora vamos criar uma classe chamada TFS2010 e vamos implementar alguns métodos

1 – Criar Work Item

O primeiro método é para criar um novo WorkItem, veja abaixo o código

1 public static NetworkCredential TFSCredentials
2 {
3     get
4     {
5         return new NetworkCredential("TFS_USER", "TFS_PASS", "TFS_DOMAIN");
6     }
7 }
8
9 public static int Create(string collection, string projeto, string tipo, string titulo, string responsavel, string descricao, string prioridade, Attachment anexo)
10 {
11     try
12     {
13         // Conecta ao TFS
14         Uri tfsUri = new Uri(collection);
15
16         // Recupera os projetos daquela Collection passando comom parametro as credenciais
17         using (TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(tfsUri, TFS2010.TFSCredentials))
18         {
19             // Recupera o projeto especifico
20             WorkItemStore workItemStore = tpc.GetService();
21             Project teamProject = workItemStore.Projects[projeto];
22
23             // Criar o novo Work Item conforme o tipo (Bug, Task, etc...)
24             WorkItem wi = new WorkItem(teamProject.WorkItemTypes[tipo]);
25
26             // Titulo do WI
27             wi.Title = titulo;
28
29             // Descriçãa do WI
30             wi.Fields["Description"].Value = descricao;
31
32             // Resposnsavel pelo WI
33             wi.Fields["Assigned To"].Value = responsavel;
34
35             // Prioridade do WI
36             wi.Fields["Priority"].Value = prioridade;
37
38             // Veirfica se o WI possui um anexo
39             if (anexo != null)
40             {
41                 // Adiciona o anexo ao WI
42                 wi.Attachments.Add(anexo);
43             }
44
45             // Salva o WI
46             wi.Save();
47
48             // Retorna o número do WI
49             return wi.Id;
50         }
51     }
52     catch (Exception ex)
53     {
54         throw (ex);
55     }
56 }

O código acima não tem segredo, conectamos no TFS depois recuperamos o projeto em questão e criamos um novo WI para aquele projeto, o código está todo comentado para facilitar o entendimento.

Agora vamos chamar esse método para criar o WI, vamos criar um controller com o nome de ChamadosController que vai ter uma action Novo, veja abaixo.

1 [HttpPost]
2 public ActionResult Novo(IntegracaoTFS2010.Models.WorkItem model)
3 {
4     if (ModelState.IsValid)
5     {
6         int idWorkItem = TFSUtil.TFS2010.Create(
7                             "http://tfs-2010:8080/tfs/DefaultCollection",
8                             "ProjetoCMMI",
9                             model.tipo,
10                             model.titulo,
11                             model.responsavel,
12                             model.descricao,
13                             model.prioridade);
14
15         if (idWorkItem > 0)
16             return RedirectToAction("Index");
17     }
18
19     return View(model);
20 }

Vamos chamar a nossa tela e criar um novo WorkItem

Veja o WorkItem criado no TFS

2 – Listar WorkItem

Agora vamos criar outro método para listar os Work Items que gravamos no TFS, veja abaixo o código

1 public static WorkItemCollection ListWorkItem(string collection, string projeto, string tipo)
2 {
3     try
4     {
5         // Set up a dictionary to pass "User Story" as the value of the type variable.
6         Dictionary variables = new Dictionary();
7
8         Query queryResult;
9
10         // Conecta ao TFS
11         Uri tfsUri = new Uri(collection);
12
13         // Recupera os projetos daquela Collection passando comom parametro as credenciais
14         using (TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(tfsUri, TFS2010.TFSCredentials))
15         {
16             // Recupera o projeto especifico
17             WorkItemStore workItemStore = tpc.GetService();
18
19             // String para criar a query
20             StringBuilder query = new StringBuilder();
21             query.Append(" Select [State], [Title] ");
22             query.Append(" From WorkItems ");
23
24             if (!String.IsNullOrEmpty(tipo))
25             {
26                 query.Append(" Where [Work Item Type] = @Type");
27                 variables.Add("Type", tipo);
28             }
29
30             query.Append(" Order By [State] Asc, [Changed Date] Desc");
31
32             // Cria uma nova query
33             if (!String.IsNullOrEmpty(tipo))
34                 queryResult = new Query(workItemStore, query.ToString(), variables);
35             else
36                 queryResult = new Query(workItemStore, query.ToString());
37
38             // Executa a query
39             WorkItemCollection results = queryResult.RunQuery();
40             return results;
41         }
42     }
43     catch (Exception ex)
44     {
45         throw (ex);
46     }
47 }

Veja que a sintax é do SQL ANSI e também podemos adicionar vários parâmetros na cláusula WHERE e ordenar na cláusula ORDER BY

Agora vamos chamar esse método para listas os WIs, em nosso controller ChamadosController na action Index, veja abaixo.

1 using TFS =  Microsoft.TeamFoundation.WorkItemTracking.Client;
2
3 public ActionResult Index()
4 {
5     TFS.WorkItemCollection listWI = TFSUtil.TFS2010.ListWorkItem(
6                 "http://tfs-2010:8080/tfs/DefaultCollection",
7                 "ProjetoCMMI",
8                 "Task");
9
10     List lst = new List();
11
12     foreach (TFS.WorkItem item in listWI)
13     {
14         Models.WorkItem model = new Models.WorkItem();
15         model.Id = item.Id;
16         model.tipo = item.Type.Name;
17         model.titulo = item.Title;
18         model.responsavel = item.Fields["Assigned To"].Value.ToString();
19         model.descricao = item.Fields["Description"].Value.ToString();
20         model.prioridade = item.Fields["Priority"].Value.ToString();
21         model.DataCriacao = item.CreatedDate;
22         lst.Add(model);
23     }
24
25     return View(lst);
26 }

Vamos chamar a nossa tela de listagem

Fonte de Pesquisa: http://www.leandroprado.com.br/2011/11/integrando-sua-aplicacao-com-o-tfs-2010/