Анализ качества кода с SonarQube
SonarQube сканирует кодовую базу на запахи кода, дублирование, потенциальные баги и уязвимости. Quality Gate — автоматический порог: PR не мержится если анализ не пройден.
SonarQube: self-hosted
# Docker Compose
services:
sonarqube:
image: sonarqube:10-community
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
ports:
- "9000:9000"
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_logs:/opt/sonarqube/logs
db:
image: postgres:15
environment:
POSTGRES_DB: sonar
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- sonar_db:/var/lib/postgresql/data
volumes:
sonarqube_data:
sonarqube_logs:
sonar_db:
Конфигурация проекта
# sonar-project.properties
sonar.projectKey=my-project
sonar.projectName=My Project
sonar.projectVersion=1.0
sonar.sources=src
sonar.tests=src
sonar.test.inclusions=**/*.test.ts,**/*.spec.ts
sonar.exclusions=**/*.d.ts,**/node_modules/**,**/.next/**
# TypeScript
sonar.typescript.lcov.reportPaths=coverage/lcov.info
# Дублирование: минимум токенов для срабатывания
sonar.cpd.ts.minimumTokens=100
GitHub Actions интеграция
# .github/workflows/sonarqube.yml
name: SonarQube Analysis
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
sonar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # shallow clone отключает анализ изменений
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- name: Generate coverage report
run: npm test -- --coverage --coverageReporters=lcov
env:
CI: true
- name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@v2
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
- name: SonarQube Quality Gate check
uses: SonarSource/sonarqube-quality-gate-action@v1
timeout-minutes: 5
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
Quality Gate: настройка порогов
SonarQube Dashboard → Quality Gates → Create
Условия для новых строк кода:
Coverage < 70% → FAILED
Duplicated Lines > 3% → FAILED
Maintainability Rating < A → FAILED
Reliability Rating < A → FAILED
Security Rating < A → FAILED
Security Hotspots Reviewed < 100% → FAILED
SonarCloud: облачный вариант
# Бесплатно для открытых проектов
- name: SonarCloud Scan
uses: SonarSource/sonarcloud-github-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with:
args: >
-Dsonar.organization=my-org
-Dsonar.projectKey=my-org_my-project
-Dsonar.sources=src
-Dsonar.typescript.lcov.reportPaths=coverage/lcov.info
Ключевые метрики SonarQube:
- Coverage — процент покрытия тестами
- Duplications — дублированные блоки кода
- Code Smells — запахи кода (complexity, cognitive complexity)
- Bugs — вероятные баги (null pointer, incorrect conditions)
- Vulnerabilities — потенциальные уязвимости
- Security Hotspots — требуют ручного review
Настройка SonarQube с GitHub Actions и Quality Gate — 1–2 рабочих дня.







