Statyczna analiza kodu (SonarQube)
Wprowadzenie
Statyczna analiza kodu to proces ułatwiający wykrywanie defektów kodu bez jego uruchamiania. Pozwala mierzyć poziom długu technologicznego oraz wpływa pozytywnie na powstawanie kodu:
zgodnego z dobrymi praktykami
wyższej jakości
z mniejszą ilością potencjalnych bugów
z mniejszą ilością potencjalnych luk bezpieczeństwa
z mniejszą ilością duplikatów
o większej wydajności
łatwiejszego w utrzymaniu
Jest także elementem wymaganym przez kontrahentów i weryfikowanym podczas audytów oraz umożliwia oszacowanie długu technologicznego.
Etapy
Etap 1: Uruchomienie statycznej analizy kodu na branchu master - DONE
Statystyki
Statystyki dotyczące jakości kodu oraz długu technicznego znajdziemy na:
SonarQube:
Grafana:
tst- https://grafana-zabbix-k8s-test.blue.pl/d/J6wWoft4z/code-quality-overviewprod- https://grafana-production.blue.pl/d/J6wWoft4z/code-quality-overview
GitLab:
Tagowanie
Każdy projekt na git.blue.pl oraz sonar.blue.pl powinien zostać otagowany.
Celem tagowania jest określenie sposobu przeprowadzania statycznej analizy kodu oraz określenie właściwego zbioru warunków jakościowych (Quality Gate) dla danego projektu.
Quality Gates
Brama jakości to zbiór reguł, które musi spełnić kod zanim zostanie uznany za gotowy do produkcyjnego wdrożenia - kierujemy się podejściem https://docs.sonarqube.org/10.0/user-guide/clean-as-you-code/
Poniżej znajduje się lista warunków dla projektów oznaczonych odpowiednimi tagami.
UWAGA: w SonarQube operator metryk ustawia się w sposób przeciwstawny (spełnienie metryki oznacza, że kod nie spełnia wymagań jakościowych)
Quality Profiles
Profil jakości to zbiór reguł, które brane są pod uwagę podczas statycznej analizy kodu. Profile jakości definiowane są dla konkretnego języka programowania. Kiedy projekt jest analizowany, SonarQube określa, które języki są używane i używa aktywnego profilu jakości dla każdego z tych języków w tym konkretnym projekcie.
Dostępne tagi:
CODE-QUALITY-NEW
Projekty objęte restrykcyjnymi warunkami, które musi spełnić kod przed produkcyjnym wdrożeniem:
projekty nowe lub te, które powstały stosunkowo niedawno
projekty starsze, ale spełniające restrykcyjne warunki jakościowe
Metryka | Operator | Wartość |
|---|---|---|
Coverage | is less than | 80% |
Duplicated Lines (%) | is greater than | 3% |
Security Hotspots Reviewed | is less than | 100% |
Maintainability Rating | is worse than | A |
Reliability Rating | is worse than | A |
Security Rating | is worse than | A |
CODE-QUALITY-LEGACY
Projekty objęte mniej restrykcyjnymi warunkami, które musi spełnić kod przed produkcyjnym wdrożeniem:
projekty starsze ale nadal rozwijane (zmiany wprowadzane są częściej niż raz na pół roku)
Metryka | Operator | Wartość |
|---|---|---|
Coverage | is less than | 80% |
Duplicated Lines (%) | is greater than | 3% |
Security Hotspots Reviewed | is less than | 100% |
Maintainability Rating | is worse than | A |
Reliability Rating | is worse than | A |
Security Rating | is worse than | A |
CODE-QUALITY-DEBT
Projekty nieobjęte warunkami, które musi spełnić kod przed produkcyjnym wdrożeniem:
projekty nierozwijane
projekty, w których zmiany dokonywane są bardzo rzadko (nie częściej niż co pół roku)
projekty do przepisania lub usunięcia
Metryka | Operator | Wartość |
|---|---|---|
brak | brak | brak |
CODE-QUALITY-NONE
Projekty, które z różnych powodów nie podlegają statycznej analizie kodu:
fork'i projektów opensource
prywatny kod źródłowy
kod zadań wykonanych w ramach rekrutacji
GitLab
W narzędziu GitLab do tagowania projektów używamy topic'ów.
W sekcji Settings → General → Naming, topics, avatar w polu Topics dodajemy topic zgodny z nazwą odpowiedniego tag'a.

