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

Più consultati


Tags

SonarQube: Continuous Code Quality

17/02/2017


Introduzione

Parlare di qualità del codice non può prescindere dalla considerazione che nei progetti software si sviluppano delle grandi quantità di codice sorgente che vengono poi tenute operative e mantenute per lunghi periodi di tempo. Durante questi periodi, a causa delle attività di manutenzione, la struttura interna dei codici sorgente si modifica, spesso perdendo le caratteristiche iniziali. Questo accade per svariate ragioni, ad esempio:

Il codice viene modificato senza prestare la necessaria attenzione al “refactoring”.

Non viene verificata la coerenza di tali modifiche con la relativa documentazione a livello di requisiti e progettazione .

Alcune porzioni di codice possono diventare così complicate nel tempo da non poter essere più facilmente gestite.

Errori di progettazione (scarsa modularità, scalabilità limitata, etc.) si ripercuotono sui team di sviluppo che cambiano nel tempo perdendo spesso le competenze sulle motivazioni delle scelte iniziali

Ambiente di sviluppo dinamico in cui più team lavorano sullo stesso codice .

Appare evidente che apportare cambiamenti per mantenere un buon livello di leggibilità e qualità del codice è fondamentale per raggiungere uno sviluppo di successo. La qualità del codice è uno dei fattori più importanti per determinare la qualità del prodotto nel complesso, ma spesso non viene percepita come tale. Un ambiente che consenta di mantenere dei buoni standard di qualità spesso si basa su:

Seguire convenzioni a livello di codifica, in modo che il codice possa essere capito da chiunque sia coinvolto nel processo.

Implementare la revisione del codice nel proprio processo di sviluppo.

Uso di metodologie che enfatizzano l’utilizzo di pattern di sviluppo e progettazione consolidati

Tutte queste tecniche non sono a costo zero per un team di sviluppo e richiedono una costante attenzione durante il  loro uso. 

In particolare bisognerebbe porre l’attenzione verso la realizzazione di task che si occupano di analizzare staticamente e dinamicamente l’evoluzione del progetto in termini di qualità. Sarebbe opportuno quindi effettuare all’interno della nostra pipeline di sviluppo le seguenti analisi:

Analisi Statica

L’analisi statica ed in particolare alcune metriche come la complessità ciclomatica, il numero di linee di codice per unità di compilazione , così pure come la capacità di trovare frammenti di codice duplicati possono aiutare nell’identificare gli “hot-spots”, e cioè porzioni di codice che richiedono un’attenzione particolare. Seguire da vicino l’evoluzione nel tempo di questi “hot-spots” è la chiave per poter tenere sotto controllo una mole di codice sorgente considerevole.

Analisi Dinamica

L’Analisi Dinamica consiste di due diverse attività complementari:

testing – unit testing, integration testing and acceptance testing – e cioè verificare che il sistema software funziona come previsto

coverage analysis – e cioè verificare che durante il testing tutti gli statements ed i branches sono stati eseguiti

SonarQube si inserisce in questo contesto.

Fondamenti

SonarQube è una piattaforma open source per la gestione della qualità del codice. Può essere sintetizzata come un’applicazione web che produce reports sul codice duplicato, sugli standards di programmazione, i tests di unità, il code coverage, la complessità, i bugs potenziali, i commenti, la progettazione e l’architettura.

La piattaforma riceve come input il codice sorgente di un progetto, integrandosi con il proprio IDE o estraendolo dal proprio versionatore. I plugin SonarQube, che rendono più semplice l'esecuzione dell'analisi del codice, sono disponibili per tutti gli IDE più popolari. In base all'input, la piattaforma inizia ad applicare delle regole predefinite (o customizzate) e verifica che siano rispettate. Il risultato dell'analisi include poi diverse informazioni utili e propone dei miglioramenti.

Sebbene SonarQube nasca per supportare applicazioni java le analisi possono essere facilmente eseguite su codice scritto in più 20 linguaggi di programmazione.

La piattaforma SonarQube consiste di quattro componenti:

strumenti di analisi,

server,

plugin (installati sul server)

database

 

Figura 1 - Architettura di SonarQube

