Analisi del codice con SonarQube

1. Panoramica

In questo articolo, esamineremo l'analisi statica del codice sorgente con SonarQube, che è una piattaforma open source per garantire la qualità del codice.

Cominciamo con una domanda fondamentale: perché analizzare il codice sorgente in primo luogo? In parole molto semplici, per garantire qualità, affidabilità e manutenibilità per tutta la durata del progetto; una base di codice scritta male è sempre più costosa da mantenere.

Bene, ora iniziamo scaricando l'ultima versione LTS di SonarQube dalla pagina di download e configurando il nostro server locale come descritto in questa guida rapida.

2. Analisi del codice sorgente

Ora che abbiamo effettuato l'accesso, dobbiamo creare un token specificando un nome, che può essere il nostro nome utente o qualsiasi altro nome di scelta e fare clic sul pulsante di generazione.

Useremo il token in seguito, al punto di analizzare i nostri progetti. Dobbiamo anche selezionare la lingua principale (Java) e la tecnologia di compilazione del progetto (Maven).

Definiamo il plugin nel pom.xml :

    org.sonarsource.scanner.maven sonar-maven-plugin 3.4.0.905    

L'ultima versione del plugin è disponibile qui. Ora, dobbiamo eseguire questo comando dalla radice della directory del nostro progetto per scansionarlo:

mvn sonar:sonar -Dsonar.host.url=//localhost:9000 -Dsonar.login=the-generated-token

Dobbiamo sostituire il token generato con il token dall'alto.

Il progetto che abbiamo utilizzato in questo articolo è disponibile qui.

Abbiamo specificato l'URL host del server SonarQube e il login (token generato) come parametri per il plugin Maven.

Dopo aver eseguito il comando, i risultati saranno disponibili nella dashboard dei progetti - in // localhost: 9000 .

Ci sono altri parametri che possiamo passare al plugin Maven o anche impostare dall'interfaccia web; sonar.host. url, sonar.projectKey e sonar.sources sono obbligatori mentre altri sono opzionali.

Altri parametri di analisi e i loro valori predefiniti sono qui. Inoltre, tieni presente che ogni plugin di lingua ha regole per analizzare il codice sorgente compatibile.

3. Risultato dell'analisi

Ora che abbiamo analizzato il nostro primo progetto, possiamo andare all'interfaccia web su // localhost: 9000 e aggiornare la pagina.

Lì vedremo il riepilogo del rapporto:

I problemi rilevati possono essere un bug, una vulnerabilità, un odore di codice, una copertura o una duplicazione. Ogni categoria ha un numero corrispondente di problemi o un valore percentuale.

Inoltre, i problemi possono avere uno dei cinque diversi livelli di gravità: bloccante, critico, maggiore, minore e informativo. Proprio davanti al nome del progetto c'è un'icona che mostra lo stato Quality Gate: superato (verde) o non riuscito (rosso).

Facendo clic sul nome del progetto ci porterà a una dashboard dedicata dove possiamo esplorare le questioni specifiche del progetto in maggiore dettaglio.

Possiamo vedere il codice del progetto, l'attività ed eseguire le attività di amministrazione dalla dashboard del progetto, ognuna disponibile in una scheda separata.

Sebbene sia presente una scheda Problemi globale , la scheda Problemi nella dashboard del progetto mostra i problemi specifici del solo progetto in questione:

La scheda Problemi mostra sempre la categoria, il livello di gravità, i tag e lo sforzo calcolato (in termini di tempo) necessario per correggere un problema.

Dalla scheda Problemi è possibile assegnare un problema a un altro utente, commentarlo e modificarne il livello di gravità. Facendo clic sul problema stesso verranno visualizzati ulteriori dettagli sul problema.

La scheda Problema viene fornita con filtri sofisticati a sinistra. Questi sono utili per individuare i problemi. Quindi come si può sapere se la base di codice è sufficientemente sana per la distribuzione in produzione? Ecco a cosa serve Quality Gate.

4. SonarQube Quality Gate

In questa sezione, esamineremo una caratteristica chiave di SonarQube: Quality Gate. Quindi vedremo un esempio di come impostarne uno personalizzato.

4.1. Cos'è un Quality Gate?

Un Quality Gate è un insieme di condizioni che il progetto deve soddisfare prima di poter qualificarsi per il rilascio di produzione. Risponde a una domanda: posso inviare il mio codice in produzione nel suo stato attuale o no?

Garantire la qualità del codice del "nuovo" codice mentre si aggiusta quelli esistenti è un buon modo per mantenere una buona base di codice nel tempo. Il Quality Gate facilita l'impostazione delle regole per la convalida di ogni nuovo codice aggiunto alla base di codice nelle analisi successive.

