<?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>Blog Informatico &#187; NCover</title>
	<atom:link href="http://www.bloginformatico.net/tag/ncover/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bloginformatico.net</link>
	<description>L'informatica come non l'avete mai letta</description>
	<lastBuildDate>Fri, 30 Apr 2010 16:23:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Continuous Integration con CruiseControl.net &#8211; Introduzione</title>
		<link>http://www.bloginformatico.net/2009/03/06/continuous-integration-con-cruisecontrolnet-introduzione/</link>
		<comments>http://www.bloginformatico.net/2009/03/06/continuous-integration-con-cruisecontrolnet-introduzione/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 21:51:59 +0000</pubDate>
		<dc:creator>Massimo</dc:creator>
				<category><![CDATA[In rilievo]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[CruiseControl.net]]></category>
		<category><![CDATA[FxCop]]></category>
		<category><![CDATA[NAnt]]></category>
		<category><![CDATA[NCover]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[SandCastle]]></category>
		<category><![CDATA[Simian]]></category>
		<category><![CDATA[SourceMonitor]]></category>
		<category><![CDATA[StyleCop]]></category>

		<guid isPermaLink="false">http://www.bloginformatico.net/?p=88</guid>
		<description><![CDATA[Con questo primo articolo iniziamo una serie di incontri sul Continuous Integration.]]></description>
			<content:encoded><![CDATA[<p>Con questo primo articolo iniziamo una serie di incontri sul Continuous Integration. In particolare, dopo una prima panoramica sui concetti base, entreremo nel vivo con dettagli tecnici dedicati alla messa in opera di un sistema di Continuous Integration con <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CruiseControl.net</a> su piattaforma Microsoft .Net Framework.<span id="more-88"></span></p>
<p>Indice degli articoli</p>
<ol>
<li> Introduzione (questo articolo)</li>
</ol>
<h4>Che cosa è il Continuous Integration</h4>
<p>Il Continuous Integration(abbreviato anche con CI) è una pratica di sviluppo principalmente orienta al software.  Pratica che è emersa soprattutto negli ultimi anni grazie anche alla grande diffusione di metodologie come l’<a href="http://it.wikipedia.org/wiki/Extreme_Programming">Extreme Programming</a> e ad importanti sostenitori come <a href="http://martinfowler.com/">Martin Folwer</a>. Con pratica si intende una serie di metodi e di strumenti atti a migliorare la qualità del codice, la velocità dei tempi di rilascio e in generale a migliorare la coesione del gruppo di sviluppo. I principi alla base dell’<a href="http://it.wikipedia.org/wiki/Extreme_Programming">Extreme Programming</a> non sono oggetto di questo articolo.  Invito dunque ad approfondire questo argomento con i link e i libri suggeriti nella sezione Linkografia &amp; Bibliografia a fondo articolo.<br />
Entriamo nel dettaglio. Per introdurre il discorso utilizzerò le stesse parole di <a href="http://martinfowler.com/">Martin Fowler</a> riportando la traduzione del suo articolo introduttivo sul Continuous Integration:</p>
<blockquote>
<p style="text-align: right;">“Il Continuous Integration è una pratica di sviluppo software, dove i membri del team integrano il loro lavoro frequentemente, normalmente ogni persona integra il proprio lavoro almeno una volta al giorno, il che conduce a più di una integrazione al giorno. Ogni integrazione è verificata da una build automatica (test inclusi) che rileva errori di integrazione il più velocemente possibile. Molti team trovano che questo approccio conduca ad una significativa riduzione dei problemi di integrazione, permettendo al team di sviluppare software coeso più rapidamente.”</p>
</blockquote>
<p style="text-align: right;"><a href="http://martinfowler.com/">Martin Fowler</a> da <a href="http://martinfowler.com/articles/continuousIntegration.html">Continuous Integration</a> , 2006</p>
<p>In altri termini, ogni modifica apportata al codice dell’applicazione, da ogni singolo membro del team di sviluppo, viene <em>integrata</em> attraverso un processo di build che ne verifica, in tempi brevi, la qualità e la coesione con il resto del codice. E’ importante capire il concetto build.</p>
<p><a href="http://en.wikipedia.org/wiki/Software_build">Build</a> (letteralmente costruzione) è quell’insieme di operazioni che permettono di combinare diversi componenti software  in un singolo sistema. In una visione ristretta questo può coincidere con un processo di compilazione dove il codice sorgente viene validato, linkato e compilato. La build così concepita è tipica dei linguaggi compilati, anche se, con alcune differenze, è applicabile anche ai linguaggi interpretati. In una visione più ampia, però, il processo di build può essere pensato come una complicata attività di configurazione, esecuzione ed integrazione di programmi e di sistemi più complessi. La build così come concepita nel Continuous Integration è molto più simile a quest’ultima definizione.</p>
<p>Con queste premesse si può certamente concludere che il Continuous Integration diventi così parte indispensabile del processo di sviluppo, di mantenimento e di distribuzione di un software applicativo.</p>
<h4>Come funziona il Continuous Integration</h4>
<p>Per mettere in pratica il Continuous Integration è necessario adottare, nel proprio lavoro quotidiano, una serie di abitudini e di eseguire alcune attività con l&#8217;ausilio anche di appositi strumenti software. Eccone un elenco:</p>
<ol>
<li><strong>Dotarsi di un repository centrale dove depositare tutto il codice sorgente del programma.</strong><br />
Per fare questo possiamo utilizzare un qualsiasi sistema di controllo versione (o SCM &#8211; <a href="http://en.wikipedia.org/wiki/Source_Code_Management">Souce Code Management</a>) come <a href="http://subversion.tigris.org/">Subversion</a>, <a href="http://git-scm.com/">Git</a>, <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a>, <a href="http://www.nongnu.org/cvs/">CVS</a> o <a href="http://msdn.microsoft.com/en-us/library/aa302175.aspx">Microsoft Visual SourceSafe</a>. L&#8217;operazione di deposito del proprio lavoro sul repository è detto <em><span style="text-decoration: underline;">commit</span></em>.</li>
<li><strong>Automatizzare la build attraverso strumenti software.</strong><br />
Per fare questo abbiamo la possibilità di scegliere tra prodotti opensouce o commerciali. Nei nostri articoli ci concentreremo su <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CruiseControl.net</a>, un prodotto opensouce di <a href="http://www.thoughtworks.com/">ThoughtWorks</a>. Tra i prodotti commerciali mi sento di consigliare <a href="http://www.jetbrains.com/teamcity/">TeamCity</a> di <a href="http://www.jetbrains.com/">JetBrain</a> (stesso produttore nel noto plugin per Microsoft Visual Studio, Reshaper) che oltre ad essere multi piattaforma è disponibile gratuitamente nella versione Professional.</li>
<li><strong>Includere test automatici nel processo di build.</strong><br />
In generale è buona norma dotarsi di un numero adeguato di test automatici attraverso l&#8217;utilizzo di metodologie come il <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD (Test-Driver Development)</a> e di appositi framework di unit test come <a href="http://www.nunit.org/">NUnit</a>, <a href="http://www.codeplex.com/xunit">xUnit</a>, <a href="http://msdn.microsoft.com/en-us/library/ms182409(VS.80).aspx">MSTest</a> o <a href="http://www.mbunit.com/">MbUnit</a>. Solo per citarne alcuni di quelli nativi per il .Net Framework. Per una lista completa, anche per altri linguaggi, consultare la sezione Linkografia &amp; Bibliografia.</li>
<li><strong>Depositare quotidianamente il lavoro svolto sul repository.</strong><br />
E&#8217; importante che tutto il team di sviluppo segua questa regola fondamentale. Questo è un concetto chiave del CI. Il lavoro svolto deve essere, almeno quotidianamente, <em>integrato </em>con il resto dell&#8217;applicativo in modo da verificarne la correttezza. Personalmente consiglio il <em>commit</em> del proprio lavoro sul repository al termine di ogni singolo task completato.</li>
<li><strong>E&#8217; importante che la mainline (o trunk o basecode) rimanga in uno stato corretto.</strong><br />
Il codice sorgente che fa parte del codice base di sviluppo è detto <em>mainline</em> o <em>trunk</em> (in subversion) o in più generale <em>basecode</em>. Il commit di un programmatore può generare degli errori che fanno fallire il processo di build della mainline. Se questo accade è importante correggere tempestivamente queste problematiche, in modo da mantere la mainline di sviluppo sempre perfettamente integrata e corretta. In questo senso è bene che un programmatore non termini la propria giornata lavorativa senza aver prima sistemato gli eventuali problemi di un commit sul trunk.</li>
<li><strong>Mantenere la build della mainline leggera.</strong><br />
Questo semplice concetto racchiude in sé un aspetto importante. Quando eseguo il <em>commit</em> di un pezzo di codice è essenziale avere il risultato dell&#8217;integrazione in tempi brevi. In questo modo posso correggere i problemi tempestivamente.</li>
<li><strong>Il team deve essere sempre informato sullo stato di integrazione.</strong><br />
In questo senso ci viene incontro <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CrusiControl.net</a> che ad ogni integrazione invia una mail di responso a tutto il team. Inoltre <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CruisControl.net</a> possiede una comodissima interfaccia di amministrazione via web dove è possibile monitorare la situazione delle build ed eseguire vari tipi di attività.</li>
<li><strong>Automatizzare il processo di distribuzione.</strong><br />
Inteso anche e soprattutto come creazione automatica del programma di installazione del proprio applicativo. Per fare questo sono disponibili moltissimi strumenti come <a href="http://nsis.sourceforge.net/">NSIS</a>, <a href="http://www.innosetup.com">InnoSetup</a> e <a href="http://www.acresso.com/products/is/installshield-overview.htm">InstallShield</a>.</li>
</ol>
<h4>Cosa vedremo nei prossimi articoli</h4>
<p>Nei prossimi articoli ci focalizzeremo sui punti 2, 3, 6, 7 e 8. Vedremo quindi tutta la fase pratica di installazione e configurazione di <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CruiseControl.net</a>, come configurarlo per un tipico progetto Microsoft .Net. Nello specifico andremo ad impostare il processo di build per ottenere i seguenti risultati:</p>
<ol>
<li>3 progetti in CruiseControl.net, uno per l&#8217;integrazione continua, una per le metriche sul codice e una di deploy.</li>
<li>Integrazione degli Unit Test con NUnit e NAnt</li>
<li>Analisi qualità del codice e del design con Microsoft FXCop &amp; Microsoft StyleCop</li>
<li>Coverage degli Unit Test con NCover</li>
<li>Varie metriche sul codice sorgente con SourceControl</li>
<li>Ricerca del codice duplicato con Simian</li>
<li>Generazione della documentazione con SandCastle</li>
</ol>
<h4>Linkografia &amp; Bibliografia</h4>
<h5>Continuous Integration</h5>
<ol>
<li><a href="http://martinfowler.com/articles/continuousIntegration.html">Articolo sul Continuous Integration di Martin Fowler</a></li>
<li><a href="http://en.wikipedia.org/wiki/Continuous_Integration">Definizione di Continuous Integration su Wikipedia Inglese</a></li>
<li><a href="http://confluence.public.thoughtworks.org/display/CCNET/What+is+Continuous+Integration">Definizione di Continuous Integration sul sito CruiseControl.net</a></li>
<li><a href="http://www.amazon.com/Continuous-Integration-Improving-Addison-Wesley-Signature/dp/0321336380">Libro: Continuous Integration: Improving Software Quality and Reducing Risk</a></li>
<li><a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670">Libro: Code Complete: A Practical Handbook of Software Construction</a></li>
<li><a href="http://en.wikipedia.org/wiki/Software_build">Definizione di Software Build su Wikipedia Inglese</a></li>
</ol>
<h5>Extreme Programming</h5>
<ol>
<li><a href="http://it.wikipedia.org/wiki/Extreme_Programming">Definizione di Extreme Programming su Wikipedia Italia</a></li>
<li><a href="http://en.wikipedia.org/wiki/Extreme_Programming">Definizione di Extreme Programming su Wikipedia Inglese</a></li>
<li><a href="http://www.extremeprogramming.org/">Sito web ufficiale del movimento Extreme Programming</a></li>
</ol>
<h5>Repository (Controllo di versione o SCM &#8211; Source Code Management)</h5>
<ol>
<li><a href="http://it.wikipedia.org/wiki/Subversion">Definizione di Subversion su Wikipedia Italia</a></li>
<li><a href="http://it.wikipedia.org/wiki/Concurrent_Versions_System">Definizione di CVS su Wikipedia Italia</a></li>
<li><a href="http://it.wikipedia.org/wiki/Git_(software)">Definizione di Git su Wikipedia Italia</a></li>
<li><a href="http://it.wikipedia.org/wiki/Controllo_versione">Definizione di Controllo di Versione su Wikipedia Italia</a></li>
<li><a href="http://en.wikipedia.org/wiki/Source_Code_Management">Definizione di SCM &#8211; Souce Code Management su Wikipedia Inglese</a></li>
</ol>
<h5>Continuous Integration Software</h5>
<ol>
<li><a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">ThoughtWorks CruiseControl.net</a></li>
<li><a href="http://www.jetbrains.com/teamcity/">JetBrain TeamCity</a></li>
</ol>
<h5>Unit Test &amp; TDD</h5>
<ol>
<li><a href="http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks">Lista di framework di Unit Test</a></li>
<li><a href="http://en.wikipedia.org/wiki/Test-driven_development">Definizione di TDD (Test-Driver Development) su Wikipedia Inglese</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.bloginformatico.net/2009/03/06/continuous-integration-con-cruisecontrolnet-introduzione/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
