<?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; programação</title>
	<atom:link href="http://coding4food.com/category/programacao/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>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>
		<item>
		<title>As falácias da programação</title>
		<link>http://coding4food.com/2008/09/28/as-falacias-da-programacao/</link>
		<comments>http://coding4food.com/2008/09/28/as-falacias-da-programacao/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 00:49:16 +0000</pubDate>
		<dc:creator>Eduardo Kruger</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[falácias]]></category>
		<category><![CDATA[metodologia]]></category>

		<guid isPermaLink="false">http://coding4food.com/?p=180</guid>
		<description><![CDATA[Ouvir outras opniões, principalmente àquelas totalmente contrárias as suas é muito importante, seja para que você reforçe seus ideais ou simplesmente para que você reveja seus conceitos. Geralmente, quando tenho &#8220;absoluta certeza&#8221; de algo, procuro por uma segunda opnião, um outro ponto de vista. Isso porque, em TI, ter certeza absoluta sobre alguma coisa, me [...]]]></description>
			<content:encoded><![CDATA[<p>Ouvir outras opniões, principalmente àquelas totalmente contrárias as suas é muito importante, seja para que você reforçe seus ideais ou simplesmente para que você reveja seus conceitos. Geralmente, quando tenho &#8220;absoluta certeza&#8221; de algo, procuro por uma segunda opnião, um outro <a href="http://pt.wikipedia.org/wiki/Perspectiva_(cognitiva)" target="_blank">ponto de vista</a>. Isso porque, em TI, ter certeza absoluta sobre alguma coisa, me assusta.</p>
<p>Mas sinceramente, algumas coisas não tenho mais paciência pra escutar. Não sei se estou ficando velho. Não sei se estou ficando muito rabujento. Talvez sejam ambas as coisas. Quando se está a algum tempo &#8220;fazendo programas&#8221;, você acaba apreedendo muita coisa boa, mas principalmente, acaba identificando tudo aquilo que NÃO SE DEVE FAZER em desenvolvimento de software.<br />
Vou descrever abaixo algumas frases clássicas que provavelmente você já ouviu em alguma reunião, tech-talk ou de algum gerente &#8220;espertão&#8221;.</p>
<ol>
<li><strong>Programador não é pago pra pensar, é pago pra programar. </strong>Essa já perdeu a graça. Sério. Se seu gerente ainda acha que programação é simplesmente um processo mecânico e repetitivo, diga a ele para contratar <a href="http://en.wikipedia.org/wiki/Infinite_monkey_theorem" target="_blank">um milhão de macacos para fazer o trabalho</a>. Bem mais barato.<br />
Por favor, não importa qual o nome que as empresas dão a ele: desenvolvedor, programador, analista-programador, mas esse cara deve ser capaz de identificar requisitos e implementar soluções. E muito mais que isso, deve ter noções de arquitetura de software, deve conhecer as tecnologias e ferramentas que utiliza, se preocupar com requisitos não-funcionais, escalabilidade, etc. <span class="postbody">Não é necessário ser um &#8220;super-homem&#8221; auto-didata, mas precisa ter flexibilidade suficiente para participar de reuniões com o cliente e ter conhecimento técnico para implementar uma solução. E de qualquer forma, em desenvolvimento de software, <a href="http://en.wikipedia.org/wiki/Code_monkey" target="_blank">code monkeys </a>nunca foram uma opção.</p>
<p></span></li>
<li><strong>Programador deve apenas codificar o que está especificado.</strong><br />
Se a empresa que você trabalha tem um &#8220;analista&#8221; que pensa no que precisa ser feito, escreve um monte de diagramas numa linguagem de modelagem (a.k.a UML) e depois passa para um &#8220;programador&#8221; que apenas codifica em linguagem executável o que foi especificado, acho que seria interessante seu gerente dar uma olhada <a href="http://www.cs.umd.edu/class/spring2003/cmsc838p/Process/waterfall.pdf" target="_blank">nisso aqui</a>. E se esta abordagem fosse realmente eficiente/eficaz, os relatorios do <a href="http://www.standishgroup.com/" target="_blank">Standish Group</a> não estariam <a href="http://www.projectsmart.co.uk/docs/chaos-report.pdf" target="_blank">desse jeito</a>.<br />
Programador não baixa a cabeça e sai codificando. Programador deve saber o &#8220;porque&#8221; está implementando algo. Deve saber o contexto do problema e saber quais as necessidades dos stakeholders. Programador avalia soluções. Sugere melhorias. Critica requisitos de negócio. Ao contrário do que pregam muitas consultorias por aí, BONS PROGRAMADORES SEMPRE SERÃO FUNDAMENTAIS.<br />
<span></p>
<p></span></li>
<li><strong>Mas é apenas uma &#8220;alteraçãozínha&#8221; !!!</strong><br />
Pelo amor de Deus, não existe uma &#8220;alteraçãozinha&#8221; em TI. Por melhor que seja o design de suas classes. Por mais bem escrito que sejam seus componentes. Por mais simples que seja o seu ambiente de desenvolvimento, uma &#8220;alteraçãozinha&#8221; sempre irá envolver esforços de programação, testes e build para produção. Quanto a isso, independente das metodologia, frameworks ou ferramentas empregadas, não se pode fazer mágica.<br />
Se você trabalha num ambiente um pouco mais ágil (a.k.a SCRUM), é bem provável que você irá conseguir responder mais rapidamente a mudanças de requisitos, e o tratamento de alterações de código fonte serão mais tranquilas. Mas se você trabalha numa empresa que possui milhares de fases de desenvolvimento, artefatos, papelada e burocracia, a alteração de um &#8220;label&#8221; em produção pode se tornar uma tarefa sofrível.<br />
<span></p>
<p></span></li>
<li><strong>Está pronto, só falta testar !!!</strong><br />
Essa é clássica. Se você tem algum trecho de código que não foi coberto por testes&#8230; bem&#8230; você tem apenas código fonte.<em> </em></p>
<p><em>- Pronto, terminei !!!<br />
- Que bom !!! Posso ver como ficou ?!<br />
- Não.. não&#8230;não testei isso ainda..!!!</em><em><br />
- Humm ?!</em><br />
<em><br />
</em>Qualquer framework, componente ou serviço que se preze, deve ser no mínimo, verificável. E isso não aprendi na faculdade. Foi a tia Perivalda que me ensinou, a muito tempo atrás, nas aulas práticas de ciências: <em>se um experimento não pode ser verificável, então é apenas um modelo teórico.</em><br />
Qualquer alteração num sistema, deve ser acompanhado por no mínimo, um caso de testes. É fundamental que este mesmo sistema, tenha um conjunto de testes unitários e teste integrados que me permitam dizer se algo está errado.<br />
A muito tempo deixei de acreditar naqueles que dizem que os testes são outra &#8220;fase&#8221; do processo e que programador não se envolve com testes, apenas codifica. <a href="http://blog.fragmental.com.br/2007/10/31/programadores-profissionais-escrevem-testes-ponto-final/" target="_blank">Programadores escrevem testes, e ponto final</a>. <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a>, por exemplo, é uma ótima abordagem que permite o desenvolvimento de sistemas &#8220;testáveis&#8221; e vericáveis.</p>
<p>Por ora, essas são algumas das pérolas da programação que me vêm à memória. E mesmo que esse post tenha ficado com cara de &#8220;desabafo&#8221;, é bem possível que ainda escreva uma continuação para ele&#8230;</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://coding4food.com/2008/09/28/as-falacias-da-programacao/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
