<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Coding4Food &#187; metodologia</title>
	<atom:link href="http://coding4food.com/category/metodologia/feed/" rel="self" type="application/rss+xml" />
	<link>http://coding4food.com</link>
	<description>software development and IT stuff</description>
	<lastBuildDate>Wed, 07 Jul 2010 13:11:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>todo mundo quer ser ágil</title>
		<link>http://coding4food.com/2010/07/05/todo-mundo-quer-ser-agil/</link>
		<comments>http://coding4food.com/2010/07/05/todo-mundo-quer-ser-agil/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 05:34:07 +0000</pubDate>
		<dc:creator>Eduardo Kruger</dc:creator>
				<category><![CDATA[metodologia]]></category>
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://coding4food.com/?p=703</guid>
		<description><![CDATA[Alguns dias atrás eu comentava com um colega de trabalho, sobre o meu sentimento de que o &#8220;agilismo&#8221; (ou seja lá qual for o termo) já se tornou a moda da vez. Os &#8220;xipezeiros&#8221;, &#8220;scrunzeiros&#8221; e agilistas de plantão estufam o peito pra falar dos seus &#8220;sprints&#8221;&#8230; que utilizam quadros brancos&#8230; que tem post-its colados [...]]]></description>
			<content:encoded><![CDATA[<p>Alguns dias atrás eu comentava com um colega de <a href="http://blog.informant.com.br" target="_blank">trabalho</a>, sobre o meu sentimento de que o &#8220;agilismo&#8221; (ou seja lá qual for o termo) já se tornou a moda da vez. Os &#8220;xipezeiros&#8221;, &#8220;scrunzeiros&#8221; e agilistas de plantão estufam o peito pra falar dos seus &#8220;sprints&#8221;&#8230; que utilizam quadros brancos&#8230; que tem post-its colados por toda empresa&#8230; que UML  não serve pra náda&#8230; e que ser ágil é sentar e sair programando.<br />
Tenho o sentimento que muitas pessoas e consequentemente empresas, se juntam a <a href="http://pt.wikipedia.org/wiki/Comportamento_de_manada" target="_blank">manáda</a> e começam a utilizar alguma metodologia, porque alguém disse que é bom, ou porque o blog do momento falou que é &#8220;<em>cool</em>&#8221; ser ágil.</p>
<p>Qual a empresa de tecnologia hoje, ser arriscaria a dizer para seu cliente que não é &#8220;Ágil&#8221; ?<br />
Todo mundo tenta desesperadamente ser ágil.<br />
Até a IBM, <a href="http://www-01.ibm.com/software/rational/agile/" target="_blank">quer ser ágil</a>.</p>
<p><img class="aligncenter" title="The Agile Mess" src="http://coding4food.com/wp-content/themes/blueprint/images/post-its.jpg" alt="" width="500" height="400" /></p>
<p>Tenho a impressão que essa busca incansável, é motivada principalmente por 2 coisas:</p>
<p><strong>- <em>a primeira é que já sofremos muito durante os últimos anos  tentando fazer software</em></strong><br />
Quem já trabalhou numa fábrica de software, numa consultoria de 3  letrinhas, já encarou caso de uso de mais de 100 páginas, ou quis modelar um ERP inteiro em UML antes de começar a programar, sabe bem do que estou falando. Para quem já está na <a href="http://www.dicionarioweb.com.br/labuta.html" target="_blank">labuta</a> a pelo menos uns 10 anos e passou por tudo isso já aprendeu que<em> <a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">algumas</a> <a href="http://en.wikipedia.org/wiki/Waterfall_model" target="_blank">coisas</a> </em>nem sempre funcionam. E vêem o agile como a melhor opção disponível para desenvolver software atualmente.</p>
<p><strong>-</strong><em><strong> a segunda é a falsa idéia de que as metodologias ágeis pregam&#8230; não utilizar metodologia alguma..!!!</strong><br />
</em>Isso é fato quando se vê muita gente em fóruns e afins, falando que na suas empresas não tem análise, não tem documentação ou burocracia alguma..<em>.</em>que após uma reunião, todos os programadores se debruçam-se sobre seus teclados e se põe a codificar até que algo seja &#8220;entregável&#8221; para o cliente.<br />
Bem, IMHO isso me parece muito mais um <a href="http://gohorseprocess.wordpress.com/extreme-go-horse-xgh/" target="_blank">XGH</a>&#8230;. ou um <em>&#8220;Just Do-it Programming&#8221;</em> disfarçado de scrum.<br />
Acho que muita gente que está entrando no mercado de trabalho recentemente (a uns 3 ou 4 anos), diz que utiliza <a href="http://c2.com/cgi/wiki?ExtremeProgramming" target="_blank">XP</a>, <a href="http://www.scrumalliance.org/" target="_blank">Scrum</a>, <a href="http://www.lean.org/" target="_blank">Lean</a> ou qualquer metodolgia ágil porque tem a ilusão de que é fácil de implementar.</p>
<p>&#8220;<em>Se não tem documentação&#8230; não tem formalidade alguma&#8230;.se é só fazer uma reunião de 15 min durante a manhã e programar durante o resto do dia&#8230; eu também posso ser ágil&#8230; vamos implementar isso aqui na nossa empresa !!!</em>&#8221;</p>
<p>Essa é uma das maiores <a href="http://coding4food.com/2008/09/28/as-falacias-da-programacao/" target="_blank">falácias</a> do desenvolvimento de software. Por experiência própria, eu posso dizer que aplicar uma metodologia como Scrum ou XP na prática numa empresa e obter resultados positivos é um trabalho árduo. É difícil e vai requerer uma paciência que você achava que não tinha. Ao contrário do que muitos pensam, aplicar algumas práticas do XP, como o <a href="http://improveit.com.br/xp/praticas/tdd" target="_blank">TDD</a> por exemplo, vai exigir muito mais disciplina de uma equipe, do que se ela estivesse trabalhando numa fábrica de software com CMM5.</p>
<p><a href="http://coding4food.com/wp-content/themes/blueprint/images/mythical-man-month.jpg"><img class="alignleft" style="border: 1px solid black;" title="There is no silver bullet" src="http://coding4food.com/wp-content/themes/blueprint/images/mythical-man-month.jpg" alt="" width="158" height="240" /></a>Com tudo isso, surgiram inúmeros cursos Scrum e XP por aí&#8230; apareceram centanas de especialistas em agile, que prometem demonstrar um conjunto de práticas para tornar qualquer empresa ágil&#8230;acabando com seus problemas de escopo, prazo e relacionamento com o cliente.</p>
<p>A verdade é que não existe uma fórmula, ou receita de bolo pra isso. <a href="http://en.wikipedia.org/wiki/No_Silver_Bullet" target="_blank">A bala de prata não existe</a>. Cada empresa tem uma caracterísitca&#8230;.cada projeto tem um contexto&#8230; que faz com que seja necessário escolher as melhores práticas em cada situação.</p>
<p>A melhor idéia de agile que tenho até o momento, foram as palavras de <a href="http://en.wikipedia.org/wiki/Philippe_Kruchten" target="_blank">Philippe Kruchten</a> no seu <a href="http://www.agilebrazil.com/2010/pt/detalhes.html#key_kruchten" target="_blank">keynote</a> no final semana passado, no <a href="http://www.agilebrazil.com/" target="_blank">agile brazil 2010</a>:</p>
<p>&#8220;<em>Software development is not a <a href="http://en.wikipedia.org/wiki/Natural_science" target="_blank">Natural Science</a> like Physics or any other. In Agile Software Develpment, we have different methods (aka: scrum, xp, lean) for diferente issues. We have to ask ourselves which practices or methods will fit better in our project context&#8221;<br />
</em></p>
<p><em>&#8220;Why we&#8217;re using XP ? What practices will fit better in these project ? &#8230; and why we&#8217;re doing this any way?&#8221;</em></p>
<p>Você consegue imaginar a utilização de XP no desenvolvimento do software que contola um caça <a href="http://pt.wikipedia.org/wiki/F-35_Lightning_II" target="_blank">F-35</a> ?</p>
<p style="text-align: left;"><em>Xispezeiro: &#8220;Sem problemas,  nessas duas primeiras semanas vamos entregar a parte que faz ligar o motor e você já pode decolar com o avião&#8221;<br />
Piloto: &#8220;E o controlador de vôo ?&#8221;<br />
</em><em>Xispezeiro</em><em>: &#8220;O que ? O controlador de vôo ? Mas você vai precisar disso mesmo ? O mais importante agora é decolar&#8230; depois conversamos sobre o controlador de vôo&#8230;&#8221;<br />
</em></p>
<p style="text-align: center;"><a href="http://en.wikipedia.org/wiki/Lockheed_Martin_F-35_Lightning_II"><em><img class="aligncenter" style="border: 1px solid black;" title="F-35 Jet" src="http://coding4food.com/wp-content/themes/blueprint/images/f-35.jpg" alt="" width="470" height="314" /></em></a></p>
<p>Não conheço náda de aeronáutica, mas é bem provável que um projeto de desse tipo seja obrigado a ter uma fase muito detalhada de design e documentação, porque um erro de projeto, pode gerar um prejuízo <a href="http://www.dicionarioinformal.com.br/buscar.php?palavra=estratosf%E9rico" target="_blank">estratosférico</a>.<br />
E gerar muita documentação nesse caso está errado? Você faria uma reunião de 4 horinhas pra modelar uma funcionalidade num F-35 ?<br />
Claro que esse é um exemplo extremo, mas existem muitas organizações e ramos de negócio que precisam de mais formalidade e provavelmente teriam muitas dificuldades implementando métodos ágeis.<br />
Por isso que contexto, é fundamental.</p>
<p>Com toda essa confusão de post-its e sprints do <a href="http://coding4food.com/2010/07/05/todo-mundo-quer-ser-agil/" target="_self"><em>falso agile</em></a>, os verdadeiros <a href="http://agilemanifesto.org/" target="_blank">valores</a> do manifesto ágil acabam ficando em segundo plano para maioria das pessoas. Acabamos desconsiderando o mais importante: o contexto no qual estamos tentando implementar agilidade.</p>
<p><em>Por que estamos utlizando essa metodologia ? Qual o problema que estamos tentando resolver ? Essas práticas se encaixam no contexto desse projeto ?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://coding4food.com/2010/07/05/todo-mundo-quer-ser-agil/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>CruiseControl com SVN – Parte 02</title>
		<link>http://coding4food.com/2010/03/17/cruisecontrol-com-svn-%e2%80%93-parte-02/</link>
		<comments>http://coding4food.com/2010/03/17/cruisecontrol-com-svn-%e2%80%93-parte-02/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 03:15:51 +0000</pubDate>
		<dc:creator>Eduardo Kruger</dc:creator>
				<category><![CDATA[metodologia]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[integração contínua]]></category>

		<guid isPermaLink="false">http://coding4food.com/?p=537</guid>
		<description><![CDATA[Então alguém na sua empresa tem um projeto em Flex, e quer configurá-lo no CruiseControl ?!
Sei..  nós também já passamos por isso.
A primeira coisa a ser feita é colocar a lib do flex-tasks no classpath do ant, para podermos executar as tasks flex no build do nosso projeto. A forma mais fácil de fazer isso [...]]]></description>
			<content:encoded><![CDATA[<p>Então <a href="http://joaoaugusto.com.br/blog/" target="_blank">alguém</a> na sua empresa tem um projeto em <a href="http://www.adobe.com/br/products/flex/" target="_blank">Flex</a>, e quer configurá-lo no <a href="http://cruisecontrol.sourceforge.net/" target="_blank">CruiseControl</a> ?!<br />
Sei..  <a href="http://www.informant.com.br" target="_blank">nós</a> também já passamos por isso.</p>
<p>A primeira coisa a ser feita é colocar a lib do <em>flex-tasks</em> no classpath do <em>ant</em>, para podermos executar as tasks flex no build do nosso projeto. A forma mais fácil de fazer isso é copiando a lib <em>{FLEX_HOME}/ant/lib/flexTasks.jar</em> para diretório de libs da instalação do ant <em>{ANT_HOME}/lib</em>.<br />
Então, para você poder utilizar as tasks flex, basta incluir as linhas abaixo no seu arquivo de build:</p>
<pre class="brush: xml;">
&lt;taskdef resource=&quot;flexTasks.tasks&quot; classpath=&quot;${ant.home}/lib/flexTasks.jar&quot; /&gt;
&lt;property name=&quot;FLEX_HOME&quot; value=&quot;${flex.home}&quot; /&gt;
</pre>
<p>Feito isso você já pode compilar os seus componentes, módulos e quase toda <em>parafernália</em> de um projeto flex tradicional. Para compilar os seus módulos flex, você pode utilizar o <em>&lt;mxmlc&gt;</em>,  indicando o seu <em>.mxml</em> de entrada e o <em>.swf</em> de saída. No meu caso ficou mais ou menos assim:</p>
<pre class="brush: xml;">
&lt;!-- compila o modulo flex modules/WhiteboardEditModule.mxml  --&gt;
 &lt;target name=&quot;compile-flex-whiteboard-module&quot; depends=&quot;compile-java&quot;&gt;
 &lt;echo message=&quot;${ant.project.name}: Compilando WhiteboardEditModule.mxml ...&quot;/&gt;
 &lt;mxmlc  file=&quot;${project.path}/wedoWeb/flex_src/modules/WhiteboardEditModule.mxml&quot;
 output=&quot;${project.path}/wedoWeb/output/modules/WhiteboardEditModule.swf&quot;
 keep-generated-actionscript=&quot;false&quot;
 incremental=&quot;true&quot;
 debug=&quot;true&quot;
 allow-source-path-overlap=&quot;true&quot;
 show-actionscript-warnings=&quot;false&quot;
 show-binding-warnings=&quot;false&quot;
 services=&quot;${project.path}/wedoWeb/WebContent/WEB-INF/flex/services-config.xml&quot;&gt;

 &lt;target-player&gt;10.0.0&lt;/target-player&gt;
 &lt;actionscript-file-encoding&gt;&quot;UTF-8&quot;&lt;/actionscript-file-encoding&gt;
 &lt;load-config filename=&quot;${flex.home}/frameworks/flex-config.xml&quot;/&gt;

 &lt;library-path dir=&quot;${flex.home}/frameworks/libs&quot; append=&quot;true&quot;&gt;
 &lt;include name=&quot;*.swc&quot; /&gt;
 &lt;/library-path&gt;
 &lt;library-path dir=&quot;${project.name}/flex_libs&quot; append=&quot;true&quot;&gt;
 &lt;include name=&quot;*.swc&quot; /&gt;
 &lt;/library-path&gt;

 &lt;locale&gt;pt_BR&lt;/locale&gt;
 &lt;locale&gt;en_US&lt;/locale&gt;
 &lt;locale&gt;es_ES&lt;/locale&gt;
 &lt;source-path path-element=&quot;${project.path}/wedoWeb/flex_src&quot; /&gt;
 &lt;source-path path-element=&quot;${project.path}/Whiteboard/src&quot;/&gt;
 &lt;source-path path-element=&quot;${project.path}/wedoWeb/locale/{locale}&quot;/&gt;

 &lt;include-resource-bundles&gt;nous&lt;/include-resource-bundles&gt;
 &lt;include-resource-bundles&gt;SharedResources&lt;/include-resource-bundles&gt;
 &lt;include-resource-bundles&gt;formatters&lt;/include-resource-bundles&gt;
 &lt;/mxmlc&gt;
 &lt;/target&gt;
</pre>
<p>É importante indicar o arquivo <em>services-config.xml</em>, ele define algumas diretrizes de compilação do projeto, também relacionadas a utilização da aplicação sobre <a href="http://en.wikipedia.org/wiki/HTTP_Secure" target="_blank"><em>https</em></a>. ( <em>é isso né <a href="http://joaoaugusto.com.br/blog/" target="_blank">John</a>, vc não vai me fazer passar por mentiroso aqui ?!</em>)</p>
<pre class="brush: xml;">
services=&quot;${project.path}/wedoWeb/WebContent/WEB-INF/flex/services-config.xml&quot;&gt;
</pre>
<p>Além de indicar o arquivo de configuração do flex, é importante configurar a versão do <a href="http://get.adobe.com/flashplayer/" target="_blank"><em>flashplayer</em></a> sendo utilizada e o <em>file encoding</em> dos actions scripts. Se você não configurar essas opções&#8230; bem, nesse caso coisas estranhas vão acontecer.</p>
<pre class="brush: xml;">
&lt;target-player&gt;10.0.0&lt;/target-player&gt;
 &lt;actionscript-file-encoding&gt;&quot;UTF-8&quot;&lt;/actionscript-file-encoding&gt;
 &lt;load-config filename=&quot;${flex.home}/frameworks/flex-config.xml&quot;/&gt;
</pre>
<p>Por incrível que pareça, a parametrização de intercionalização do projeto, foi mais fácil do que eu esperava. No nosso caso, o sistema está disponível em 3 idiomas.  Bastaram mais umas linhas, e tudo certo.</p>
<pre class="brush: xml;">
&lt;locale&gt;pt_BR&lt;/locale&gt;
 &lt;locale&gt;en_US&lt;/locale&gt;
 &lt;locale&gt;es_ES&lt;/locale&gt;
 &lt;source-path path-element=&quot;${project.path}/wedoWeb/flex_src&quot; /&gt;
 &lt;source-path path-element=&quot;${project.path}/Whiteboard/src&quot;/&gt;
 &lt;source-path path-element=&quot;${project.path}/wedoWeb/locale/{locale}&quot;/&gt;

&lt;include-resource-bundles&gt;nous&lt;/include-resource-bundles&gt;
 &lt;include-resource-bundles&gt;SharedResources&lt;/include-resource-bundles&gt;
 &lt;include-resource-bundles&gt;formatters&lt;/include-resource-bundles&gt;
</pre>
<p>Para compilar os demais módulos flex do seu projeto, a história se repte, é só mandar um <em>&lt;mxmlc&gt;</em> da mesma forma como fizemos aí em cima.</p>
<p>Depois disso,  ainda é preciso gerar o arquivo <em>html principal da aplicação</em>, sim.. aquele objeto que traz consigo o <em>.swf</em> dentro dele: o <em>html-wrapper</em>. O elemento <em>&lt;html-wrapper&gt;</em> gera pra você o <em>index.html e AC_OETags.js</em>, que serão necessários no deploy da aplicação. Além disso ele pode gerar <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=anttasks_1.html" target="_blank">o resto da parafernália</a> (<em>adoro a pronúncia dessa palavra: pa-ra-fer-ná-li-a</em> &#8230;), como os arquivos <em>historyFrame.html, history.css e history.js</em></p>
<pre class="brush: xml;">
&lt;!-- Gera html-wrapper  --&gt;
 &lt;target name=&quot;wrapper-flex-html&quot; depends=&quot;compile-flex-wedoWeb-module&quot;&gt;
 &lt;echo message=&quot;${ant.project.name}: Gerando html-wrapper ...&quot;/&gt;
 &lt;html-wrapper
 title=&quot;&quot;
 file=&quot;wedoWeb.html&quot;
 height=&quot;&quot;
 width=&quot;&quot;
 bgcolor=&quot;&quot;
 application=&quot;&quot;
 swf=&quot;&quot;
 version-major=&quot;&quot;
 version-minor=&quot;&quot;
 version-revision=&quot;&quot;
 history=&quot;true&quot;
 template=&quot;express-installation&quot;
 output=&quot;${project.name}/output&quot;/&gt;

 &lt;html-wrapper
 title=&quot;&quot;
 file=&quot;wedoTest.html&quot;
 height=&quot;&quot;
 width=&quot;&quot;
 bgcolor=&quot;&quot;
 application=&quot;&quot;
 swf=&quot;&quot;
 version-major=&quot;&quot;
 version-minor=&quot;&quot;
 version-revision=&quot;&quot;
 history=&quot;true&quot;
 template=&quot;express-installation&quot;
 output=&quot;${project.name}/output&quot;/&gt;

 &lt;/target&gt;
</pre>
<p>O problema é que no nosso caso, já temos um <em>index.template.html, </em>que é utilizado na geração do <em>html</em> principal da aplicação. Por isso eu utilizei o <em>&lt;html-wrapper&gt;</em> apenas para geração da <em>parafernália</em> (novamente&#8230;) de arquivos <em>AC_OETags.js, </em><em>historyFrame.html, history.css, history.js</em> e o <em>index.html </em>padrão. Depois bastaram alguns <em>ctrl-c, ctrl-v</em> para os passar os parãmetros do template para o meu recém criado <em>wedoWeb.html</em>.</p>
<pre class="brush: xml;">
&lt;target name=&quot;copy-html-template&quot; depends=&quot;wrapper-flex-html&quot;&gt;
 &lt;echo message=&quot;${ant.project.name}: Gerando wedoWeb.html ...&quot;/&gt;
 &lt;delete file=&quot;wedoWeb/output/wedoWeb.html&quot;/&gt;
 &lt;copy file=&quot;${project.name}/html-template/index.template.html&quot;    tofile=&quot;${project.name}/output/wedoWeb.html&quot; /&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${title}&quot; value=&quot;&quot;/&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${swf}&quot; value=&quot;wedoWeb&quot;/&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${width}&quot; value=&quot;100%&quot;/&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${height}&quot; value=&quot;100%&quot;/&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${bgcolor}&quot; value=&quot;#869ca7&quot;/&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${application}&quot; value=&quot;wedoWeb&quot;/&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${version_major}&quot; value=&quot;10&quot;/&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${version_minor}&quot; value=&quot;0&quot;/&gt;
 &lt;replace file=&quot;${project.name}/output/wedoWeb.html&quot; token=&quot;$${version_revision}&quot; value=&quot;0&quot;/&gt;
</pre>
<p>Claro, antes disso ainda precisei manipular alguns arquivos&#8230; uns pra lá outros pra cá&#8230;  pra poder gerar o .war do jeito que eu queria. Mas isso também vai depender muito da estrutura do seu projeto.</p>
<p>Bem, acho que é isso. Depois é compilar todos os componentes e módulos flex, juntar tudo com o seu código fonte java,  empacotar o .war e <em>&#8220;voilà&#8221;, </em>temos o um projeto flex compilável.</p>
<p>Logo após as primeiras tentivas e alguns <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/OutOfMemoryError.html" target="_blank"><em>java.lang.OutOfMemoryError: Java heap space</em></a> , precisei configurar a quantidade de memória para utlização do ANT. No script de inicialização, <em>ant.bat</em>, adicionei a linha abaixo e o problema foi resolvido.</p>
<pre class="brush: xml;">
   ANT_OPTS=-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m
</pre>
<p>Mas depois foi só correr pro abraço&#8230;</p>
<p>De qualquer forma, eu conheço de flex o quanto jogo de futebol, então se quiserem uma referência mais segura em desenvolvimento flex, é melhor darem uma olhada no <a href="http://joaoaugusto.com.br/blog/" target="_blank">blog do John</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://coding4food.com/2010/03/17/cruisecontrol-com-svn-%e2%80%93-parte-02/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CruiseControl com SVN &#8211; Parte 01</title>
		<link>http://coding4food.com/2010/02/20/cruisecontrol-com-svn-parte-01/</link>
		<comments>http://coding4food.com/2010/02/20/cruisecontrol-com-svn-parte-01/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 04:54:36 +0000</pubDate>
		<dc:creator>Eduardo Kruger</dc:creator>
				<category><![CDATA[metodologia]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[integração contínua]]></category>

		<guid isPermaLink="false">http://coding4food.com/?p=350</guid>
		<description><![CDATA[Esse ano estamos tentando fazer algumas mundanças na Informant. Percebemos que usar quadros magnéticos, pregar post-it&#8217;s por toda empresa e fazer reuniões diárias não estavam nos fazendo mais &#8220;ágeis&#8221;, e na prática&#8230; pouca coisa era aplicada. Agora estamos buscando realmente implementar algo ágil nos nossos projetos. Estamos dandos os primeiros passos, mas muita coisa boa [...]]]></description>
			<content:encoded><![CDATA[<p>Esse ano estamos tentando fazer algumas mundanças na <a title="Informant" href="http://www.informant.com.br" target="_blank">Informant.</a> Percebemos que usar quadros magnéticos, pregar post-it&#8217;s por toda empresa e fazer reuniões diárias não estavam nos fazendo mais &#8220;ágeis&#8221;, e na prática&#8230; pouca coisa era aplicada. Agora estamos buscando realmente <a title="Agile Manifest" href="http://agilemanifesto.org/" target="_blank">implementar algo ágil</a> nos nossos projetos. Estamos dandos os primeiros passos, mas <a href="http://c2.com/cgi/wiki?ExtremeProgrammingRoadmap" target="_self">muita coisa </a><span class="aligncenter">boa está sendo planejada para este ano.</span></p>
<p><span class="aligncenter"> </span></p>
<p><span class="aligncenter">Uma das coisas que precisamos melhorar é a forma como trabalhamos com nosso repositório de fontes. Estamos modificando nossos procedimentos e nosso trabalho diário para manter nosso respositório mais confiável: <a href="http://c2.com/cgi/wiki?ContinuousIntegration" target="_blank">A</a> <a href="http://www.martinfowler.com/articles/continuousIntegration.html" target="_blank">Integração</a> <a href="http://improveit.com.br/xp/praticas/integracao" target="_blank">Contínua</a> é uma prática essencial do <a href="http://en.wikipedia.org/wiki/Extreme_Programming" target="_blank">XP</a>, que não se resume apenas a utilização de uma ferramenta, mas a automatização de build&#8217;s e deploy&#8217;s pode economizar muito tempo de desenvolvimento. Deixando o programador disponível para realizar o seu trabalho mais importante: programar.</span></p>
<p>Estamos começando a utilizar o <a title="CruiseControl Home" href="http://cruisecontrol.sourceforge.net/" target="_blank">CruiseControl, </a><span class="aligncenter">ferramenta que ainda não conhecia de perto. Apesar de já ter trabalhado com algumas ferramentas do gênero (ex.: <a title="Bamboo Home" href="http://www.atlassian.com/software/bamboo/" target="_blank">Bamboo</a>), o CC me impressionou bastante com relação a flexibilidade de configuração e implementação de planos de build. Para quem está perdendo muito tempo com liberação de versões, builds, deploys de aplicativos, e está pensando em utilizar o CC, vou repassar aqui os meus passos iniciais de configuração da ferramenta em ambiente Windows: </span></p>
<ol>
<li>Faça o <a href="http://cruisecontrol.sourceforge.net/download.html" target="_blank">download</a> da última release do CC, que atualmente é a 2.8.3 e descompacte vvocê achar melhor, por exemplo em <em>C:\java\cruisecontrol-bin-2.8.3</em></li>
<p><span> </span></p>
<li>O ideal é criar um diretório de trabalho configuração de seus projetos. (ex.: <em>C:\java\work\cruise</em>). Achei mais fácil iniciar o CC desta mesma workspace, por isso também copiei os arquivos <em>cruisecontrol.bat</em>, <em>config.xml</em> e <em>dashboard-config.xml</em> para o diretório <em>/cruise</em>. Bastando apenas fazer alguns acertos no <em>cruisecontrol.bat</em>, apontando o launcher do CC para o caminho correto (<em>C:/java/cruisecontrol-bin-2.8.3/lib/cruisecontrol-launcher.jar</em>).<em> </em>Nesse momento, você já poderá iniciar o CC. Apontando o seu navegador para <a href="http://localhost:8080/dashboard/tab/dashboard" target="_blank">http://localhost:8080/dashboard/tab/dashboard</a> já será possível acessar a ferramenta. Se tudo der certo, você deverá ver o Dashboard Server, que por enquanto, não terá nenhum projeto disponível.<em>Você deverá ter a variável JAVA_HOME também já configurada no seu Path.</em></li>
<p><span> </span></p>
<li>Agora precisamos configurar um projeto. No CC, todos os projetos são configurados a partir do arquivo <em>config.xml</em>. Quando trabalhamos com múltiplos projetos, é interessante manter a configuração de cada um deles em arquivos separados, para isso podemos alterar o <em>config.xml</em> para que fique da seguinte forma:
<pre class="brush: xml;">
&lt;!-- config.xml --&gt;
&lt;!DOCTYPE cruisecontrol [
   &lt;!ENTITY build-informantUtils SYSTEM &quot;projects/informantUtils-config.xml&quot;&gt;
   &lt;!ENTITY build-informantEJB SYSTEM &quot;projects/informantEJB-config.xml&quot;&gt;
]&gt;
&lt;cruisecontrol&gt;
    &lt;property file=&quot;config.properties&quot;/&gt;
    &lt;plugin name=&quot;svn&quot; classname=&quot;net.sourceforge.cruisecontrol.sourcecontrols.SVN&quot;/&gt;
    &lt;plugin name=&quot;svnbootstrapper&quot; classname=&quot;net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper&quot;/&gt;
    &lt;system&gt;
       &lt;configuration&gt;
           &lt;threads count=&quot;2&quot;/&gt;
       &lt;/configuration&gt;
    &lt;/system&gt;
    &amp;build-informantLibs;
    &amp;build-informantEJB;
&lt;/cruisecontrol&gt;
</pre>
</li>
<li>O meu objetivo inicial com a utilização do CC, era fazer o <em>build</em> <em> </em>automático das aplicações no nosso ambiente de testes sempre que alterações fosse efetivadas (commit), garantindo que nosso repositório esteja sempre compilando, e que a qualquer momento, tivéssemos uma versão disponível para liberação. Para isso, utilizamos o elemento <em>&lt;modificationset&gt;</em>, que determina como o CC procura por alterações no repositório e quando vai executar o <em>build</em> do projeto.
<pre class="brush: xml;">
&lt;!-- informantEJB-config.xml --&gt;
&lt;plugin name=&quot;svn&quot; classname=&quot;net.sourceforge.cruisecontrol.sourcecontrols.SVN&quot;/&gt;;
&lt;plugin name=&quot;svnbootstrapper&quot; classname=&quot;net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper&quot;/&gt;
    &lt;modificationset quietperiod=&quot;10&quot;&gt;
        &lt;svn localWorkingCopy=&quot;checkout/agil/${project.name}&quot;
             repositoryLocation=&quot;${svn.repository}/${svn.trunk}/InformantEJB&quot;
             username=&quot;${svn.user}&quot;
             password=&quot;${svn.passwd}&quot;&gt;
        &lt;/svn&gt;
    &lt;/modificationset&gt;
</pre>
<p>Assim monitoramos alterações do projeto no <em><a href="http://subversion.apache.org/packages.html" target="_blank">SVN</a></em> e quando o CC deverá fazer o build do projeto. Veja que é preciso indicar o respositório local do projeto (<em>localWorkingCopy</em>), para onde os fontes do projetos serão copiados e compilados no momento do build. Por isso é necessário criar um diretório de checkout local para os projetos no seu diretório de trabalho (ex.: <em>/work/cruise/checkout</em>)<br />
<em>Para tudo dar certo, ainda iremos precisar incluir os plugins do svn, conforme acima. Também será necessária instalar e garantir que o <a href="http://subversion.apache.org/packages.html" target="_blank">SVN</a> esteja no seu Path. </em></p>
<p><span> </span></li>
<li>Então utlizamos o elemento <em>&lt;schedule&gt;</em> com <em>interval=&#8221;300&#8243;</em>, para fazer com que o CC verifique o respositório do <em>SVN</em> a cada 5 minutos por novas modificações.  Além disso utilizamos o atributo <em>time=&#8221;2300&#8243;</em>, forçando com que um build seja executado diariamente as 23:00 horas. Nestes casos, o CC irá executar o script de build do projeto:  <em>build-file=&#8221;checkout\agil\build-${project.name.xml}&#8221;</em>
<pre class="brush: xml;">
&lt;!-- informantEJB-config.xml --&gt;
&lt;schedule  interval=&quot;500&quot; showProgress=&quot;true&quot;&gt;
     &lt;ant  antscript=&quot;${ant.home}\bin\ant.bat&quot;
           buildfile=&quot;checkout\agil\build-${project.name}.xml&quot;
           target=&quot;build-informantEJB&quot;
           uselogger=&quot;true&quot;
           usedebug=&quot;true&quot;
           time=&quot;2300&quot;/&gt;
&lt;/schedule&gt;
</pre>
<p><em> </em><em>Será necessário ter o <a href="http://ant.apache.org/" target="_blank">ant</a> instalado. O próprio CC  já vem com a versão 1.7.0 do ant, disponível no diretório de instalação do CC (C:/java/cruisecontrol-bin-2.8.3/apache-ant-1.7.0). </em></p>
<p><span> </span></li>
<li>Precisamos agora definir o diretório de logs do projeto. Crie um diretório de logs no seu diretório de trabalho (ex.: <em>C:/java/work/cruise/logs</em>). Isso é importante, porque o CC controla todo o histórico de builds e status (<em>buildstatus</em>) dos projetos em execução, através deste diretório de logs. Dentro do diretório de logs serão criados outros vários subdiretórios, um para cada projeto.<br />
E acrescente a configuração de log ao projeto:
<pre class="brush: xml;">
&lt;!-- informantEJB-config.xml --&gt;
&lt;log dir=&quot;logs/${project.name}&quot;/&gt;
</pre>
</li>
<li>Após cada build do projeto, geralmente um artefato é gerado. Um arquivo war, ear ou zip por exemplo. Neste caso, um arquivo .jar. Por isso é preciso definir uma diretório onde todos esses artefatos serão armazenados após um build realizado com sucesso. Crie um diretório para os artefatos gerados no seu diretório de trabalho (ex.: <em>C:/java/work/cruise/artifacts</em>).  Dentro do diretório de artefatos serão criados outros vários subdiretórios, um para cada projeto.<br />
Para dizer ao CC, onde e quais artefatos serão publicados, utilizamos o elemento &lt;artifactpublisher&gt;:
<pre class="brush: xml;">
&lt;!-- informantEJB-config.xml --&gt;
&lt;publishers&gt;
    &lt;artifactspublisher dir=&quot;checkout/agil/${project.name}/output&quot; dest=&quot;artifacts/${project.name}&quot;/&gt;
&lt;/publishers&gt;
</pre>
</li>
<li>Com o arquivo de configuração do projeto concluído (<em>projects/informantEJB-config.xml</em>), precisamos apenas do script de build do projeto, que será chamado pelo CC. No meu caso, ficou mais ou menos assim:
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
&lt;project basedir=&quot;.&quot; default=&quot;build-informantEJB&quot; name=&quot;informantEJB&quot;&gt;
    &lt;echo message=&quot;Project:informantEJB: Executando...&quot;/&gt;

    &lt;property file=&quot;build.properties&quot;/&gt;
    &lt;property name=&quot;svnant.latest.url&quot; value=&quot;${agil.svn.repository}/${agil.svn.trunk}/informantEJB&quot;/&gt;
    &lt;property name=&quot;local.repository&quot; value=&quot;informantEJB&quot;/&gt;

    &lt;path id=&quot;informant.libs&quot;&gt;
        &lt;fileset dir=&quot;libs/jars&quot;&gt;
  	   &lt;include name=&quot;**/*.jar&quot;/&gt;
	&lt;/fileset&gt;
    &lt;/path&gt;

    &lt;path id=&quot;jboss-runtime.libs&quot;&gt;
	&lt;fileset dir=&quot;../../dependencies/jboss-runtime/client&quot;&gt;
    	    &lt;include name=&quot;**/*.jar&quot;/&gt;
	&lt;/fileset&gt;
	&lt;fileset dir=&quot;../../dependencies/jboss-runtime/lib&quot;&gt;
 	    &lt;include name=&quot;**/*.jar&quot;/&gt;
	&lt;/fileset&gt;
    &lt;/path&gt;

    &lt;path id=&quot;ejb.libs&quot;&gt;
        &lt;path refid=&quot;informant.libs&quot;/&gt;
        &lt;path refid=&quot;jboss-runtime.libs&quot;/&gt;
    &lt;/path&gt;

    &lt;taskdef  resource=&quot;svntask.properties&quot;/&gt;
    &lt;target name=&quot;checkout&quot;&gt;
	&lt;echo message=&quot;${ant.project.name}: Fazendo checkout do respositorio ${svnant.latest.url}...&quot;/&gt;
	&lt;svn username=&quot;${agil.svn.user}&quot; password=&quot;${agil.svn.passwd}&quot;&gt;
  	    &lt;checkout url=&quot;${svnant.latest.url}&quot; revision=&quot;HEAD&quot; destPath=&quot;${local.repository}&quot; /&gt;
	&lt;/svn&gt;
    &lt;/target&gt;

    &lt;target name=&quot;mkdir&quot;&gt;
        &lt;mkdir dir=&quot;informantEJB/build/classes&quot;/&gt;
		&lt;mkdir dir=&quot;informantEJB/output&quot;/&gt;
        &lt;copy includeemptydirs=&quot;false&quot; todir=&quot;informantEJB/build/classes&quot;&gt;
            &lt;fileset dir=&quot;informantEJB/ejbModule&quot;&gt;
                &lt;exclude name=&quot;**/*.launch&quot;/&gt;
                &lt;exclude name=&quot;**/*.java&quot;/&gt;
            &lt;/fileset&gt;
        &lt;/copy&gt;
    &lt;/target&gt;

    &lt;target depends=&quot;checkout,mkdir&quot; name=&quot;compile&quot;&gt;
        &lt;echo message=&quot;${ant.project.name}: ${ant.file}&quot;/&gt;
        &lt;javac debug=&quot;true&quot;
	       debuglevel=&quot;${debug.level}&quot;
	       destdir=&quot;informantEJB/build/classes&quot;
	       source=&quot;${compile.source}&quot;
	       target=&quot;${compile.target}&quot;
	       classpathref=&quot;ejb.libs&quot;&gt;
            &lt;src path=&quot;informantEJB/ejbModule&quot;/&gt;
        &lt;/javac&gt;
    &lt;/target&gt;

    &lt;target depends=&quot;compile&quot; name=&quot;build-informantEJB&quot;&gt;
	&lt;echo message=&quot;${ant.project.name}: Gerando informantEJB.jar...&quot;/&gt;
	&lt;jar 	destfile=&quot;informantEJB/output/informantEJB.jar&quot;
		basedir=&quot;informantEJB/build/classes&quot;
		includes=&quot;**/*.class,**/*.xml&quot;&gt;
		&lt;manifest&gt;
      		    &lt;attribute name=&quot;Created-By&quot; value=&quot;Agil ERP&quot;/&gt;
		    &lt;attribute name=&quot;Manifest-Version&quot; value=&quot;1.0&quot;/&gt;
		    &lt;attribute name=&quot;Implementation-Vendor&quot; value=&quot;Informant&quot;/&gt;
		    &lt;attribute name=&quot;Implementation-Title&quot; value=&quot;Informant&quot;/&gt;
		    &lt;attribute name=&quot;Implementation-Version&quot; value=&quot;1.0&quot;/&gt;
		&lt;/manifest&gt;
	&lt;/jar&gt;
    &lt;/target&gt;
&lt;/project&gt;
</pre>
<p>O plano de build do projeto agora está OK: configuramos o <em>informantEJB-config.xml</em> para que execute o script de build (<em>build-informantEJB.xml</em>) quando alguma alteração for realizada no repositório. Além disso o CC irá executar também um build diário, as 23:00 horas.</li>
<li>Tudo certo agora?! NÃO.<br />
Mesmo que você faça um build manual do projeto através do CC ( <a href="http://localhost:8080/dashboard/tab/dashboard" target="_blank">http://localhost:8080/dashboard/tab/dashboard</a>), o status do projeto continuará inativo. Isso acontece porque criamos um diretório de trabalho em <em>C:/java/work/cruise</em>, onde serão armazenados os logs e artefatos do projeto. Mas o CC ainda não sabe disso.Crie um arquivo <strong>override.properties</strong> em <em>C:/java/cruisecontrol-bin-2.8.3/reporting/jsp</em> dessa forma:
<pre class="brush: xml;">
# This should be the full path to your CruiseControl log directory.
# If you are in multi-project mode, there will be multiple sub-directories
# inside this log directory, one for each project.
user.log.dir=C:/java/work/cruise/logs

# This should be the path to your current build status file, # expressed relative to the project's log directory.
user.build.status.file=C:/java/work/cruise/logs/buildstatus.txt

# This should be the absolute path to the directory where # additional build artifacts are stored.
cruise.build.artifacts.dir=C:/java/work/cruise/artifacts
</pre>
</li>
</ol>
<p>Essa é uma configuração bem básica. Mas já dá pra ter uma idéia do que pode ser feito. O CC foi implementado para ser extensível e flexível o suficiente para que você possa customizar quase tudo. Além disso, existem <a href="http://cruisecontrol.sourceforge.net/main/configxml.html" target="_blank">vários plugins</a> e <a href="http://confluence.public.thoughtworks.org/display/CC/3rdPartyCCStuff" target="_blank">outros add-ons</a> que podem ser utilizados pafa aumentar ainda mais as possibilidades de uso do framework.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 1596px; width: 1px; height: 1px;">&lt;!DOCTYPE cruisecontrol [<br />
&lt;!ENTITY build-informant SYSTEM "projects/informant-config.xml"&gt;<br />
&lt;!ENTITY build-informantLibs SYSTEM "projects/informantLibs-config.xml"&gt;<br />
&lt;!ENTITY build-informantUtils SYSTEM "projects/informantUtils-config.xml"&gt;<br />
&lt;!ENTITY build-displayTags SYSTEM "projects/struts2-displatTag-config.xml"&gt;<br />
&lt;!ENTITY build-informantWeb SYSTEM "projects/informantWeb-config.xml"&gt;<br />
&lt;!ENTITY build-informantEJB SYSTEM "projects/informantEJB-config.xml"&gt;<br />
&lt;!ENTITY build-informantEAR SYSTEM "projects/informantEAR-config.xml"&gt;<br />
&lt;!ENTITY deploy-informantEAR SYSTEM "projects/informantEAR-deploy-config.xml"&gt;<br />
]&gt;<br />
&lt;cruisecontrol&gt;&lt;property file=&#8221;config.properties&#8221;/&gt;<br />
&lt;plugin name=&#8221;svn&#8221; classname=&#8221;net.sourceforge.cruisecontrol.sourcecontrols.SVN&#8221;/&gt;<br />
&lt;plugin name=&#8221;svnbootstrapper&#8221; classname=&#8221;net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper&#8221;/&gt;<br />
&lt;system&gt;<br />
&lt;configuration&gt;<br />
&lt;threads count=&#8221;2&#8243;/&gt;<br />
&lt;/configuration&gt;<br />
&lt;/system&gt;<br />
&amp;build-informantLibs;<br />
&amp;build-informantUtils;<br />
&amp;build-displayTags;<br />
&amp;build-informantWeb;<br />
&amp;build-informantEJB;<br />
&amp;build-informantEAR;<br />
&amp;build-informant;<br />
&amp;deploy-informantEAR;<br />
&lt;/cruisecontrol&gt;</div>
]]></content:encoded>
			<wfw:commentRss>http://coding4food.com/2010/02/20/cruisecontrol-com-svn-parte-01/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
