Universidade de Brasília Faculdade do UnB Gama Engenharia de Laboratório LAPPIS

Projeto: Evolução do Portal do Software Público Brasileiro ­ pesquisa e desenvolvimento para uma nova geração integrada de plataformas abertas e colaborativas

Brasília, 30 de janeiro de 2014.

Relatório sobre a avaliação de ambientes de controle de versão de código­fonte e gestão de projetos de software

Sobre este documento

Este documento refere­se ao parecer técnico da equipe de Engenharia de Software, da Faculdade UnB Gama, da Universidade de Brasília, do projeto para a Evolução do Portal do Software Público Brasileiro, sobre os ambientes de controle de versão de código­fonte e gestão de projeto de software que foram testados e homologados pela UnB para serem disponibilizados como os ambientes iniciais para o denominado "versionamento.gov.br".

O público­alvo para a leitura desde documento é a equipe técnica da SLTI do Ministério do Planejamento e Gestão, bem como a comunidade software livre e interessados na evolução do Software Público Brasileiro.

Autores do documento

● Alexandre Barbosa, Athos Ribeiro, Lucas Kanashiro, Luiz Matos, Matheus Faria e Paulo Meirelles.

Revisores

● Alex Campelo, Arthur Del Espote, Camila Ferreira, David Carlos, Fabio Teixeira, Gustavo Jaruga e Luciano Prestes. 1. Introdução

Um sistema de controle de versão, ou versionamento, ou, do inglês, VCS ( system), ou ainda, mais comumente chamado, SCM ( management) é um software para gerenciar diferentes versões no desenvolvimento de um documento, seja esse documento um código­fonte ou um texto em linguagem natural. Esses sistemas são comumente utilizados no desenvolvimento de software para controlar as diferentes versões, ou seja, histórico e desenvolvimento, dos códigos­fontes e também da documentação, geralmente técnica, associada.

Quando estamos espeficamente trantando de um SCM, estamos abordando sistemas como CVS, SVN (Subversion), , e Bazaar, que são os mais conhecidos e utilizados hoje.

● O CVS corresponde a uma primeira geração deste tipo de sistema, que, apesar de ainda alguns projeto usarem, a maioria migrou para as novas gerações, em particular, para o SVN, que pode ser considerada uma segunda geração e foi um grande avanço em relação ao CVS.

● O SVN ainda é bastante utilizado, incluso pelos projetos atualmente hospedados no Portal do Software Público Brasileiro. Ele é estável, rápido e versátil, por exemplo, ao proporcionar as mesclas (merges) de um mesmo arquivo editado por diferentes pessoas. Entretanto, a maioria das comunidades de software livre já migraram para a terceiro geração de SCM, em especial, para o Git.

● O Git é o SCM que melhor representa os sistemas de controle de versão "descentralizados", ou seja, o que podemos denominar de terceiro geração. Ele foi desenvolvido originalmente por Linus Torvalds; é usado no kernel do , ruby on rails e outros; e é considerado o mais rápido para repositórios grandes. Essa terceira geração SCMs contém várias características e funcionalidades vantajosas em relação ao SVN e CVS, entre elas:

○ Mais fácil realizar mesclas (merges). ○ Mais fácil manter versões "experimentais" do código (branches). ○ Mais fácil incorporar alterações de colaboradores fora da equipe principal. ○ Mais fácil “escolher arroz” (“cherry picking”). ○ Melhor manutenção do histórico. ○ Cada desenvolvedor tem uma cópia completa do repositório em sua máquina local. ○ “Commits” (a gravação das alterações) são realizados localmente, guardando histórico individual. ○ Uma mesma alteração pode ser mesclada múltiplas vezes. ○ A cada operação de mescla, a operação é registrada como um único commit, mas os commits individuais que a compõe continuam no histórico como “sub­commits”. ○ Desenvolvedores podem trabalhar sem acesso de escrita ao repositório principal.