SonarQube
W narzędziu SonarQube do tagowania używamy tag'ów.
W sekcji Project Information → Description dodajemy odpowiedni tag.

Integracja
Poniżej znajduje się opis konfiguracji projektu, której celem jest automatyczne wykonywanie statycznej analizy kodu w procesie CI.
Zmienne
SONAR_URL = https://sonar.blue.pl
SONAR_TOKEN = f106269462a6f5b4fc0c426effb61f55b44ded35
Gradle
W celu integracji projektu wykorzystującego gradle’a musimy dodać do pliku build.gradle poniższą konfigurację:
Jeśli chcemy wykluczyć konkretne klasy lub zbiór klas z analizy możemy to zrobić za pomocą właściwości sonar.coverage.exclusions w build.gradle.
W celu wywołania statycznej analizy kodu wykonujemy polecenie:
Jeśli chcemy określić klucz i nazwę projektu do wykonujemy polecenie:
Maven
W celu integracji projektu wykorzystującego maven’a musimy dodać do pliku pom.xml poniższą konfigurację:
Jeśli chcemy wykluczyć konkretne klasy lub zbiór klas z analizy możemy to zrobić za pomocą właściwości sonar.exclusions w pom.xml.
Jeśli chcemy włączyć do analizy tylko konkretne klasy lub zbiór klas to możemy to zrobić za pomocą właściwości sonar.inclusions w pom.xml.
W celu wywołania statycznej analizy kodu wykonujemy polecenie:
Jeśli chcemy określić klucz i nazwę projektu do wykonujemy polecenie:
GitLab
Sposoby wprowadzenia statycznej analizy kodu do projektu w przypadku gdy:
projekt jest już zintegrowany z SonarQube
W takim wypadku wymagane jest jedynie odpowiednie otagowanie projektu (patrz Tagowanie).
projekt posiada już własny plik
.gitlab-ci.yml
Zaimportuj odpowiedni job z repozytorium commons/ci-cd w swoim pliku .gitlab-ci.yml dodając stage code-review
projekt nie posiada jeszcze własnego pliku
.gitlab-ci.yml
Przejdź w projekcie na GitLab do menu Settings → CI/CD → General pipelines i wprowadź odpowiednią ścieżkę w zależności od używanej wersji javy:
.gitlab-ci-java-jdk17-standard.yml@commons/ci-cd.gitlab-ci-java-jdk11-standard.yml@commons/ci-cd.gitlab-ci-java-jdk8-standard.yml@commons/ci-cd
IDE - SonarLint
W celu ułatwienia i przyspieszenia wykonywania analizy jakościowej kodu możliwe jest jego wykonanie za pomocą pluginu SonarLint bezpośrednio z Intellij IDEA.
Zainstaluj SonarLint
w menu głównym przejdź do
Intellij IDEA→Preferences→Pluginsw oknie wyszukiwania wpisz SonarLint i zainstaluj plugin

Skonfiguruj instancję SonarQube
w menu głównym przejdź do
Intellij IDEA→Preferences→Tools→SonarLintna liście SonarQube / SonarCloud connections dodaj instancję sonara w pierwszym kroku określając jego nazwę i adres

w kolejnym kroku wprowadź token dostępowy

w menu głównym przejdź do
Intellij IDEA→Preferences→Tools→SonarLint→Project Settingsi podłącz SonarLint pod wybrany projekt
