<?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; integração contínua</title>
	<atom:link href="http://coding4food.com/tag/integracao-continua/feed/" rel="self" type="application/rss+xml" />
	<link>http://coding4food.com</link>
	<description>software development and IT stuff</description>
	<lastBuildDate>Sun, 26 Dec 2010 12:46:15 +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[<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fcoding4food.com%2F2010%2F03%2F17%2Fcruisecontrol-com-svn-%25e2%2580%2593-parte-02%2F&amp;text=CruiseControl com SVN – Parte 02&amp;count=vertical&amp;lang=en&amp;related=integra%C3%A7%C3%A3o+cont%C3%ADnua,programa%C3%A7%C3%A3o"><img src="http://coding4food.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<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[<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fcoding4food.com%2F2010%2F02%2F20%2Fcruisecontrol-com-svn-parte-01%2F&amp;text=CruiseControl com SVN &#8211; Parte 01&amp;count=vertical&amp;lang=en&amp;related=integra%C3%A7%C3%A3o+cont%C3%ADnua"><img src="http://coding4food.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<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>

