Налаштування SonarQube для аналізу якості коду мобільного додатку
SonarQube — статичний аналізатор коду, який умеет працювати зі Swift, Kotlin, Java, TypeScript та Dart. Для мобільних проектів це означає: виявлення потенційних NPE до потрапляння в production, контроль дублювання коду між модулями, відслідковування code smells у Kotlin coroutines, примусовий coverage-поріг перед мержем у main.
Налаштування для Android (Kotlin)
Плагін SonarQube інтегрується в Gradle:
// build.gradle.kts (project level)
plugins {
id("org.sonarqube") version "4.4.1.3373"
}
sonar {
properties {
property("sonar.projectKey", "myapp-android")
property("sonar.host.url", System.getenv("SONAR_HOST_URL") ?: "http://sonarqube:9000")
property("sonar.token", System.getenv("SONAR_TOKEN") ?: "")
property("sonar.sources", "app/src/main/kotlin")
property("sonar.tests", "app/src/test/kotlin,app/src/androidTest/kotlin")
property("sonar.android.lint.report", "app/build/reports/lint-results-debug.xml")
property("sonar.coverage.jacoco.xmlReportPaths",
"app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml")
property("sonar.kotlin.detekt.reportPaths",
"app/build/reports/detekt/detekt.xml")
}
}
Запуск аналізу в CI:
./gradlew \
lintDebug \
testDebugUnitTest \
jacocoTestReport \
detekt \
sonar \
--info
JaCoCo налаштовується окремо для отримання XML-отчету про покриття.
Налаштування для iOS (Swift)
SonarQube аналізує Swift через sonar-scanner CLI з sonar-swift плагіном або вбудований Swift analyzer (SonarQube 10+):
# sonar-project.properties
sonar.projectKey=myapp-ios
sonar.sources=MyApp/Sources
sonar.exclusions=**/*.generated.swift,Pods/**/*
sonar.swift.coverage.reportPaths=fastlane/test_output/coverage.xml
sonar.swift.swiftlint.reportPaths=fastlane/swiftlint-report.json
У CI:
# Генерація coverage
xcodebuild test \
-scheme MyApp \
-destination 'platform=iOS Simulator,name=iPhone 15' \
-enableCodeCoverage YES
# Конвертація у формат, зрозумілий SonarQube
slather coverage \
--cobertura-xml \
--output-directory fastlane/test_output \
MyApp.xcodeproj
# Аналіз
sonar-scanner \
-Dsonar.token=$SONAR_TOKEN \
-Dsonar.host.url=$SONAR_HOST_URL
Quality Gate в PR
Quality Gate — набір умов, при невиконанні яких SonarQube блокує мерж. Типові пороги для мобільного проекту:
| Метрика | Умова |
|---|---|
| Coverage on new code | >= 70% |
| Duplications on new code | <= 5% |
| Maintainability Rating | A |
| Reliability Rating | A |
| Security Rating | A |
| Security Hotspots Reviewed | 100% |
У GitHub Actions інтеграція через sonarqube-quality-gate-action:
- name: SonarQube Quality Gate check
uses: sonarsource/[email protected]
timeout-minutes: 5
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
Якщо Quality Gate не пройшов — CI упадє, PR не можна смержити.
SonarCloud vs Self-hosted SonarQube
SonarCloud — облачна версія, без інфраструктури, безплатна для open source. Self-hosted SonarQube — потрібен сервер (мінімум 2GB RAM, рекомендується 4GB), PostgreSQL. Community Edition безплатна, але не підтримує аналіз branch'ей (тільки main). Developer Edition — платна, але необхідна для PR-аналізу та Quality Gate на feature-гілках.
Процес
Розгортання SonarQube (self-hosted або SonarCloud) → створення проекту → налаштування Gradle plugin / sonar-project.properties → інтеграція coverage та lint у отчети → додання кроку в CI → налаштування Quality Gate → документація.
Тривалість: 1–3 дні. Вартість розраховується індивідуально.







