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