Delivery 1.0 Help

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:

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

Quality Gate New

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)

Quality Gate Legacy

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

Quality Gate Debt

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 SettingsGeneralNaming, topics, avatar w polu Topics dodajemy topic zgodny z nazwą odpowiedniego tag'a.

Image 20230116 070008

SonarQube

W narzędziu SonarQube do tagowania używamy tag'ów.

W sekcji Project InformationDescription dodajemy odpowiedni tag.

Image 20221212 170925

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ę:

plugins { id 'org.sonarqube' version '3.3' id 'jacoco' } tasks.named('sonarqube').configure { dependsOn test } test { useJUnitPlatform() finalizedBy jacocoTestReport { reports { xml.enabled true html.enabled false } } }

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.

sonarqube { properties { property "sonar.coverage.exclusions", "**/Exclude1.java,**/AnotherExclude.java" } }

W celu wywołania statycznej analizy kodu wykonujemy polecenie:

./gradlew sonarqube -Dsonar.host.url=SONAR_URL -Dsonar.login=SONAR_TOKEN

Jeśli chcemy określić klucz i nazwę projektu do wykonujemy polecenie:

./gradlew sonarqube -Dsonar.host.url=SONAR_URL -Dsonar.login=SONAR_TOKEN -Dsonar.projectKey=PROJECT_KEY -Dsonar.projectName=PROJECT_NAME

Maven

W celu integracji projektu wykorzystującego maven’a musimy dodać do pliku pom.xml poniższą konfigurację:

<build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.7</version> <executions> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>default-report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> </plugins> </build>

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.

<properties> <sonar.exclusions> **/Exclude1.java, **/AnotherExclude.java </sonar.exclusions> </properties>

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.

<properties> <sonar.inclusions>pl.autopay/*.java</sonar.inclusions> </properties>

W celu wywołania statycznej analizy kodu wykonujemy polecenie:

mvn clean verify sonar:sonar -Dsonar.host.url=SONAR_URL -Dsonar.login=SONAR_TOKEN

Jeśli chcemy określić klucz i nazwę projektu do wykonujemy polecenie:

mvn clean verify sonar:sonar -Dsonar.host.url=SONAR_URL -Dsonar.login=SONAR_TOKEN -Dsonar.projectKey=PROJECT_KEY -Dsonar.projectName=PROJECT_NAME

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

stages: - code-review include: - project: commons/ci-cd ref: master file: jobs/.gitlab-ci-sonarqube.yml
  • projekt nie posiada jeszcze własnego pliku .gitlab-ci.yml

Przejdź w projekcie na GitLab do menu SettingsCI/CDGeneral 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

    Image 20221212 163949

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 IDEAPreferencesPlugins

  • w oknie wyszukiwania wpisz SonarLint i zainstaluj plugin

    Image 20221122 122111

Skonfiguruj instancję SonarQube

  • w menu głównym przejdź do Intellij IDEAPreferencesToolsSonarLint

  • na liście SonarQube / SonarCloud connections dodaj instancję sonara w pierwszym kroku określając jego nazwę i adres

    Image 20221122 094802

  • w kolejnym kroku wprowadź token dostępowy

    Image 20221122 095035

  • w menu głównym przejdź do Intellij IDEAPreferencesToolsSonarLintProject Settings i podłącz SonarLint pod wybrany projekt

    Image 20221122 095347

  • Image 20221122 100038
Last modified: 30 May 2024