● Entre os SCM da terceira geração, temos o Bazaar, que foi desenvolvido pela Canonical (empresa que mantém o GNU/Linux Ubuntu). A Canonical usa o Baazar em grandes projetos como Launchpad e o Ubuntu. O Baazar se apresenta como mais flexível em relação ao Git, mas não foi isso que se mostrou na prática, de acordo com a adesão ao Git.

● Ainda, dentro dessa terceira geração, podemos citar o Mercurial, desenvolvido independentemente. É usado por projetos como OpenSolaris e OpenJDK. Apresenta­se como de boa performance, boas funcionalidades e com comando mais simples que o Git, por exemplo. Entretanto, não é tão disseminado quando o Git e o próprio Bazaar.

Um SCM descentralizado é fundamental para o desenvolvimento colaborativo, dado que com tal ferramenta é possível que diferentes desenvolvedores trabalhem com facilidade com o mesmo código­fonte de forma simultânea, o que não acontece com tanta facilidade com SCM centralizado, como o CVS e SVN, dado que nesses, o código com o qual os desenvolvedores trabalham se localiza em um único lugar, gerando diversos conflitos, o que pode ocasionar a necessidade de alocar um, ou as vezes um grupo de desenvolvedores competentes para resolvê­los.

Dentre os SCM de terceira geração mais confiáveis, optou­se por utilizar o Git, dado que o mesmo, atualmente, é extremamente eficiente quanto à performance quando comparado aos demais. Outro fato que favorece a escolha de Git é que este é o SCM utilizado pela grande maioria dos projetos de Software Livre iniciados nos últimos anos, como o kernel Linux, projetos da Mozilla como o FirefoxOS e o pŕoprio Firefox, tornando o Git uma ferramenta amplamente testada por profissionais competentes em diferentes projetos e empresas ao redor do mundo. Neste contexto, não recomendamos, além de mantermos o legado dos projetos do Software Público Brasileiro que já usam o SVN, proporcionar o suporte aos outros SCMs.

Como consequência dos SCM, surgiu um tipo de plataforma, conhecida como "Forge", para gerenciar os SCMs de uma maneira visual e integrada com outras ferramentas pertinentes ao contexto do controle de versão e desenvolvimento de código (como lista de e­mails, wikis, serviços de armazenamento e download de arquivos e sistemas de acompanhamento e relato de bugs e novas funcionalidades). Este nome deriva­se das primeiras plataformas Forge mais conhecidas e usadas, como o SourceForge.

Em suma, um Forge é uma plataforma de colaboração que permite o desenvolvimento colaborativo de software através da Internet. Uma plataforma Forge agrega um conjunto de aplicações com interfaces Web integrados, e geralmente hospeda vários projetos independentes. Os desenvolvedores de software que estiverem inscritos como contribuidores para os projetos hospedados pode então usar as diversas ferramentas de gerenciamento de projetos e ferramentas de desenvolvimento de software. Entre as plataformas Forge mais usada e disponíveis na Internet, temos:

● Sourceforge, GForge e NovaForge: ○ Hospedagem de projetos com CVS, SVN, Git, Bazaar e Mercurial ○ O código­fonte dessas plataformas estão disponíveis, com ressalvas ● GitHub: ○ Hospedagem de projetos com Git ○ Usado pelo Ruby on Rails e Kernel do Linux (como espelho criado pelo Linus Torvalds) ○ Não é livre ● Launchpad: ○ Hospedagem de projetos com Bazaar ○ Usado pelo Ubuntu e outros ○ Pode funcionar como “meta­hospedagem” ○ Software livre

Dentre as plataformas Forge para Git selecionadas pela equipe da SLTI para o ambiente do "versionamento.gov.br", e corroboradas pela equipe da UnB, estão o GitLab, Gitorious e RhodeCode. Iremos detalhá­las e descrevê­las em nossas avaliações, na próxima seção deste documento.

