Code-Analyse mit SonarQube

1. Übersicht

In diesem Artikel beschäftigen wir uns mit der statischen Quellcode-Analyse mit SonarQube - einer Open-Source-Plattform zur Sicherstellung der Codequalität.

Beginnen wir mit einer Kernfrage: Warum sollte der Quellcode überhaupt analysiert werden? Ganz einfach ausgedrückt, um Qualität, Zuverlässigkeit und Wartbarkeit über die gesamte Laufzeit des Projekts sicherzustellen. Eine schlecht geschriebene Codebasis ist immer teurer in der Wartung.

Okay, jetzt laden wir die neueste LTS-Version von SonarQube von der Download-Seite herunter und richten unseren lokalen Server wie in dieser Kurzanleitung beschrieben ein.

2. Quellcode analysieren

Nachdem wir angemeldet sind, müssen wir ein Token erstellen, indem wir einen Namen angeben. Dies kann unser Benutzername oder ein beliebiger anderer Name sein, und auf die Schaltfläche "Generieren" klicken.

Wir werden das Token später bei der Analyse unserer Projekte verwenden. Wir müssen auch die Primärsprache (Java) und die Build-Technologie des Projekts (Maven) auswählen.

Definieren wir das Plugin in der pom.xml :

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

Die neueste Version des Plugins finden Sie hier. Jetzt müssen wir diesen Befehl aus dem Stammverzeichnis unseres Projektverzeichnisses ausführen, um ihn zu scannen:

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

Wir müssen das generierte Token durch das Token von oben ersetzen .

Das Projekt, das wir in diesem Artikel verwendet haben, finden Sie hier.

Wir haben die Host-URL des SonarQube-Servers und das Login (generiertes Token) als Parameter für das Maven-Plugin angegeben.

Nach dem Ausführen des Befehls stehen die Ergebnisse im Projekt-Dashboard unter // localhost: 9000 zur Verfügung .

Es gibt andere Parameter, die wir an das Maven-Plugin übergeben oder sogar über die Weboberfläche festlegen können. sonar.host. url, sonar.projectKey und sonar.sources sind obligatorisch, während andere optional sind.

Weitere Analyseparameter und deren Standardwerte finden Sie hier. Beachten Sie außerdem, dass jedes Sprach-Plugin Regeln für die Analyse kompatiblen Quellcodes enthält.

3. Analyseergebnis

Nachdem wir unser erstes Projekt analysiert haben, können wir die Weboberfläche unter // localhost: 9000 aufrufen und die Seite aktualisieren.

Dort sehen wir die Zusammenfassung des Berichts:

Entdeckte Probleme können entweder ein Fehler, eine Sicherheitsanfälligkeit, ein Codegeruch, eine Abdeckung oder eine Vervielfältigung sein. Jede Kategorie hat eine entsprechende Anzahl von Problemen oder einen Prozentwert.

Darüber hinaus können Probleme einen von fünf verschiedenen Schweregraden haben: Blocker, Kritisch, Major, Minor und Info. Direkt vor dem Projektnamen befindet sich ein Symbol, das den Quality Gate-Status anzeigt - bestanden (grün) oder nicht bestanden (rot).

Durch Klicken auf den Projektnamen gelangen wir zu einem speziellen Dashboard, in dem wir projektspezifische Probleme genauer untersuchen können.

Wir können den Projektcode, die Aktivität und die Verwaltungsaufgaben über das Projekt-Dashboard anzeigen - jeweils auf einer separaten Registerkarte verfügbar.

Obwohl es eine globale Registerkarte " Probleme" gibt , werden auf der Registerkarte " Probleme" im Projekt-Dashboard Probleme angezeigt, die nur für das betreffende Projekt spezifisch sind:

Auf der Registerkarte "Probleme" werden immer die Kategorie, der Schweregrad, die Tags und der berechnete Aufwand (in Bezug auf die Zeit) angezeigt, der zur Behebung eines Problems erforderlich ist.

Auf der Registerkarte "Probleme" können Sie ein Problem einem anderen Benutzer zuweisen, es kommentieren und seinen Schweregrad ändern. Wenn Sie auf das Problem selbst klicken, werden weitere Details zum Problem angezeigt.

Die Registerkarte "Problem" enthält links ausgefeilte Filter. Diese sind gut, um Probleme zu lokalisieren. Wie kann man also wissen, ob die Codebasis für die Bereitstellung in der Produktion gesund genug ist? Dafür ist Quality Gate da.

4. SonarQube Quality Gate

In diesem Abschnitt werden wir uns eine wichtige Funktion von SonarQube ansehen - Quality Gate. Dann sehen wir ein Beispiel, wie Sie ein benutzerdefiniertes einrichten.

4.1. Was ist ein Qualitätstor?

Ein Quality Gate ist eine Reihe von Bedingungen, die das Projekt erfüllen muss, bevor es sich für die Produktionsfreigabe qualifizieren kann. Es beantwortet eine Frage: Kann ich meinen Code im aktuellen Zustand in die Produktion bringen oder nicht?

Das Sicherstellen der Codequalität von „neuem“ Code beim Korrigieren vorhandener Codes ist eine gute Möglichkeit, um im Laufe der Zeit eine gute Codebasis aufrechtzuerhalten. Das Quality Gate erleichtert das Einrichten von Regeln für die Validierung jedes neuen Codes, der der Codebasis bei der nachfolgenden Analyse hinzugefügt wird.

Die im Quality Gate festgelegten Bedingungen wirken sich weiterhin auf unveränderte Codesegmente aus. Wenn wir verhindern können, dass im Laufe der Zeit neue Probleme auftreten, werden wir alle Probleme beseitigen.

Dieser Ansatz ist vergleichbar mit der Behebung der Wasserleckage aus der Quelle. Dies bringt uns zu einem bestimmten Begriff - Leckageperiode. Dies ist der Zeitraum zwischen zwei Analysen / Versionen des Projekts .

Wenn wir die Analyse für dasselbe Projekt erneut ausführen, werden auf der Registerkarte Übersicht des Projekt-Dashboards Ergebnisse für die Leckperiode angezeigt:

Über die Weboberfläche können Sie auf der Registerkarte Quality Gates auf alle definierten Quality Gates zugreifen. Standardmäßig war SonarQube way mit dem Server vorinstalliert.

Die Standardkonfiguration für die SonarQube-Methode kennzeichnet den Code als fehlgeschlagen, wenn:

  • Die Abdeckung für neuen Code beträgt weniger als 80%
  • Der Prozentsatz der doppelten Zeilen in neuem Code ist größer als 3
  • Wartbarkeit, Zuverlässigkeit oder Sicherheitsbewertung sind schlechter als 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'

Denken Sie daran, Ihren Organisationsschlüssel durch den oben beschriebenen Organisationsschlüssel zu ersetzen. Das Festschreiben des neuen Codes und das Drücken auf Github Repo löst den Travis CI-Build aus und aktiviert wiederum das Sonar-Scannen.

6. Fazit

In diesem Tutorial haben wir uns angesehen, wie Sie einen SonarQube-Server lokal einrichten und mit Quality Gate die Kriterien für die Eignung eines Projekts für die Produktionsfreigabe definieren.

In der SonarQube-Dokumentation finden Sie weitere Informationen zu anderen Aspekten der Plattform.