Webclient for SVN, Hudson e Artifactory

Salve a tutti, in questi giorni mi sono addentrato ancora nel mondo del continuous integration perchè sto lavorando su un progetto in Java, gestito in outsourcing, dove aiuto un gruppo di sviluppatori ad utilizzare strumenti di sviluppo che facilitano il lavoro quali un sistema di continuos integration.

Sono partito da un progetto con subversion installato su una macchina e so che nel progetto usano Jboss con JDK 1.5 (ancora non so perchè)

Su un’altra macchina remota vado e installo JDK 1.5.0.22, Ant 1.7.1, Maven 2.2.1 (fino ad ora (2 mesi di progetto) hanno usato solo Ant e vorrebbero passare a Maven), Jboss 5.1.0, Webclient for SVN 3.1.0 e Artifactory 2.1.2.

Piccola nota: volevo usare Sventon ma l’ultima versione aveva problemi con le librerie e le precedenti mi davano anch’esse problemi.

Non sapete cosa è Artifactory ??? Allora è possibile che siete ancora freschi su Maven (non è che io non lo sia :-) )

Artifactory è una applicazione web che permette di gestire repository Maven, sviluppata in Java e rilasciata con licenza LGPL 3.0. L’applicazione è realizzata da JFrog Ltd, una società privata isreliana.

Strutturalmente si poggia su Apache Jackrabbit per l’implemetazione delle specifiche JSR 170 per il cosiddetto Java Content Repository (anche altri content manager come Nuxeo si appoggiano su Jackrabbit).

Piccola nota: la JSR 170 (rilasciata nel 2005) è seguita dalla JSR 283 da poco rilasciata (25 Settempre 2009) ed entrambe sono condotte da David Nuescheler, CTO della società svizzera Day Software.

Inoltre Artifactory si basa su Apache Lucene per indicizzare i file e Apache Wicket per l’interfaccia utente.

Ora l’applicazione è rilasciata come standalone ma esiste la versione war che può essere deployata su un application server e quindi l’ho messa su Jboss insieme ad Hudson e Webclient for SVN (questi 2 li ho poi legati con il plugin di hudson per Polarion che permette di linkare la lista di file modificati ai file presenti sul webclient e si possono anche vedere le differenze con le versioni precedenti).

La struttura è basata anche su database, di default Apache Derby ma che può essere cambiato (vedi anche qui).

A parte il fatto che Artifactory permette di base una autenticazione LDAP, quello che lascia senza parole è la semplicità di uso (andrebbe confrontato con Nexus ma non ne ho tempo, di sicuro nella versione base manca LDAP (anche se ho scoperto di recente che esiste un plugin di terze parti) e di sicuro gli sviluppatori hanno realizzato una bella guida a maven e un plugin per Eclipse). Una volta andato su

http://localhost:8080/artifactory

e loggato, sono andato sul pannello amministrativo e nella sezione repository ho creato un repository locale dove fare il deploy dei propri jar file e un repository virtuale in cui aggiungo quello locale più tutti i remoti quali quello di Maven, Jboss ecc ecc. Fatto ! Ora potete generare anche la sezione del file settings.xml da aggiungere nel vostro progetto Maven.

Per una vecchia guida vi rimando qui. Per un confronto con Nexus e Archiva vi rimando a questo link (attenzione è scritto dallo stesso autore della guida su Artifactory ma sembra serio)

Buon maven a tutti !

Nota: Webclient for SVN si basa su Subversion 1.4 (con versioni successive ho avuto problemi perchè usa un SVNKit vecchio che non posso aggiornare perchè c’è una particolare classe non più presente nelle ultime versioni), potete trovare Subversion 1.4 qui:

http://downloads-guests.open.collab.net/servlets/ProjectDocumentList?folderID=6

Raccogliere dati sul repository Subversion: WebSVN e StatSVN

Probabilmente in molti hanno provato a configurare Apache per poter vedere un repository di Subversion con una delle classiche configurazioni come la seguente che ho realizzato su di un server a disposizione:

<Location /svn/repos>
   DAV svn
   SVNPath /home/svn/repos
   AuthType Basic
   AuthName "Subversion Repository"
   AuthUserFIle /home/emidio/.htpasswd
   Require valid-user
</Location>

configurazione che va messo in /etc/apache2/mods-available/dav_svn.conf dove /home/svn/repos è il vero e proprio repository subversion mentre .htpasswd contiene il file utenti/password per l’autenticazione. Per maggiori informazioni leggete la pagina di manuale.

Cosi se poi andate su htttp://localhost/svn/repos potete scorrere il vostro repository usando il browser e conoscendo solo lo stato dell’ultima revisione.

Oggi vi presento 2 strumenti interessanti a chi ha un progetto condiviso con Subversion: WebSVN e StatSVN.

WebSVN è una applicazione PHP (richiede minimo PHP 4.3.0) rilasciata con licenza GPL che vi permette di monitorare, tramite pagine web la struttura del vostro repository Subversion (richiede minimo SVN 1.2.0).

In pratica potete vedere l’ultima revisione del progetto, autore e log message sul lato sinistro e sulla destra potete scorrere tra le cartelle e file del repository che potete monitorare tramite RSS feed.

Cartelle e file sono indicati dal loro numero di revisione; selezionando un file vedete la sua ultima revisione ma se cliccate su View Log ad esempio vedete la lista delle sue revisioni che potete vedere una per una (Details) o confrontare tramite una piacevole interfaccia grafica.

Eccovi un link dove viene spiegato in breve come installarlo su Linux (l’ho testato su Ubuntu 8.10). Per Subversion ho anche usato questo link. In pratica dovete copiarlo nella cartella /var/www servita da Apache e cambiare il file di configurazione puntando a subversion (/usr/bin) e alla cartella padre del repository di Subversion (nel mio caso avendo il repository in /home/svn/repos ho indicato il path /home/svn).

Per abilitare gli RSS feed dovete settare i permessi della cartella /var/www/websvn/cache a 777 (ho provato 700 e 770 ma mi dava problemi di permessi).

La cosa carina è che avete il syntax highlighting (l’ho provato su codice PHP, file CSS, file javascript, perl) che è basato di default su GeSHI che supporta molti linguaggi altrimenti potete usare Enscript 1.6 o superiore (insieme a Sed) che deve essere già installato sul sistema.

Ulteriori info le trovate in locale  su: http://localhost/websvn/doc/install.html

StatSVN è invece una applicazione Java (file jar compresso in un file zip di appena 2.4 mega) rilasciata con licenza LGPL che genera statistiche dettagliate sul repository subversion. Arrivato il 22 maggio scorso alla versione 0.5.0, StatSVN ha ora la possibilità di essere usato tramite Twitter.

La cosa interessante che ho notato nel manuale è che si può integrare con Bugzilla, Mantis e Trac.

Il sommario delle statistiche lo vedete dalla pagina principale index.html che vi mostra:

  • quando è stato generato il report
  • ultima revisione
  • su che periodo si basa
  • numero totale di file
  • numero totale di linee di codice
  • numero di sviluppatori
  • un collegamento a Twitter
  • un menu che mostra maggiori dettagli
  • il grafico sommario delle linee di codice
  • la tag cloud delle parole usate nei messaggi di log
  • la struttura gerarchica delle directory, dove per ognuna vedete il numero di file e le linee di codice contenuti.

Nota: I grafici sono realizzati tramite JFreeChart.

Nel menu dei dettagli vedete ad esempio, quante linee di codice ha scritto un particolare autore, il numero di commit per ora e giorno della settimana,i log dei commit, che tipi di file ci sono ordinati per loro numero (1o file php, 4 xml ecc.) e quante linee di codice in media ci sono per ogni tipo, lista dei file più grandi e più revisionati, tabella e grafico a torta delle dimensioni delle cartelle e tanto altro.