Diferentemente de uma plataforma Forge, temos os sistemas de gerenciamento de projetos, responsáveis por automatizar o controle de tempo, escopo e custo de um projeto. Ele permite que todos os envolvidos no projeto (stakeholders) tenham uma visão transparente do que está ocorrendo no projeto, desde o cronograma a ser cumprido, entre outros, além de manter uma interface de comunicação entre os envolvidos no projeto.

Os de gerenciamento de projeto mais completos são capazes de manter a documentação de um projeto, realizar o planejamento e controle de um cronograma do projeto, estimar e controlar custos de cada etapa, definir papéis da equipe, manter uma comunicação entre a equipe, entre outras. Geralmente, esses softwares seguem uma metodologia de trabalho (PMBOK, Cobit, Scrum, entre outros), e através de extensões alguns softwares podem abordar várias dessas metodologias no mesmo ambiente.

Esses sistemas são bastante utilizados em projetos de software, pois muitas das ferramentas disponibilizadas possuem integração com sistemas de controle de versão (Git e SVN) e de mudanças (Bugzilla, Mantis, etc) que são amplamente utilizadas no contexto de projetos de software. A equipe da SLTI/MPOG selecionou e vem usando o . A UnB também corrobora a escolha do mesmo como o sistema de gestão de projetos mais indicado, atualmente, para compor o ambiente do "versionamento.gov.br". Na seção 3 deste documento, apresentamos nossa avaliação sobre o Redmine. 2. Plataformas Forge para Sistema de Controle de Versão Git

A. Gitlab

Instalação

Documentação sobre a instalação do Gitlab pode ser facilmente encontrada para sistemas GNU/Linux. Passos para instalação feitos pela equipe da UnB estão disponíveis em: https://www.participa.br/softwarepublico/desenvolvimento/instalacao­de­ferramentas­para­os­a mbientes­de­homologacao/instalacao­e­configuracao­do­gitlab.

Descrição Geral

Gitlab é um software livre de colaboração de código online que utiliza a ferramenta de gerência de código­fonte Git. O Gitlab disponibiliza uma interface para o gerenciamento de códigos, rastreamento e estado de problemas, uma wiki interna, gerenciamento de grupos e de revisão de códgio (code review) e mescla de código (merge requests) que pode auxiliar em grande parte projetos com muitos integrantes ou abertos.

O ambiente proporciona ainda diversas ferramentas de usabilidade para manter seus usuários sempre atentos aos eventos relacionados aos seus projetos, através de feeds, e formas bem diretas de se observar mudanças em códigos de uma versão para outra. Há também uma forma de se observar, graficamente, as atividades dos membros dos projetos e os estados das diversas branches que o Git permite criar.

Funcionalidades

● Editor web ● Notificações globais e por projeto ● Branches e gráficos de branches ● Pesquisa no código ● Feeds de atividades por projeto ● Administração de membros e projetos ● Rastreamento de problemas ● Merge Request ● Merge automático ● Wiki ● Revisão de código ● Acesso ao código fonte ● Mural do projeto ● Integração com o Redmine B. Gitorious

Instalação

O Gitorious utiliza Apache, Ruby e Rails. Possui documentação desatualizada quanto à instalação, que existe apenas para ambientes *nix, OSX e Solaris. Existe também um instalador automático para o CentOS, uma distribuição GNU/Linux, permitindo uma instalação rápida e simples. A aplicação está disponível sob a licença GPL v3. Passos para instalação (desatualizado): https://gitorious.org/gitorious/pages/Installation Passos para instalador automático (centOS): http://getgitorious.com/installer

Em suma, o Gitorious tem forte acoplamento de dependências com a distribuição GNU/Linux centOS, como documentado em nossa instalação: https://www.participa.br/softwarepublico/desenvolvimento/instalacao­de­ferramentas­para­os­a mbientes­de­homologacao/instalacao­e­configuracao­do­gitorious.

Descrição Geral

