Andreas Bruns

Softwareentwicklung für Oldenburg und Bremen

SonarQube für die Analyse des Programmcodes

Während der Softwareentwicklung nutzen wir diverse Methoden im Team, um die eigenen Qualitätsanforderungen am Programmcode zu erfüllen, wie Code Reviews, Pair Programming oder Mob Programming. Ergänzend zu den Maßnahmen helfen Werkzeuge für automatisierte statische Code-Analysen. Im Java-Bereich werden PMD (Bad Practices erkennen), Checkstyle (Einhalt von Coding-Styles), FindBugs (Bugs finden) und Emma/JaCoCo (Testabdeckung) gerne genutzt. Das Konfigurieren und die Integration der Werkzeuge in die Entwicklungsumgebung oder der Build-Pipeline ist jedoch zeitaufwendig und nicht trivial.

Das freie verfügbare SonarQube vereinigt die genannten und auch viele andere Werkzeuge unter einer einheitlichen Oberfläche und stellt die Ergebnisse als Webanwendung bequem zur Verfügung. Wer also schnell mal ein Einblick in sein Projekt bezüglich folgender Punkte benötigt, der kann sich mit der angehängten SonarQube-Installationsanleitung einfach seinen eigenen SonarQube-Server aufsetzen.

  • Projekt-Übersicht mit dem zeitlichem Verlauf
  • Statistiken zum Projekt: Line of Codes, Tests, Testabdeckung,
  • Verletzungen von Programmierrichtlinien (Coding-Styles)
  • Erkennung von Bad Practices und Schwachstellen im Design
  • Erkennung von potentiellen Bugs, doppelten und ungenutzten Programmcode
  • Erkennung von Sicherheitslücken, z.B. mit Find Security Bugs
  • bereits angehäufte technische Schulden

SonarQube - Projekt-Übersicht

SonarQube – Projekt-Übersicht


Installation von SonarQube mit Docker-Compose

Statt der offiziellen Installationsanleitung oder dem offiziellen Docker-Image empfehle ich die docker-compose.yml für Docker-Compose, mit der eine SonarQube-Server und eine angeschlossene Postgres-Datenbank gestartet wird. In dem Verzeichnis der Datei muss man nur den Server mit docker-compose up starten und anschließend die SonarQube-Adresse mit dem Browser aufrufen (Name: admin, PW: admin): http://localhost:9000

version: "2"

services:
  sonarqube:
    image: sonarqube
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      - SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins

  db:
    image: postgres
    networks:
      - sonarnet
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
    volumes:
      - postgresql:/var/lib/postgresql
      # This needs explicit mapping due to https://github.com/docker-library/postgres/blob/4e48e3228a30763913ece952c611e5e9b95c8759/Dockerfile.template#L52
      - postgresql_data:/var/lib/postgresql/data

networks:
  sonarnet:
    driver: bridge

volumes:
  sonarqube_conf:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_bundled-plugins:
  postgresql:
  postgresql_data:

Die laufenden Docker-Prozesse können wir uns mit docker ps -a anschauen. Nach einem Neustart der Docker-Server bleiben unsere SonarQube-Daten in der Datenbank erhalten.

CONTAINER ID     IMAGE       COMMAND                 CREATED        STATUS         PORTS                    NAMES
811cc4d00843     postgres    "/docker-entrypoint.s"  8 minutes ago  Up 47 seconds  5432/tcp                 sonar_db_1
0fa4e14c61b1     sonarqube   "./bin/run.sh"          8 minutes ago  Up 48 seconds  0.0.0.0:9000->9000/tcp   sonar_sonarqube_1

Konfiguration von SonarQube

Bevor ich ein Projekt analysieren lasse, konfiguriere ich noch initial einige Einstellungen als Administrator:

  • Updates installieren:
    Administration -> System -> Update Center -> Updates Only
  • Benötigte Plugins installieren (z.B. Findbugs, PMD, Checkstyle):
    Administration -> System -> Update Center -> Available
  • Administrator-Passwort ändern:
    Administrator -> My Account -> Security -> Change Password
  • Nutzer-Authentifizierung aktivieren:
    Administration -> Configuration -> Security -> Force user authentication
  • Administrator-Token generieren für Projekte:
    Administration -> My Account -> Security -> Generate Tokens => Generate

Java-Projekt mit SonarQube analysieren

Dann lassen wir jetzt einmal ein Projekt von SonarQube analysieren. In diesem Beispiel werden wir ein Projekt verwenden, das mit Gradle gebaut wird. SonarQube unterstützt neben Gradle auch Ant und Maven als Build-Werkzeuge.

  1. Beispiel-Projekt mit Gradle-Konfiguration per Git herunterladen:
    git clone https://github.com/spring-guides/gs-testing-web.git
    cd gs-testing-web/complete
  2. Nutzerweite Property-Datei von Gradle – SonarQube-Server angeben:
    echo 'systemProp.sonar.host.url=http://localhost:9000' >> ~/.gradle/gradle.properties
  3. Nutzerweite Property-Datei von Gradle – erstelltes Admin-Token eintragen:
    echo 'systemProp.sonar.login=mein-token' >> ~/.gradle/gradle.properties
  4. Gradle-Task ’sonarqube‘ aufnehmen:
    echo 'plugins { id "org.sonarqube" version "2.2.1" }' >> build.gradle
    Den ergänzten Plugin-Ausdruck in die Zeile 10 der build.gradle verschieben.
  5. Gradle-Task ‚jacocoTestReport‘ für Test-Abdeckung aufnehmen:
    echo 'apply plugin: "jacoco"' >> build.gradle
    Den ergänzten Plugin-Ausdruck in die Zeile 11 der build.gradle verschieben.
  6. Gradle-Task ‚jacocoTestReport‘ und ’sonarqube‘ ausführen:
    gradle jacocoTestReport sonarqube
  7. SonarQube-Ergebnisse anschauen:
    Projekt wurde in SonarQube angelegt und ist von der Startseite aufrufbar
SonarQube - Measures

SonarQube – Measures

SonarQube - Issues

SonarQube – Issues


Fazit

SonarQube ist ein beeindruckendes Werkzeug, das uns Entwicklern auf vielen Ebenen hilfreich ist. Aufgrund der großen Anzahl von Regeln muss man zunächst einiges an Zeit investieren, die Bedeutung und die Wichtigkeit der Ergebnisse für sich persönlich zu bewerten.

SonarQube hat übrigens viele beliebte OpenSource-Projekte analysiert – viel Spaß beim stöbern 😉

Kommentare sind geschlossen.