Gli strumenti di analisi scansionano il codice riga per riga, fornendo informazioni sul debito tecnico, la copertura e la complessità del codice, i problemi individuati etc. I problemi individuati nel codice possono essere bug, potenziali bug, fattori che potrebbero portare a errori in futuro e così via.

Una volta completata l'analisi i risultati possono essere visualizzati sulla pagina web ospitata sul server web di SonarQube. Il server web semplifica la configurazione dell'istanza e l'installazione del plugin di SonarQube e offre un’intuitiva panoramica dei risultati.

 

Figura 2 - Panoramica dei risultati

Alcuni codici possono ospitare diversi problemi. Le regole sono diverse, e in base alla loro gravità possono essere raggruppate in 5 diversi tipi: Blocker, Critical, Major, Minor e Info. Qualsiasi bug o potenziale bug presente verrà indicato come Blocker o Critical, mentre problemi secondari vengono indicati come Minor o Info.

Installazione

L'architettura di SonarQube è altamente modulare. Consente di separare server e database ( creare repliche dei database e distribuire server su più macchine) per migliorarne le prestazioni e la scalabilità.

Per quanto riguarda la fase di test vera e propria viene utilizzato  un server web con un database incorporato. In termini di semplicità di installazione e configurazione, oltre ad un approccio tradizionale è possibile utilizzare un approccio container-based. Docker, ad esempio, consente di raggruppare tutto ciò di cui hai bisogno (codice, runtime, librerie di sistema) e distribuirlo con facilità su qualsiasi macchina. Esiste inoltre un contenitore Docker ufficiale di SonarQube, dotato di una versione H2 incorporata.

SonarQube e l'Integrazione continua

L'analisi del codice rientra perfettamente in un contesto di continuity integration:

SonarQube è compatibile con i più noti motori di Build.

Per linguaggi dinamici come JavaScript, PHP, Python, … è possibile eseguire un’analisi in modo veloce  alimentando SonarQube a partire da un insieme di file sorgenti. Ma per linguaggi come Java, C#, C, C++ and Objective-C, non vi è modo di fornire un’analisi accurata senza considerare il processo di build. Per questo motivo SonarQube è dotato di un’integrazione stretta con MSBuild, Maven, Gradle, Ant, e Makefiles.

 

Figura 3 - Build Engine


SonarQube e i motori di CI

integrazioni native con sistemi di compilazione consentono di pianificare facilmente l'esecuzione di un'analisi da parte di  tutti i motori tipici del mondo CI: Jenkins, VSTS, TFS, Travis-CI, etc.

Figura 4 - CI Engine

Pass/Fail Notification

Una volta che l'analisi viene effettuata, un rapporto viene inviato al server SonarQube che tramite un meccanismo stile Webhook consente di notificare qualsiasi sistema esterno allo scopo di: far scattare un allarme, aggiornare un pannello, informare una chat room, etc.

Figura 5 - Pass/Fail notification

Full Web API

Come parte dell'ecosistema globale di sviluppo, SonarQube è dotato di una batteria di API con cui poter effettuare un provisioning automatico di un progetto, alimentare uno strumento di BI, monitorare SonarQube, etc.

Promotion Pipelines

Utilizzando webhooks, SonarQube può essere integrato all’interno della pipeline di CI. In questo modo, è possibile fare in modo che solo gli artifact che superano i test di qualità vengano rilasciati e distribuiti in produzione.

Conclusioni                                         

L'utilizzo di SonarQube, sostanzialmente, semplifica il controllo della qualità del codice riducendo il numero di bug (reali o potenziali). In tal modo gli sviluppatori possono concentrarsi di più sulla logica e dedicare il loro tempo ai requisiti di analisi aziendale e alla ricerca di soluzioni ottimali. Un altro aspetto fondamentale del prodotto è che il suo utilizzo all’interno di una pipeline di delivery moderna DevOps-oriented consente ai manager di adottare delle metriche molto potenti per capire la propria efficienza in termini di produzione del software.


Gianluca Coviello

Full-stack Developer/Solutions Provider

TIM

Paolo Vitiello

Full-stack Developer/Solutions Provider

TIM



2 Commenti

  1. giovanni scotti il 2017-02-22 scrive:

    Articolo chiaro e dettagliato. Complimenti

     

  2. Davvero molto chiaro, complimenti. Interessante soprattutto la parte del notification e dell'integrazione nelle catene di CI.