Представьте: вы выпускаете обновление мобильного приложения, а в продакшн уходит 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 дня в зависимости от сложности проекта. Стоимость рассчитывается индивидуально. Обратитесь к нам — мы оценим ваш проект и предложим оптимальное решение.