Le condizioni impostate nel Quality Gate influenzano ancora i segmenti di codice non modificati. Se riusciamo a prevenire l'insorgere di nuovi problemi, nel tempo elimineremo tutti i problemi.

Questo approccio è paragonabile alla riparazione della perdita d'acqua dalla sorgente. Questo ci porta a un termine particolare: periodo di perdita. Questo è il periodo tra due analisi / versioni del progetto .

Se eseguiamo nuovamente l'analisi, sullo stesso progetto, la scheda panoramica della dashboard del progetto mostrerà i risultati per il periodo di perdita:

Dall'interfaccia web, la scheda Quality Gates è dove possiamo accedere a tutti i quality gate definiti. Per impostazione predefinita, SonarQube way è stato preinstallato con il server.

La configurazione predefinita per il modo SonarQube contrassegna il codice come non riuscito se:

  • la copertura sul nuovo codice è inferiore all'80%
  • la percentuale di righe duplicate sul nuovo codice è maggiore di 3
  • la manutenibilità, l'affidabilità o la valutazione della sicurezza è peggiore di A

With this understanding, we can create a custom Quality Gate.

4.2. Adding Custom Quality Gate

First, we need to click on the Quality Gates tab and then click on the Create button which is on the left of the page. We'll need to give it a name – baeldung.

Now we can set the conditions we want:

From the Add Condition drop-down, let's choose Blocker Issues; it'll immediately show up on the list of conditions.

We'll specify is greater than as the Operator, set zero (0) for the Error column and check Over Leak Period column:

Then we'll click on the Add button to effect the changes. Let's add another condition following the same procedure as above.

We'll select issues from the Add Condition drop-downand check Over Leak Period column.

The value of the Operator column will be set to “is less than” and we'll add one (1) as the value for the Error column. This means if the number of issues in the new code added is less than 1, mark the Quality Gate as failed.

I know this doesn't make technical sense but let's use it for learning sake. Don't forget to click the Add button to save the rule.

One final step, we need to attach a project to our custom Quality Gate. We can do so by scrolling down the page to the Projects section.

There we need to click on All and then mark our project of choice. We can as well set it as the default Quality Gate from the top-right corner of the page.

We'll scan the project source code, again, as we did before with Maven command. When that's done, we'll go to the projects tab and refresh.

This time, the project will not meet the Quality Gate criteria and will fail. Why? Because in one of our rules we have specified that, it should fail if there are no new issues.

Let's go back to the Quality Gates tab and change the condition for issues to is greater than. We need to click the update button to effect this change.

A new scan of the source code will pass this time around.

5. Integrating SonarQube into a CI

Making SonarQube part of a Continuous Integration process is possible. This will automatically fail the build if the code analysis did not satisfy the Quality Gate condition.

For us to achieve this, we're going to be using SonarCloud which is the cloud-hosted version of SonaQube server. We can create an account here.

From My Account > Organizations, we can see the organization key, and it will usually be in the form xxxx-github or xxxx-bitbucket.

Also from My Account > Security, we can generate a token as we did in the local instance of the server. Take note of both the token and the organization key for later use.

In this article, we'll be using Travis CI, and we'll create an account here with an existing Github profile. It will load all our projects, and we can flip the switch on any to activate Travis CI on it.

We need to add the token we generated on SonarCloud to Travis environment variables. We can do this by clicking on the project we've activated for CI.

Then, we'll click “More Options” > “Settings” and then scroll down to “Environment Variables”:

We'll add a new entry with the name SONAR_TOKEN and use the token generated, on SonarCloud, as the value. Travis CI will encrypt and hide it from public view:

Finally, we need to add a .travis.yml file to the root of our project with the following content:

language: java sudo: false install: true addons: sonarcloud: organization: "your_organization_key" token: secure: "$SONAR_TOKEN" jdk: - oraclejdk8 script: - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar cache: directories: - '$HOME/.m2/repository' - '$HOME/.sonar/cache'

Ricordarsi di sostituire la chiave dell'organizzazione con la chiave dell'organizzazione sopra descritta. Il commit del nuovo codice e il push al repository Github attiverà la build di Travis CI e, a sua volta, attiverà anche la scansione del sonar.

6. Conclusione

In questo tutorial, abbiamo esaminato come impostare un server SonarQube localmente e come utilizzare Quality Gate per definire i criteri per l'idoneità di un progetto per il rilascio di produzione.

La documentazione di SonarQube contiene ulteriori informazioni su altri aspetti della piattaforma.