Настройка SonarQube для анализа качества кода мобильного приложения
SonarQube — статический анализатор кода, который умеет работать с Swift, Kotlin, Java, TypeScript и Dart. Для мобильных проектов это значит: обнаружение потенциальных NPE до попадания в продакшн, контроль дублирования кода между модулями, отслеживание 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 дня. Стоимость рассчитывается индивидуально.







