Scopri tutti gli articoli e le iniziative nelle varie sezioni del portale

Più consultati


Tags

Jenkins: Il tool per la Continuous Integration

20/12/2016

Introduzione

La Continuous Integration (CI, Integrazione Continua) è una pratica di sviluppo software che permette di effettuare un merge continuo dei workspaces degli sviluppatori (parti di un progetto di sviluppo software in carico ad un unico sviluppatore); l’obiettivo è di integrare il lavoro del gruppo di sviluppo minimizzando le problematiche di merging ed i conflitti tra le versioni del codice che si generano giocoforza su progetti complessi su cui lavorano diversi sviluppatori dello stesso team.

Una soluzione di Continuous Integration valida e Open Source è Jenkins

Jenkins è una web application, scritta in Java, che si occupa di eseguire le operazioni di mergebuild e test offrendo contemporaneamente ottime capacità di monitoraggio di task ripetitivi. Per questo motivo è diventato in poco tempo una pietra miliare di molti processi di CI fornendo a sviluppatori e sistemisti tutti gli strumenti necessari per integrare il proprio lavoro.

Jenkins è facile da installare ma soprattutto è molto intuitivo da utilizzare: l'interfaccia è pulita e chiara, e dopo qualche minuto di configurazione è possibile avere in piedi il proprio sistema di build automatico.

L'applicativo ha un'architettura modulare: sono disponibili diversi plugin e customizzazioni che permettono di estendere le funzionalità base di Jenkins per soddisfare sia le necessità del progetto sia le necessità di monitoraggio.

Fondamenti di Jenkins

Jenkins è stato originariamente sviluppato all’interno di Sun Microsystems con il nome di Hudson nel 2004 ed è stato reso pubblico su java.net nel febbraio 2005. Nel 2007 Hudson aveva già un ruolo di rilievo fra i server di build open-source e nella conferenza JavaOne nel maggio 2008 il software ha vinto il premio Duke's Choice nella categoria Developer Solutions.

Il cambio di nome da Hudson a Jenkins è avvenuto nel 2010, a valle dell’acquisto di Sun Microsystems da parte di Oracle e della registrazione da parte di quest’ultima del marchio Hudson.

Installazione e configurazione di Jenkins

Jenkins è distribuito o in modalità standalone, avviabile con il classico comando java -jar jenkins.war, o come applicazione web da eseguire all’interno di un Application Server / Servlet Container (Apache Tomcat, WildFly, …) o come pacchetto precompilato per varie distribuzioni *nix.

A valle dell’installazione, Jenkins è fruibile attraverso un normale browser alla porta configurata:

  Figura 1. L’home page di un’installazione Jenkins su cui risultano configurati due job

 

L’interfaccia presenta la sezione di controllo sulla spalla sinistra e un riassunto degli ultimi job eseguiti.

La configurazione avviene mediante il menu Manage Jenkins. Volendosi limitare ad una configurazione semplice, oltre alla configurazione degli utenti e dei loro privilegi, che ci sentiamo di consigliare caldamente, vanno configurati solo i seguenti parametri:

  • # of executors, ovvero il numero di job eseguibili contemporaneamente nel nodo, il valore di default è 2,
  • Jenkins Location: è l’URL pubblica di Jenkins stesso e l’indirizzo email dell’amministratore di Jenkins

Una configurazione più avanzata permette di abilitare una delle caratteristiche maggiormente apprezzate di Jenkins: il parallelismo su più macchine. È possibile infatti installare Jenkins su più nodi (detti slave) di una rete; tutti gli slave vengono coordinati dall’unico nodo master, il quale distribuisce il carico di lavoro tra i vari slave per ottimizzare la velocità di esecuzione dei job. È questa una caratteristica particolarmente apprezzata in quei progetti in generale molto grandi o con un elevato numero di test automatici da effettuare.

I Job di Jenkins

Il punto di forza di Jenkins è la creazione di un job, che non è null’altro se non una serie di operazioni da effettuare in sequenza e di cui monitorare l’output.

Le fasi tipiche di un job sono ovviamente i passi tipici del lavoro di build di un’applicazione:

