Utilizando Powershell com TFS/VSTS

A mais ou menos 2 anos atrás, implantando TFS (versão 2013 na ocasião) em um cliente, me vi numa situação onde era necessário realizar diversas tarefas em massa no TFS. O cliente tinha um volume de mais 400 aplicações, e definimos utilizar o modelo "One Team Project to rule them all", com um único Team Project e cada aplicação seria um time dentro desse Team Project. De fato, as aplicações estavam agrupadas por áreas, então tínhamos alguns Team Projects representado as áreas, e os times as aplicações.

Para cada um dos sistemas, iríamos ainda criar builds para branches de desenvolvimento, release, main, etc. E ainda dar acesso a usuarios com perfis de desenvolvedores, testadores, gestores, etc.

No início a adoção foi gradual, então parecia que seria "tranquilo" configurar manualmente todas essas estruturas. Mas não demorou muito para eu perceber que seria muito trabalhoso (para não dizer desumano) e arriscado (muito sucetível a erros) continuar executando manualmente a criação dessas estruturas.

Eis que então fui buscar soluções para automatizar essa tarefa. Eu já tinha experiência com a API do TFS (Client e Server Object Model) via codigo C#. Mas eu pensei em trabalhar com scripts: algo mais rápido de se construir, mais flexível e que é familiar para o pessoal de operações, que depois tomariam conta do ambiente.

Primeiramente fui checar todas as ferramentas de linha de comando do TFS para ver se com elas eu iria atender minhas necessidades. Infelizmente, não. Elas existem desde as primeiras versões do TFS, evoluiram, mas são bem restritas a tarefas administrativas e de gestão de repositórios TFVC. Como o web portal, a parte de agile planning e o conceito de times, veio apenas com TFS 2012, essas ferramentas não evoluiram para contemplar isso (afinal a estratégia era evoluir para REST APIs).

Fui então procurar pela existência de commandlets ou módulos Powershell que pudessem ajudar. Encontrei no TFS PowerTools alguns commandlets, mas todos focados apenas na gestão de repositórios TFVC. No Powertools tem um comando, o TFPT.exe, que até opera em workitems, mas eu precisava de mais.

O próximo a ser investigado foi o PSTFS, muito promissor pelo nome, mas é um projeto de 2009 que nunca mais foi atualizado. Eis que, então, me deparei com um artigo da TechNet do "Hey. Scripting Guy! Blog" e, inspirado nele, resolvi criar um módulo Powershell para atender as minhas necessidades.

No início não tinha nenhuma pretenção que fosse algo genérico e reutilizável, mas as boas práticas de programação me fizeram separar a lógica específica das necessidades do cliente, da logica de iteração com o TFS. Isso deu origem a dois módulos, um do cliente e outro de acesso ao TFS.

Isso tudo começou no TFS 2013, de lá pra cá foram necessários alguns ajustes, devido a mudanças na API com os sucessivos updates e upgrade para o TFS 2015. O módulo foi crescendo e hoje possui funções para trabalhar com repositório (TFVC), grupos e permissões, builds, workitems, times, areas, iterações, board. No início o modulo usava exclusivamente o Object Model do TFS. Não tinha outra alternativa no começo do TFS 2013. Assim que as REST API foram liberadas, comecei a utilizá-las, principalmente com o novo Build do Web Portal. No módulo de segurança, não quis reinventar a roda, reutilizei os comandos "TF.exe security" para permissão no repositório e "TFSSecurity.exe" para todas as outras situações. É um pouco mais lento mas serviu para minhas necessidades.

Vendo o tamanho que o módulo ficou, e acreditando que será útil para mais pessoas, resolvi então compartilhar no GitHub, até dei um nome bonitinho TFSPowershell. Veja a documentação completa aqui.

Hoje, esse módulo está em produção em um TFS 2015.3. Mas funciona com o TFS 2017 e também com o VSTS. Quem quiser contribuir fique a vontade para submeter pull requests.

Além desse meu módulo existe hoje outras três alternativas para quem quer interagir com o TFS via Powershell:

  • TFS modulo do Miodrag Milić: um modulo para TFS 2015 que utiliza exclusivamente REST API. É bem interessante, mas está restrito a REST API, que ainda não contempla todos cenários, principalmente no TFS 2015. Quase nenhuma documentação, mas olhando os scripts é bem simples de se usar;

  • tfscmdlets do Igor Abade: excelente opção. Implementação de várias funções, tanto via Object Model, quanto via REST API. Código muito bem estruturado, é fácil de usar, tem diversas opções de instalação e esta bem documentado. Confesso que se tivesse encontrado esse módulo a dois anos atrás eu estaria usando e contribuindo com ele;

  • Team do Donovan Brown: Donovan Brown é o cara de DevOps da Microsoft, e começou esse ano a criar um módulo Powershell para TFS e VSTS. O projeto está muito no início (primeira release em Janeiro), vai usar exclusivamente a REST API e é compatível apenas com TFS 2017 e VSTS. Mas o que é interessante no módulo dele é que está usando Powershell puro (sem incluir outras dlls, etc), e agora com o Powershell sendo cross-plataforma (com a ajuda do .net core), o módulo dele roda em outras plataformas como Linux e Mac. Ele testa nessas outras plataformas e garante a compatibilidade. Bem promissor.

Espero ter contribuído com quem estiver passando pela mesma situação que passei a anos atrás. Hoje com REST API as coisas estão mais fáceis. Posso interagir com REST API utilizando as ferramentas de minha preferência (python, ruby, node, bash, javascript, java, .net, etc). O cenário é bem mais flexível. Mas ainda sim, quem quiser utilizar Powershell hoje a situação é bem melhor que a dois anos atrás :-)

Gostou do post? Tem algo a acrescentar ou criticar? Conhece alguma outra alternativa de commandlets ou modulos Powershell para TFS? Deixe seu comentário.