Per vedere una demo subito andate a questo link oppure potete vedere anche la demo su progetti come Ant, Apache Synapse, Apache Continuum, Ruby.

Non c’è in pratica installazione (ha bisogno almeno di SVN 1.3) dove lanciarlo nel seguente modo come indicato nel manuale:

svn co svn://server/repo/trunk/modulename
svn log -v –xml > logfile.log
java -jar /path/to/statsvn.jar /path/to/module/logfile.log /path/to/module

In pratica dovete fare un checkout del progetto, generare il file di log e sulla base del path indicato eseguire il file statsvn.jar.

Sarebbe bello però rendere automatica la procedura ed ecco che ho pensato a come integrarlo con Hudson e ho notato che qualcuno ci ha provato ma senza successo, io ho ripreso la sua configurazione e l’ho leggermente modificata.

Ho copiato prima di tutto il file statsvn.jar nella cartella lib di Apache Ant in modo che sia raggiungibile dalla variabile di ambiente ANT_HOME che punta alla directory di Ant.

Poi sono andato nel file build.xml della mia applicazione in Netbeans e ho notato che importa il file build-impl.xml che ha al suo interno una lunga serie di target. Tra le dipendenze del target default ho aggiunto statsvn-clean, statsvn e alla fine del file (prima della chiusura del tag </project>) ho aggiunto:

<taskdef name=”statsvn” classname=”net.sf.statsvn.ant.StatSvnTask”/>

<!– output directory for reports –>
<property name=”StatSVNReportDir” value=”statsvn”/>

<target name=”statsvn-clean” description=”resets to a clean state”>
<delete dir=”${StatSVNReportDir}” failonerror=”no”/>
</target>

<target name=”statsvn” description=”Does SVN repository statistics.”>
<echo message=”Metrics: running statsvn …”/>

<delete file=”${StatSVNReportDir}/svn-log.xml” />
<mkdir dir=”${StatSVNReportDir}” />

<exec executable=”svn” dir=”${src.dir}” output=”${StatSVNReportDir}/svn-log.xml” searchpath=”true” >
<arg line=”log –xml –verbose” />
</exec>

<statsvn
log=”${StatSVNReportDir}/svn-log.xml”
path=”..”
outputDir=”${StatSVNReportDir}/html” />

</target>

Ho poi fatto il commit di questo file sul repository SVN e così Hudson (che è impostato per fare il polling di Subversion) lo cattura e, poichè è impostato di fare il build periodicamente, mi genera anche la cartella statsvn (vedi proprietà StatSVNReportDir sopra) dell’ultimo build con tutte le descrizioni dettagliate. Come vedete come path gli ho indicato “..” per specificare la root del progetto in quanto non tutti i file del progetto si trovano nella cartella src come, ad esempio, le pagine jsp che normalmente le trovate nella cartella web.

A questo punto non mi resta che augurarvi buone statistiche !

Nota: ho usato Subversion 1.6.2, Hudson 1.296 e Ant 1.7.0

Sperimentando con Netbeans, Glassfish, Hudson e Subversion

Ho cominciato a scrivere qualche applicazione web con Netbeans 6.1 (penso di migrare presto (magari anche oggi) alla versione 6.5) e ho preso ad esempio il tutorial:

http://www.netbeans.org/kb/docs/web/quickstart-webapps.html

Il tutorial spiega come creare un paio di pagine Jsp facendo uso di una classe java usata come java bean, benchè dicono che richiede Netbeans 6.5 io ho usato tranquillamente Netbeans 6.1. Inoltre, durante il wizard, dovete specificare dove si trova Glassfish; ho preferito usare la mia istanza di Glassfish 2.1 scaricato a parte.

A parte ciò era mia intenzione di installare un server subversion e farne il polling tramite Hudson.