O Gitorious é um software livre de colaboração de código que serve de interface web para a ferramenta de gerência de código­fonte Git. Possui um sistema de mensagem interno para a comunicação e notificação entre membros, assim como feed de notícias e de atividades. O Gitorious permite o gerenciamento de equipes. Seus projetos possuem uma wiki interna, assim como a funcionalidade de revisão de códgio e merge requests, o que permite trabalhar com projetos muito grandes ou abertos com facilidade.

Funcionalidades

● Sistema de mensagens ● Wikis ● Revisão de código ● Merge request ● Acesso ao código fonte ● Feeds de atividade e notícias ● Mural do projeto ● Administração de membros e projetos C. RhodeCode

O software é distribuido sob 3 licenças diferentes, são elas:

● GPLv3 ● Rhodecode Business Source License ● Rhodecode Commercial License

Na última, em seu item 2.7 lê­se:

2.7 User Limit Licensee may not exceed the total amount of active users of USER_LIMIT managed by The Software on all Licensee’s Website[s] and Server[s]. To increase that limit a new license can be bought at https://rhodecode.com.

De modo que as licenças Rhodecode não são livres, sendo assim, a ferramenta não foi homologada pela equipe da UnB.

3. Sistemas de Gestão de Projetos

A. Redmine

Instalação

O Redmine utiliza a plataforma Ruby on Rails 3.2.x e pode ser instalado utilizando diversos bancos de dados como MySQL, PostgreSQL ou SQLServer. Apesar de poder ser instalado em diversos sistemas operacionais, como GNU/Linux, FreeBSD e Windows, recomenda­se que seja instalado em sistemas Linux, onde se encontra maior documentação sobre a sua instalação. O processo de instalação feito pela equipe da UnB foi documentado e encontra­se no seguinte endereço: https://www.participa.br/softwarepublico/desenvolvimento/instalacao­de­ferramentas­para­os­a mbientes­de­homologacao/instalacao­e­configuracao­do­redmine

Descrição Geral

O Redmine é uma aplicação web de gerenciamento de projetos que disponibiliza diversas ferramentas para auxiliar a gestão e manutenção de um projeto. Com ele é possível ter uma visão geral do andamento dos projetos, os estados de suas tarefas e seus problemas, sendo também possível visualizar a produção de documentos do projeto e o estado em que os mesmos se encontram. A ferramenta é customizável, de forma a se adaptar à diversos modelos de gestão de projetos. O Redmine permite a associação entre um projeto e a um SCM, bem como uma wiki interna para melhor documentar as necessidades especificas do projeto de forma fácil e rápida de serem visualizadas. A ferramenta é bem documentada e possui comunidade ativa, facilitando assim a correção de possíveis bugs e desenvolvimento de novas funcionalidades. O Redmine está licenciado sob a GNU General Public License v2 (GPL)

Funcionalidades

● Suporte a múltiplos projetos ● Acesso flexível baseado em papéis ● Sistema de rastreamento de problemas (issue tracking) ● Gráficos Gantt e calendário de tarefas ● Gerenciamento de notícias, documentos e arquivos ● Feed e notificações por e­mail ● Wikis por projeto ● Fóruns por projeto ● Rastreamento de tempo (time tracking) ● Campos custumizáveis para problemas, entradas de tempo, projetos, usuários ● Integração com SCM ( SVN, CVS, Git, Mercurial, Bazaar e Darcs) ● Criação de problemas (issues) via e­mail ● Suporte a internacionalização (multi­linguagens) ● Suporte a múltiplos banco de dados

Plugins testados:

● Redmine Backlogs A plugin for agile teams

Elaborado para facilitar o gerenciamento do trabalho de times de desenvolvimento ágeis, disponibilizando as seguintes funcionalidades:

➔ Ordenação de histórias de usuários em seus backlogs de produto e de iteração ➔ Realiza o monitoramento dos story points para cada uma das histórias de usuários ➔ Apresenta gráfico de burndown para acompanhamento do progresso do projeto ➔ Acompanhamento de tarefas através do quadro de tarefas de iteração ➔ Produz cartões de tarefas para serem manipulados no quadro de tarefas ➔ Acompanhar os impedimentos de cada iteração