Check-out del codice sorgente da un CVS (Subversion, Git, etc…)

Build steps

Post-build Steps

Un tipico job orientato alla CI, verifica periodicamente se ci sono dei nuovi commit su un particolare repository; in caso positivo effettua, nell’ordine indicato i passi descritti nella sezione di build (tipicamente una compilazione, esecuzione dei test automatici e creazione degli artefatti) e quindi, nel caso in cui la fase di build sia terminata con esito positivo, esegue le azioni indicate nella fase di post-build (tipicamente l’invio di una notifica agli sviluppatori con i risultati dei test, l’archiviazione degli artefatti su un repository, il deploy in ambiente di test e/o esercizio).

A titolo di esempio alcune immagini con la configurazione di un nostro progetto di software di test.

 

Figura 2. Configurazione del check-out periodico dal repository SVN

 


 

Figura 3. Fase di build consistente nell’esecuzione di una serie di task Gradle


 

Figura 4. Fase post-build consistente nell’archiviazione dell’artefatto

I plugin di Jenkins

Sebbene nasca all’interno della comunità Java e sia stato pensato principalmente per la CI in tale ambiente, finora non abbiamo mai parlato di linguaggi supportati.

Una delle caratteristiche di Jenkins è la sua estrema modularità e, soprattutto, l’esistenza di un numero incredibile di plugin che gli permettono di:

  • interfacciarsi a qualsiasi CVS,
  • effettuare una build per quasi tutti i linguaggi moderni,
  • utilizzare anche altri build automation tool (Maven, Gralde, Ivy, etc…).

Al fine di comprendere l’incredibile modularità ed estensibilità di Jenkins, è interessante dare uno sguardo all’interfaccia ExtensionPoint per comprendere l’enorme numero di implementazioni esistenti.

Conclusioni e Jenkins Blue Ocean

Durante lo sviluppo di un progetto la fase di rilascio è in genere traumatica a causa della complessità̀ delle operazioni da fare, dal timore che qualcosa vada storto durante queste operazioni e, soprattutto, della preoccupazione di rilasciare in produzione software malfunzionante. A questo si aggiunge, talvolta, il fatto che il rilascio ha una durata importante e viene fatto in orari in cui il sistema è sottoposto a carichi minori, che spesso coincidono con orari festivi e/o notturni. Le pratiche di Continuous Integration e Continuous Delivery, di cui Jenkins può essere considerato un prodotto abilitante, permettono di superare agilmente questi limiti introducendo test a copertura del codice prodotto, ed una sequenza automatizzata delle operazioni di rilascio. Tra le conseguenze dei rilasci frequenti una delle più importanti è la riduzione della differenza (delta) tra due versioni consecutive e quindi un rollback non troppo complicato, e al tempo stesso non troppo penalizzante per gli utenti, che dovranno temporaneamente rinunciare alle nuove funzionalità̀ rilasciate.

È opportuno osservare che attualmente è in beta la release denominata “Blue Ocean”. Blue Ocean è di fatto un nuovo progetto che ripensa la l’user experience di Jenkins.

Progettato da zero, Blue Ocean riduce l'ingombro e aumenta la chiarezza attraverso le seguenti caratteristiche:

Sophisticated visualizations of CD pipelines: consente una veloce ed intuitiva comprensione dello stato della pipelines di Continuous Delivery

Pipeline editor: (In fase di sviluppo) che crea in automatico pipelines di CD guidando un utente attraverso un processo visuale intuitivo

Personalizzazione della User Interface di Jenkins.

Pinpoint precision: quando è necessario un intervento e / o sorgono problemi la nuova interfaccia utente mostra dove è necessario intervenire all’interno della pipelines facilitando la gestione delle eccezioni e aumentando la produttività.

Native integration for branch and pull requests: consente massima produttività degli sviluppatori quando si collabora sul codice con di altri in GitHub e Bitbucket.

La figura seguente illustra un esempio della nuova GUI:

 

Figura 6: Blue Ocean il nuovo modo di concepire Jenkins

 

Gianluca Coviello

Full-stack Developer/Solutions Provider

TIM

Paolo Vitiello

Full-stack Developer/Solutions Provider

TIM