Ho trovato questo tutorial che spiega passo passo come prendere confidenza con Subversion; il tutorial suggerisce per Mac OS X di prendere Subversion da qui. Il pacchetto include Subversion 1.6.2 client e server (una volta installato potete provare i comandi svn –version e svnserve –version). Subversion mi si è installato in /opt/subversion/bin e non /usr/local/bin come descritto nella pagina di Collabnet; dovete quindi aggiungere il path /opt/subversion/bin nella variabile di ambiente PATH (che ho specificato nel file .bash_profile che si trova nella cartella utente).

Dopo aver giocato con il tutorial ho cercato subito di connettere Netbeans e Subversion e ho impostato in Preferences->Miscellaneous-> Versioning -> Subversion il path /opt/subversion/bin lasciando le altre impostazioni inalterate.

Inoltre ho poi cliccato con il tasto destro del mouse sulla cartella del progetto e sono nel menu contestuale sono andato in Versioning ->Import into Subversion Repository dove dovete specificare più che altro il path del repository che nel mio caso era:

file:///Users/emidiostani/SVNrep

(ho usato il repository creato con il tutorial su subversion)

Durante il wizard ho avuto un errore del tipo:

Expected FS format between ‘2’; found format ‘4’

che ho risolto facendo l’upgrade del plugin per subversion dalla versione 1.3 alla 1.3.1, difatti se andate nel repository (nel mio caso la cartella SVNrep) c’è il file /db/format che dice la versione del db interna è 4, in pratica non c’è accordo da tra client in netbeans e il server (noto che in Netbeans 6.5 potrebbe esserci lo stesso problema, vedere qui).

Sono poi andato su Hudson (versione 1.296) che vuole l’URL del repository e allora nella cartella di subversion ho lanciato il comando:

svnserve -d

che esegue il server che rimane in ascolto di default sulla porta 3690 (lo potete vedere da shell con il comando netstat -ant -p tcp). Ho trovato una breve descrizione di svnserve qui.

Cosi poi su Hudson ho inserito l’URL:

svn://localhost/Users/emidiostani/SVNrep

quando poi sono andato a specificare, nel form Build, il target file da compilare ho messo:

./HelloWeb/build.xml

che il target file che Netbeans mi aveva creato al momento del progetto.

Succede però che quando eseguo il build su Hudson esso mi genera un errore del tipo:

BUILD FAILED
/Users/emidiostani/.hudson/jobs/Test/workspace/SVNrep/HelloWeb/nbproject/build-impl.xml:188: The Java EE server classpath is not correctly set up. Your active server type is J2EE.
Either open the project in the IDE and assign the server or setup the server classpath manually.
For example like this:
ant -Duser.properties.file=<path_to_property_file> (where you put the property “j2ee.platform.classpath” in a .properties file)
or ant -Dj2ee.platform.classpath=<server_classpath> (where no properties file is used)

Total time: 0 seconds
Finished: FAILURE

questo accade perchè nel file HelloWeb/nbproject/build-impl.xml alla riga 188 esiste la riga:

<fail unless=”j2ee.platform.classpath”>

ecc ecc.

in pratica non trova la directory delle librerie di glassfish, questo l’ho scoperto semplicemente aggiungendo:

<echo>using ${j2ee.platform.classpath}</echo>

subito dopo quella riga e compilando direttamente da Netbeans.

Ovviamente Hudson non può sapere questa informazione che arriva direttamente dalle impostazioni di Netbeans e perciò per arrangiare ho messo nella casella Properties la voce:

j2ee.platform.classpath=/Users/emidiostani/Desktop/glassfish/lib/

e così sono riuscito a compilare.

In pratica leggendo poi in questo post, si capisce che la variable j2ee.platform.classpath è settata in HelloWeb/nbproject/private/private.properties file che non viene caricato nel repository (potete notarlo nel workspace di Hudson) e di conseguenza Hudson non la trova. L’autore del post suggerisce di settare la variabile nel file HelloWeb/nbproject/project.properties invece di settarla in Hudson perchè se pensate bene è una variabile statica che dovrebbe essere inclusa in diversi progetti in hudson e sarebbe giusto fissarla a monte.

Comunque come ho tempo rifaccio il tutto su Netbeans 6.5.

Buona giornata !