O plugin está em constante evolução (comunidade ativa), as funcionalidades acima são as princiṕais, apesar de estarem planejando o novas features.

● DMSF Document Management System Features DMSF é um plugin de Sistema de Gestão de Documentos, e destina­se a substituir o atual módulo Documentos do Redmine. Suas principais funcionalidades:

➔ Estrutura de diretórios ➔ Versionamento de documentos / revisão do histórico ➔ Notificação de e­mail de diretórios e/ou documentos ➔ Bloqueio de documentos ➔ Multi (arrastar / soltar dependendo do navegador) upload / download ➔ Multi download via zip ➔ Envio direto do documento via e­mail ➔ Workflow de aprovação do documento configurável ➔ Auditoria de acesso ao documento ➔ Integração com o feed de atividades do Redmine ➔ Macros para rápida linkagem com conteúdos da Wiki ➔ Funcionalidade completa do webDav de leitura/escrita ➔ Pesquisa opcional de conteúdos dentro de um arquivo ➔ Compatível com Redmine 2.0.X

● Redmine EVM plugin Graphical indicators for Earned Value Management

Este plugin gera indicadores de gráficos de linha, por projeto e versões abertas, utilizadas em EVM (Gerenciamento de Valor Agregado). Ele mostra custo real (horas relatados no log de tempo), o valor planejado (horário estimado indicado na nova issue) e de valor agregado distribuídos em semanas / anos. Ele também mostra indicadores CPI e SPI.

● Redmine (Monitoring & Controlling | Monitoramento & Controle)

O Plugin M&C é utilizado como uma ferramenta gráfica de apoio para facilitar o acompanhamento das atividades registrada em um projeto Redmine. Ele auxilia no gerenciamento de tarefas, tempo e recursos humanos:

➔ Gerencimaneto de Tarefas ❏ Gráfico das tarefas agrupadas por Situação ❏ Gráfico apresentando as tarefas gerenciáveis e não gerenciáveis ❏ Tarefas gerenciáveis são aquelas com a data de entrega estabelecida e que ainda não foram para alguma situação do tipo fechada. ❏ Tarefas não gerenciáveis são aquelas com a data de entrega não preenchida, ou seja, sem condições de estabelecer um parâmetro de mensuração. ❏ Gráfico apresentando as tarefas atrasadas dentro do grupo das tarefas gerenciáveis. ➔ Gerenciamento de Tempo ❏ Gráfico de linhas com horas planejadas e horas executada até as datas de entrega. ❏ Gráfico de barra com o total de horas estimadas e o total de horas executadas. ➔ Gerencimento de Recursos Humanos ❏ Gráfico de barras com o total de tarefas por responsável. ❏ Gráfico de barras com o total de tarefas por responsável agrupado por situação.

● Redmine Scrumbler plugin This is a scrum plugin for Redmine

Ele permite que os usuários usem o processo de Scrum / Agile em projetos. Scrumbler tem painel interativo com a possibilidade de configurar para cada sprint. Plugin acrescenta campo Pontos Scrum em todas as issues do projeto. Scrumbler quando possível, utilizando a estrutura Redmine padrão de projetos. Possui as seguintes features:

➔ Drag & Drop para alterar o status de uma issue, seguindo o fluxo de trabalho ➔ Alterar os tipos de status / trackers exibidas no painel de instrumentos (dashboard) ➔ Esconder issues em um estado clicando no cabeçalho da coluna ➔ Escolha qual a versão para exibir no painel de instrumentos (dashboard) ➔ Cores configuráveis ​para as issues apresentadas ➔ Cálculo dos Pontos Scrum e de progresso exibidos no painel de instrumentos (dashboard) ➔ Definir automaticamente a data de fechamento para cada issue, quando se muda para o estado fechado ➔ Fácil mudar o responsável pela issue no painel de instrumentos (dashboard) ➔ É fácil compor o backlog da sprint com Drag & Drop

