Уявіть: ви випускаєте оновлення мобільного застосунку, а в продакшн потрапляє NullPointerException, який проскочив код-рев’ю. Або не помічаєте дублювання логіки в двох модулях, і через місяць правки вимагають удвічі більше часу. Ручні перевірки та лінтери не дають єдиної картини, особливо у великих проєктах з десятками модулів. Регресії накопичуються, технічний борг зростає, а швидкість розробки падає. Ми впроваджуємо SonarQube — централізований статичний аналізатор, який автоматично контролює якість кожного коміту та не пропускає дефекти в основну гілку.
Навіщо мобільному проєкту SonarQube?
SonarQube працює з Swift, Kotlin, Java, TypeScript та Dart. Для мобільного застосунку це означає: пошук потенційних NPE до продакшну, контроль дублювання між модулями, відстеження code smells у корутинах та примусовий поріг покриття перед мержем. Ми бачили проєкти, де після впровадження кількість багів скоротилася на 40% за півроку — це не лише стабільність, а й економія: команда витрачає на 30% менше часу на регресійне тестування. Наші сертифіковані інженери налаштовують SonarQube під ваш проєкт за 1–3 дні. Ми гарантуємо, що якість коду зросте в 2–3 рази порівняно з ручним рев’ю.
Чому варто впроваджувати SonarQube в CI?
Без автоматичного аналізу кожна зміна коду несе ризик. Людина пропускає дрібні дефекти, які накопичуються. SonarQube в CI ловить їх одразу: після кожного пуша запускається аналіз, і в разі порушення Quality Gate збірка падає. Це дисциплінує команду та знижує час на код-рев’ю. Наприклад, типове рев’ю займає 30 хвилин на один PR, а SonarQube перевіряє весь проєкт за 2–3 хвилини. За місяць команда з п’яти розробників економить до 20 людино-годин — ресурс, який можна спрямувати на нові фічі.
Як налаштувати SonarQube для Android?
Плагін 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-звіту про покриття. Для Kotlin ми використовуємо detekt, який виявляє code smells, пов’язані з корутинами та архітектурою.
Як налаштувати SonarQube для iOS?
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 Для iOS ми використовуємо slather для конвертації покриття в Cobertura XML — формат, який розуміє SonarQube. А swiftlint відловлює стилістичні проблеми та потенційні помилки.
Як налаштувати 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 не можна змержити. Для GitLab CI аналогічна конфігурація через sonar-scanner.
SonarCloud чи self-hosted: що обрати?
| Критерій | SonarCloud | Self-hosted SonarQube |
|---|---|---|
| Інфраструктура | Не потрібна | Сервер (мінімум 2GB RAM) |
| Ціна | Для open source безкоштовно | Community Edition безкоштовна, Developer Edition платна |
| Контроль даних | Хмара | Повний |
| Час впровадження | 1–2 години | 1–2 дні |
| Аналіз feature-гілок | Так (у всіх тарифах) | Тільки Developer Edition |
SonarCloud швидше впровадити, self-hosted дає повний контроль. Для більшості комерційних проєктів ми рекомендуємо SonarCloud — час налаштування скорочується вдвічі. Якщо потрібне зберігання коду в закритому контурі — обираємо self-hosted.
Що входить у роботу
- Розгортання SonarQube (хмара або self-hosted)
- Створення проєкту та налаштування плагінів (Gradle, sonar-swift)
- Інтеграція coverage (JaCoCo, slather) та лінтерів (detekt, swiftlint)
- Додавання кроку аналізу в CI
- Кастомізація Quality Gate під ваш стек
- Документація та навчання команди
- Технічна підтримка на етапі впровадження
Наші інженери мають сертифікати SonarQube та 5+ років досвіду в мобільній розробці. Ми успішно впровадили аналіз для понад 50 проєктів, включаючи застосунки з мільйонами користувачів. Зв'яжіться з нами для консультації — ми підготуємо конфігурацію під ваш проєкт і навчимо команду. Замовте впровадження SonarQube та отримайте стабільну якість коду.
Строки та вартість
Строк налаштування — 1–3 дні залежно від складності проєкту. Вартість розраховується індивідуально. Зверніться до нас — ми оцінимо ваш проєкт і запропонуємо оптимальне рішення.







