hoje gostaria de tratar sobre um assunto que, por mais que esteja bem conceituado e conhecido por todos, sempre gera uma certa polêmica ao se tomar uma decisão a respeito. Estou falando da definição de um sistema de controle de versões (Software Configuration Management - SCM) para controlar e gerenciar a evolução dos artefatos gerados por um projeto de software.
Embora existam dezenas de sistemas dessa linha, tratarei aqui apenas dos mais utilizados atualmente no mercado: o CVS e o Subversion (SVN) frutos de uma boa e produtiva discussão gerada na empresa onde trabalho. Fato que me motivou a escrever sobre este tema após coletar dados e pesquisas suficientes para argumentar a migração do nosso SCM atual, o CVS, para o Subversion. Para uma completude das argumentações, também era necessário se levantar uma forma de migrar todos os dados hisóricos do repositório do antigo para o novo sistema.
Para resumir a comparação entre as duas tecnologias, criei uma tabela que cruza características dos dois sistemas em uma perspectiva de administração da ferramenta, que é o que no fundo mais importa, já que as ferramentas utilizadas como clientes para acessa-las são muito parecidas e de fácil assimilação, o que não influenciaria em nada como vantagem ou desvantagem entre um e outro sistema de versionamento.
CVS | Subversion | |
Armazenamento | É feito em arquivos RCS. Estes arquivos são criados em toda a árvore de diretórios do projeto para versionar arquivo por arquivo. Possibilita maior poder para recuperar possíveis falhas apenas editando esses arquivos. | É feito em banco de dados Berkley DB. Existem aplicativos para a recuperação de falhas. |
Concorrência | Existem problemas de acesso concorrente por se tratarem de arquivos em disco. | Acesso concorrente transacionado pelo banco de dados. |
Velocidade | Mais lento pelo fato de usar file system. | Mais rápido. O único problema de velocidade está no momento de se conectar ao repositório e fazer o primeiro checkout, já que ele traz uma cópia local de todos os arquivos. |
Versionamento | Gerencia versões diferentes para cada arquivo do projeto. Permite a criação de branchs e tags por arquivo. Não permite restaurar a versão do projeto à partir de uma tag específica. | Para cada branch ou tag, cria-se uma cópia no repositório e todos os arquivos do projeto ganham um número identificador de 4 dígitos. Ao se configurar um branch, o SVN cria uma tag correspondente no início, mas depois que se dá o primeiro commit, ele se transforma no branch e o novo versionamento se inicia imediatamente. Permite restaurar a versão do projeto à partir de uma tag específica. |
Metadados | Não armazena metadados, somente arquivos. | Permite que se vincule e versione também atributos relacionados aos arquivos, esses atributos são configurados na forma de par “chave=valor”. |
Tipo de arquivos comportados | Bom para armazenamento de arquivos texto. Problema em armazenar binários. Também não é possível se fazer diff de binários. | Todos os tipos de arquivo. |
Rollback | Permite, no entanto tem que se faze de arquivo por arquivo. | Não permite, tem que ser fazer cópias de versões em bom estado. |
Transações – Integridade | Não possui a teoria do “ou tudo, ou nada” pois, quando há conflitos, os arquivos afetados deixam de serem “commitados”, sendo que os estão íntegros(sem conflito) vão para o repositório mesmo assim. | Possui o conceito do “ou tudo, ou nada”. Assim, os números das revisões são marcados apenas quando todos os conflitos foram resolvidos e finalmente se dá o commit. Permite também configurar grupos para commit. |
Lock de arquivos | Não possui. | Possui. Se um usuário bloqueia o arquivo, ele fica como “somente leitura” para os outros. |
Interoperabilidade | Não possui. | Pode se comunicar via Http e ssh. |
Integração com o RedMine | Possui. | Possui. |
Integração com o Hudson | Possui. | Possui. |
Reparem que ao final da tabela de avaliação eu cito duas integrações com outros sistemas: RedMine e Hudson. O RedMine é um sistema de gerência de projetos que utilizamos na empresa. Já o Hudson é o sistema de integração contínua open-source mais utilizado do mercado. Estas duas ferramentas se tornam muito valiosas para se fechar o círculo formado pelos componentes necessários a uma Gestão de Configuração eficaz. Pretendo abordar algo sobre elas e sobre a teoria em torno da Gerência de Configuração e Mudança em breve!
Ok, podemos concluir pela tabela que, o SVN possui uma série de características mais arrojadas que o CVS, mas ainda fica uma pergunta no ar: se a necessidade era também a de migrar os dados, como faríamos isto sem que perdêssemos todos os dados históricos das tags e branchs criados?
Para a árdua tarefa de migração também já existe uma ferramenta muito difundida: o CV2SVN... Ufa!
Esta ferramenta basicamente percorre toda a estrutura de diretórios do projeto afim de mapear e migrar todos os dados históricos de branchs e tags criadas para o novo repositório. Ela permite também que se configure os dois SCM's para sincronizar as alterações de arquivos de um para o outro.
Os nossos próximos passos são instalar então o SVN e CVS2SVN e colocar a migração em prática. Prometo relatar os resultados e todo o caminho das pedras nos próximos posts!
Seguem algumas referências importantes sobre o assunto:
Sites para documentação:
Estratégia de migração:
- Aplicativo CVS2SVN : http://cvs2svn.tigris.org
Outras referências:
- http://sam.zoy.org/writings/
programming/svn2cvs.html - http://onlamp.com/pub/a/
onlamp/2005/10/03/cvs-to- subversion-with-cvs2svn.html - http://sial.org/howto/
subversion/cvs-migrate/
Fiquem à vontade para deixar os seus comentários!
Um abraço a todos e até o próximo post! ;)
.
Acredito que a sua comparação é muito válida, mais seria muito interessante se pudesse falar algo sobre o GIT, que particularmente, é uma ferramenta que sana muitos dos problemas que ainda encontramos utilizando CVS e Subversion.
ResponderExcluirAtt,
Olá Juliano! Primeiramente, obrigado por seu comentário.
ResponderExcluirVocê tem total razão: o Git é ainda mais evoluido e sana muitos dos problemas existentes nestes dois sistemas aqui apresentados. Ele se apresenta como uma solução de controle de versão distribuído e, no entanto, para a necessidade da Gerência de Configuração e Mudança na empresa onde trabalho, o Git seria, digamos, uma "bazuca para matar um mosquito", já que a equipe se encontra geográficamente concentrada em um mesmo escritório.
Mesmo assim, obrigado por sua sugestão. Fiquei realmente muito tentado em colocar o Git nessa briga! Vou preparar um post sobre o assunto!
Um grande abraço!
Att,
Eduardo Negrão.
Primeiramente, gostaria de parabenizá-lo pelo artigo e segundo pela sua pós.
ResponderExcluirCom relacção a seu artigo, achei muito explicativo. Acredito que poderia ser mais aprofundado, mais esta valendo. Abraço de seu amigo Carlão.
ca.gaspar@gmail.com
ae Eduardo... muito bacana o CV2SVN. Conforme conversamos pessoalmente gostaria de deixar um complemento a seu post. Em marco deste ano, o Martin Fowler fez um post em sua pagina, onde ele faz um comparativo com os softwares de controle de versão mais conhecidos no mercado:
ResponderExcluirhttp://martinfowler.com/bliki/VcsSurvey.html
os resultados de sua pesquisa apontam o Subversion, Git e Mercurial como melhores, já o CVS possui uma porcentagem baixa. Vale a pena a leitura.
abracos,
Pelizari
Olá Eduardo. Parabéns pelo blog, sempre acompanho quando posso. cada dia melhor !
ResponderExcluirOlá Deluca! Obrigado!
ResponderExcluirSempre que quiser, fique à vontade para postar comentários de qualquer aspecto (críticas, melhorias, sugestões de novos posts e partilha de seus conhecimentos). Os aceitarei e tentarei atender o mais rápido possível!
E Pelizari, obrigado por nos compartilhar esse comparativo, é interessantíssimo! Recomendo a todos darem uma olhada nessa página do Martin Fowler!
Um grande abraço a todos!
Eduardo Negrão - portalengenhariadesoftware.blogspot.com
.
Muito bom este comparativo. Estou pesquisando sobre o SVN, pois na empresa onde trabalho é utilizado o CVS. Que tal um artigo sobre o uso do SVN e suas integrações com outros softwares.
ResponderExcluirAbraços.
Pesquisando um pouco mais, descobri que também há a possibilidade de armazenamento de repositórios utilizando FSFS ao invés de Berkley DB a partir da versão 1.2. Pelo que li, este sistema é mais recomendável em diversas situações.
ResponderExcluirVale a pena pesquisar!
Abraços.
rogerio_gentil at yahoo.com.br
Olá Rogério. Obrigado por seus comentários!
ResponderExcluirUm estudo sobre as integrações seria interessante, principalmente com o Hudson e as principais issue trackers, como o RedMine que eu citei. Vou pensar com carinho a respeito! ;)
Em que situações o FSFS seria mais recomendável? Você poderia compartilhar conosco a fonte da sua leitura?
Um grande abraço!
Att,
Eduardo Negrão.
portalengenhariadesoftware.blogspot.com
--
Parabéns pelo blog, as ferramentas citadas no artigo são essenciais para trabalhar em equipe, o Redmine e o Hudson/Jenkins realmente são muito boas, usamos elas totalmente integradas ao Eclipse, com o Mylyn sincronizando as tarefaz do Redmine e fazemos deploy pelo Eclipse conectado ao Jenkins, foi bom saber que tem mais gente usando uma estrutura de SCM nesse nível, sucesso!
ResponderExcluirOlá, boa noite.
ResponderExcluirGostei muito do seu comparativo. Também sou responsável pelo Gerenciamento de Configurações e Mudanças na empresa onde trabalho e estou estudando possíveis mudanças. Atualmente utilizamos o CVS que, para certos aspectos, é muito bom. Entretanto esbarramos com problemas pesados como o diff de arquivos binários. Onde trabalho é necessário alterarmos alguns arquivos binários em determinadas situações.
Outro problema é a integração com outra equipe de desenvolvimento que utiliza Eclipse. Devido a estas e outras restrições estamos procurando mudar para outro software de gerenciamento de versões.
Gostaria de saber se vc conhece sobre o sistema de permissões do CVS (chacl) e se existe algo similar no SVN. Também desenvolvemos uma ferramenta de integração entre Controle de Versão e Rastreamento de Commits utilizando comandos Pre-Commit, VerifyMsg e outros scripts de gerenciamento do CVS. Existe algo similar no SVN?