● Xapian search plugin With this plugin you will be able to do searches by file name and by strings inside your documents

Com este plugin você será capaz de fazer pesquisas por nome de arquivo e por strings dentro de seus documentos através do motor de busca Xapian. Este plugin também pode indexar os arquivos localizados em seus repositórios. Este plugin está sendo utilizando em conjunto com o DMSF para auxilair a busca dos documentos e seus conteúdos, entretanto é opcional. B. Colab

O Colab não é um sistema de gestão de projetos em si, mas vamos apresentá­lo nesta subseção para apontarmos nosso próximo passo técnico para a integração dos sistemas selecionados.

Descrição Geral

O Colab é uma plataforma para a integração de ferramentas, que são suportadas por ele, oferecendo uma interface padronizada através de uma interface web. Com isso ele viabiliza o uso de várias delas, sejam voltadas para o software ou para o gerenciamento de projetos, desde que estas possuam HTTP headers, para que a informação da página seja extraída. Isto oferece uma identidade visual melhor para o portal, mesmo utilizando diversas ferramentas, pois traz a informação contida nelas para dentro de um mesmo portal, sem a necessidade de acesso direto as elas. Atualmente o Colab integra uma Wiki, SVN, Trac, Mailman e o Redmine. E para fazer esta integração utiliza tecnologias como Vargrant, Puppet, Diazo (visual), Persona (autenticação) e o Solr (Pesquisa). O Colab foi desenvolvido pela Interlegis para a visualização de alguns projetos de software. Sua aplicação pode ser vista em https://colab.interlegis.leg.br/. E foi publicado sob a GPL v2, que o classifica como software livre e seu código pode ser visto em https://github.com/interlegis/colab. A forma com que o Colab faz a integração, permite que novas ferramentas sejam adicionadas de forma horizontal (em um mesmo servidor) desde que essas forneçam o suporte do HTTP header. (Figura desenvolvida e cedida por Jean Ferri ­ Interlegis/Colab)

Dado que o Colab tem a função de integrar as plataformas apresentadas, o mesmo não estará presente nas primeiras versões do ambiente, de modo que teremos as ferramentas instaladas de forma independente umas das outras, o que implica, em um primeiro momento, a ausência de single sign on e lista de emails, funcionalidades que serão implementadas junto com a inclusão do Colab no ambiente. 4. Recomendação

A equipe da Universidade de Brasília apresenta como recomendação para os primeiros passos da evolução do Portal do Software Público Brasileiro, no contexto do ambiente do "versionamento.gov.br", a utilização integrada dos sistemas Redmine, GitLab e Git, mantendo o suporte para o legado dos projeto que já utilizam Track com o SVN. Tais ferramentas deverão ser apresentadas em um único ambiente, com suporte a single sign on, que recomenda­se prover pelo sistema Colab que será integrado ao ambiente em uma próxima etapa do projeto. Para a interação da comunidade, recomenda­se o uso da rede social Noosfero, que será melhor apresentada em relatórios posteriores.

As recomendações apresentadas foram alcançadas através do estudo de diversos aspectos de diversas ferramentas com o perfil próximo às necessidades do Portal do Software Público Brasileiro, tal como análise de funcionalidades, licenças e reuniões com especialistas em alguns dos sistemas mencionados.

Check­list

Redmine GitLab Gitorius (com plugins)

Issue tracker X X X

Wiki X X X

Upload de arquivos X

Versionamento de X arquivos

Separação por X X X projeto

Separação por X versão

Agrupamento de X X tarefas

Definição de papéis X X X (permissão)

Backlog X

Gantt X EVM X

Atividades X X X

Merge/Pull request X X

Merge automático X

Sub­projetos X X

Grupos X X

Estatísticas do X X projeto

Visualização do X X X repositório

Manipulação/edição X do repositório

Revisão de código X X (feedback aos requests)

Integração com X outras ferramentas

Acesso não­logado X X X