17 Jan
Eu sou um grande fã de automatização de tarefas repetitivas. Odeio ter que repetir tarefas.
Isso me torna um grande fã de coisas como integração contínua, deploy contínuo, testes e automatizadores de builds.
Para IC, o cruisecontrol.rb é maravilhoso. Deploy contínuo eu resolvo com um simples script bash. Quanto aos testes, o infinitest (ainda vou falar mais sobre ele, mas ele é demais!) trouxe alegria de volta a minha vida.
Mas quando chega na parte de automatização de build, o mundo desaba. Como minha maior experiência é com Java, vou falar apenas sobre java.
Convenhamos, os dois automatizadores mais usados são terríveis. Tanto ant quanto maven nos fazem perder mais cabelos e mais cedo do que deveria.
Como a gente começa um projeto que vá usar um desses automatizadores? Pegamos um projeto antigo, copiamos o xml de configuração, colamos, apagamos uma parte, mudamos outra e pronto. Temos um novo projeto. Mas porque raios a gente precisa dessas coisas que foram copiadas? No ant porque o ciclo básico de muitos projetos é igual. No maven porque ele exige muita coisa quase inútil.
Eu já não gosto de xml (na verdade, acho xml muito legal, o problema é que usam ele para tudo - e na maioria das vezes, usam mal) e tenho que manter xmls muito parecidos entre todos os meus projetos. Um problema sério que o ant tem é que tudo tem que ser configurado ou ele não faz nada. Você acaba tendo que programar o seu build em xml (o que pra mim já elimina ele da minha vida).
O maven facilita um pouco nesse lado. Como ele tem um mínimo de convenções, com apenas umas 15 linhas de xml eu consigo convencer ele a compilar meu código. Mas são 15 linhas inúteis. Ele simplesmente não funciona sem essas 15 linhas.
Enquanto você apenas usa o maven para compilar seu código, rodar testes unitários, gerênciar suas dependências (sim, como todo usuário de maven eu passo por um classpath hell -em geral causado por projetos com dependências mal configuradas- por mês, mas ainda acho que vale a pena não precisar adicionar na mão), gerar a configuração para sua IDE, gerar seus jar/war, é tudo lindo e maravilhoso. O problema começa quando o projeto começa a ganhar um pouco mais de massa.
Já tentou configurar um build separado para testes de integração? mvn integration-test é uma das maiores mentiras já contadas. Você tem que se matar com o plugin do surefire (test runner que o maven usa) para conseguir separar os testes. E se você quiser um build separado para testes de aceitação? Pior ainda. Não existe mvn acceptance-test. Então ou você roda junto com o integration-test ou apela para profiles e reduz sua vida em alguns anos. E se eu sonhar com um build que rode testes de regressão para segurança (que não faz sentido rodar a cada commit. Uma vez por dia é o suficiente em muitos projetos). Nesse ponto você começa a pensar em suicídio.
E deploy? Ha! Quando você pensa isso alguém pula de trás do monitor, grita “Pegadinha do Malandro!” e te manda procurar o cargo plugin, que não vi funcionar com menos de 100 linhas de xml (quando funcionou).
Um padrão que eu notei que vem acontecendo comigo é que eu uso sempre três automatizadores. O maven para gerênciar dependências, compilar, rodar testes (mesmo com o inferno dos profiles). Scripts bash/ruby/perl/python/o_que_der_na_telha para deploy. E make para juntar tudo isso. Como? Make? Que o pessoal usa pra C? Esse mesmo. O make é simplesmente um monte de alias para um monte de comandos. Perfeito para juntar coisas completamente aleatórias.
Acabo tendo coisas como make test, integration-test, acceptance-test, deploy, etc. Mas o monte de lixo continua ali, escondido, esperando o próximo classpath hell para se auto-destruir.
Meu principal ponto com o maven é que ele tenta fazer muito mais do que deveria. Na boa? Não tem como escrever um plugin genérico para fazer deploy. Todos os sistemas são muito diferentes um do outro. Então não faça algo que vai funcionar mal e que seja difícil. Deixa para o programador se virar. Apenas facilite isso.
Bom, não escrevi esse monte de coisas apenas como um desabafo (embora tenha me feito muito bem :) ). Eu vou começar a desenvolver um automatizador que tenha uma filosofia diferente os atuais e facilite manter a minha zona organizada. Sem configuração alguma (tirando gerênciamento de dependências que não dá para evitar em qualquer projeto que use testes) ele vai ser capaz de compilar seu código, rodar qualquer tipo de teste (unit, integration, acceptance, etc). Ciclo de vida modificável (se eu não quiser que ele rode os testes unitários antes dos de aceitação, ele simplesmente não roda). O deploy fica a cargo do programador, mas o automatizador facilita a execução dos scripts. Ah, eu disse que não será usado xml algum para configuração?
Enfim, o que preciso nesse momento é de pessoas que estejam afim de contribuir com idéias e críticas (do tipo “não gosto de X porque Y”) pra esse planejamento inicial. Não criei uma lista ainda porque não sei se existem outros interessados (eventualmente sou eu que sou incapaz de usar ant e maven). Por enquanto podemos começar pelos comentários mesmo :)
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.
Email This Post
7 Responses for "Um caso de ódio e talvez um pouco de amor (Também conhecido como automatizadores de build)"
Sempre achei que as pessoas usavam autotools para depois usar:
./configure
make
make install
Eu já tive o desprazer de manter um projeto (beeeeeeem pequeno) apenas com Make. Acabei aprendendo a usar sem autotools.
cara, de uma olhada no rake do ruby, bem interessante e simples, e pode facilmente se integrado para coisas em java… o rodrigo urubatan já fez algo veja:
http://www.urubatan.com.br/utilizando-rake-para-o-build-de-projetos-java/
Usar algo programático como o rake seria o melhor dos casos…
como o urubatan já fez um hack do rake pra ele rodar os comandos java, acho que seria mais legal ajudá-lo a deixar esse hack mais estável e bonito, do que fazer uma ferramenta do zero…
isso não resolve a parte de gerenciamento de dependências, mas dá pra fazer com que o rake use o ivy, por exemplo, de um jeito fácil, daí resolve esse problema tb…
Infinitest por um acaso quer dizer teste infinitesimal ou trabalha com a mesma idéia?
Eu também passo por tais sofrimentos por você citado, a exemplo do Classpath hell a qual eu fui apresentado estes dias…
Confesso que não sabia que havia tantos detalhes por trás de tais tarefas de testes de integração, a utilização do Maven como um todo, assim como eu não sabia que este comando Make era o mesmo da linguagem C.
É interessante o ponto em que menciona ser impossível desenvolver um automatizador que resolva tudo, para todos os projetos, uma vez que cada um tem suas características específicas. Assim sendo, de fato, ter um automatizador próprio, criado por e para alguém que tem já metodologias de trabalho bem definidas, pode ser uma “mão na roda” para que os projetos não sejam impactados com problemas de configuração e utilização de ambiente, dando uma liberdade maior para focar no negócio em questão, no aplicativo sob criação em si.
Abraços!
Velho, cheguei a essas conclusões ai há algum tempo.
É o famoso build.xml voando e aterrisando de projeto em projeto…
O Maven promete resolver todos os teus problemas e acaba trazendo mais alguns… Ainda tenho minhas dúvidas se mesmo para gerenciar as dependências de jars no classpath vale a pena usar ele.
No momento não tenho nenhuma ideia. Mas, também já pensei seriamente em desenvolver um outro automatizador de build, e se tiver afim podemos criar um projeto no sourceforge ou googlecode e começar a levantar os requisitos de um automatizador de build decente e pé no chão.
Enquanto isso, continuo “programando em xml” pro Ant.
Acabei de criar uma lista para começarmos as discutir idéias sobre esse automatizador. Fiquem à vontade para entrar nela (http://lista.vidageek.net/listinfo.cgi/atm-dev-vidageek.net).
Além disso, criei um projeto no github (https://github.com/vidageek/atm/) para manter o código e usar como issue/feature tracking.
Leave a reply