Nosso processo de integração contínua
Publicado por Vinicius Manhães Teles há mais de 2 anos.
O Lucas Húngaro deixou-nos um comentário pedindo que escrevêssemos sobre nossa infra-estrutura de controle de versão, integração contínua, testes unitários e cobertura de código para projetos Rails. Ótima pergunta! Muito obrigado, Lucas.
Nós utilizamos o Subversion como repositório e optamos por um modelo de integração contínua síncrono. Isso significa que toda vez que um desenvolvedor precisa integrar, ele roda uma script do Rake que faz o update do código, executa todos os testes, verifica a cobertura de código e, se tudo estiver em ordem, faz o commit do código.
Nós trabalhamos com 100% de cobertura em todos os projetos. Para isso usamos o Rcov. O script de integração executa a análise de cobertura antes de cada commit e cancela a integração caso o desenvolvedor tenha esquecido de fazer os testes para um código recém-introduzido.
A integração síncrona obriga o desenvolvedor a aguardar a execução do script de integração, antes de partir para outra tarefa de programação. Isso é bom porque evita que a gente comece outra coisa antes de saber que fizemos corretamente a atividade corrente. Além disso, ter que esperar pela execução do script nos leva a ter atenção permanente com o tempo de execução dele. Se crescer muito, a gente o aprimora para reduzir o tempo. No geral, tentamos manter o tempo de execução sempre abaixo dos cinco minutos.
O contrário da integração síncrona é a assíncrona, que utiliza algum servidor, como um CruiseControl. Nesse caso, o desenvolver faz o commit, o qual dispara um script no servidor do CruiseControl. Ele executa todos os testes e demais verificações enquanto o desenvolvedor já passou para outra atividade. Algum tempo depois ele recebe um email ou outro tipo de notificação avisando se tiver acontecido um erro. É um modelo interessante em várias circunstâncias, mas nos projetos que fazemos tentamos evitá-lo. James Shore escreveu um excelente artigo que resume as razões para não usar o CruiseControl. Nossas razões são basicamente as mesmas.
Para os testes unitários, utilizamos o Test::Unit, naturalmente, além do Mocha para os mock objects e o Selenium on Rails para os testes de aceitação.



O que você achou? Coloque seus comentários e sugestões abaixo!
Acompanhe o RSS dessa página.
Comentários (16 até o momento)
Rodrigo disse aproximadamente 2 horas depois:
Lucas Húngaro disse aproximadamente 3 horas depois:
Daniel Passos disse aproximadamente 3 horas depois:
Eduardo Scoz disse aproximadamente 4 horas depois:
Leandro Zis disse aproximadamente 5 horas depois:
Vinícius Manhães Teles disse aproximadamente 6 horas depois:
Vinícius Manhães Teles disse aproximadamente 6 horas depois:
Marcelo Baltar disse 1 dia depois:
Eduardo Fiorezi disse 2 dias depois:
Tapajós disse 3 dias depois:
Vinícius Manhães Teles disse 6 dias depois:
Eduardo Scoz disse 10 dias depois:
Vinícius Manhães Teles disse 10 dias depois:
Lucas Fais disse 11 dias depois:
Vinícius Manhães Teles disse 11 dias depois:
Rodrigo Urubatan disse 11 dias depois: