SonarQube — analiza jakości kodu i wykrywanie błędów
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS i serwery
Code review przez ludzi nie wyłapuje wszystkiego — SQL injection w obiekcie DAO, brakujące null-checke, zduplikowane bloki kodu kopiowane między modułami. SonarQube automatyzuje tę walidację, skanując każdy pull request i blokując merge, gdy jakość kodu nie spełnia zdefiniowanych progów. Ten artykuł pokazuje instalację SonarQube Community Edition przez Docker, konfigurację projektu, integrację z GitHub Actions i Jenkins oraz definiowanie własnych Quality Gates.
Instalacja SonarQube przez Docker Compose
SonarQube wymaga PostgreSQL — wbudowany H2 jest tylko do testów. Konfiguracja
vm.max_map_count to wymóg Elasticsearch wbudowanego w SonarQube.
# Wymagane na hoście (Elasticsearch)
sudo sysctl -w vm.max_map_count=524288
sudo sysctl -w fs.file-max=131072
echo "vm.max_map_count=524288" | sudo tee -a /etc/sysctl.conf
# docker-compose.yml
version: "3.9"
services:
sonarqube:
image: sonarqube:community
container_name: sonarqube
restart: unless-stopped
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar_pass
ports:
- "9000:9000"
volumes:
- sonar_data:/opt/sonarqube/data
- sonar_extensions:/opt/sonarqube/extensions
- sonar_logs:/opt/sonarqube/logs
ulimits:
nofile:
soft: 131072
hard: 131072
db:
image: postgres:15-alpine
container_name: sonar-db
restart: unless-stopped
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar_pass
POSTGRES_DB: sonar
volumes:
- sonar_db:/var/lib/postgresql/data
volumes:
sonar_data:
sonar_extensions:
sonar_logs:
sonar_db:
# docker compose up -d
# UI: http://twoj-ip:9000 (login: admin / admin — zmien od razu!) Konfiguracja projektu — sonar-project.properties
Każdy projekt wymaga pliku sonar-project.properties w root repozytorium. Alternatywnie
parametry można przekazać przez CLI (-Dsonar.projectKey=...). Poniższy przykład
dla projektu PHP z testami PHPUnit i TypeScript.
# sonar-project.properties sonar.projectKey=myproject sonar.projectName=My Project sonar.projectVersion=1.0 sonar.host.url=https://sonar.example.com # Katalogi z kodem (przecinkowe) sonar.sources=src,app sonar.tests=tests,test # Wyklucz pliki vendor i node_modules sonar.exclusions=vendor/**,node_modules/**,*.min.js # PHP — raport pokrycia (PHPUnit → Clover XML) sonar.php.coverage.reportPaths=coverage/clover.xml # JavaScript/TypeScript — LCOV sonar.javascript.lcov.reportPaths=coverage/lcov.info # Kodowanie sonar.sourceEncoding=UTF-8
Integracja z GitHub Actions
SonarQube może analizować każdy PR i raportować wynik bezpośrednio w GitHub. Wymaga tokenu projektu SonarQube w GitHub Secrets oraz dekoracji PR (opcja w ustawieniach projektu SonarQube).
# .github/workflows/sonar.yml
name: SonarQube Analysis
on:
push:
branches: [ main, develop ]
pull_request:
types: [ opened, synchronize ]
jobs:
sonar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Wazne! SonarQube potrzebuje pelnej historii git
- name: Generate coverage report
run: |
composer install --prefer-dist
./vendor/bin/phpunit --coverage-clover coverage/clover.xml
- name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@master
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
- name: SonarQube Quality Gate check
uses: SonarSource/sonarqube-quality-gate-action@master
timeout-minutes: 5
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} Integracja z Jenkins
# Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
environment {
SONAR_TOKEN = credentials('sonar-token')
}
stages {
stage('Tests') {
steps {
sh './vendor/bin/phpunit --coverage-clover coverage/clover.xml'
}
}
stage('SonarQube Analysis') {
steps {
withSonarQubeEnv('SonarQube') {
sh '''
sonar-scanner \
-Dsonar.projectKey=myproject \
-Dsonar.sources=src \
-Dsonar.php.coverage.reportPaths=coverage/clover.xml
'''
}
}
}
stage('Quality Gate') {
steps {
timeout(time: 5, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
}
} Quality Gates i profile reguł
Quality Gate to warunki, które musi spełnić analiza. Domyślny Sonar way sprawdza nowy kod (dodany w bieżącym PR/commicie). Możesz tworzyć własne Quality Gates dostosowane do projektu.
| Metryka | Domyślny próg (Sonar way) | Przykład własnego progu |
|---|---|---|
| Coverage on new code | ≥ 80% | ≥ 70% (złagodzony) |
| Duplicated Lines on new code | ≤ 3% | ≤ 5% |
| New Security Vulnerabilities | 0 (High/Critical) | 0 (All severities) |
| New Bugs (Blocker/Critical) | 0 | 0 |
| Maintainability Rating | A | B (złagodzony) |
Profile reguł (Quality Profiles) definiują zestaw reguł aktywnych dla danego języka. SonarQube ma wbudowane profile dla PHP, Java, JS/TS i innych. Możesz dziedziczyć z Sonar way i wyłączać reguły, które generują fałszywe alarmy w Twoim projekcie. Profile możesz przypisać do konkretnego projektu lub ustawić jako domyślny dla języka.