Статьи

Мультимодульные проекты Sonar и Gradle


Я люблю
сонар . Это прекрасный способ собрать некоторые метрики для ваших проектов Java — без проблем и завернутый в приятный на вид пользовательский интерфейс. Для основанных на Maven проектов Sonar буквально работает из коробки. Просто запустите ваш экземпляр Sonar (при условии, что вы используете настройки по умолчанию, работающие на localhost), а затем просто запустите его, используя:

$ mvn sonar:sonar 

Через несколько секунд вы должны иметь метрики, доступные по адресу:

http://localhost:9000/

Ну, последние несколько дней я настраивал многомодульный
проект
Gradle для Sonar. Позвольте мне начать с того, что Грэдл великолепен. Очень приятно иметь возможность объявлять зависимости как однострочные, а также легко настраивать свои сценарии, но при этом иметь разумные значения по умолчанию. Вид лучшего из обоих миров.

Однако настроить Sonar для многомодульного проекта, к сожалению, немного сложнее, чем то, к чему я привык в мире Maven. Это не очень сложно, но мне потребовалось время, чтобы собрать всю информацию.

Заставить ваш плагин Sonar просто делать что-то довольно просто. Просто выполните основные шаги, описанные в документации к плагину по адресу:

Одним из отличий между плагином Sonar для Gradle и Maven является то, что версия Gradle не запускает автоматически анализ покрытия кода. Это необходимо настроить вручную. Именно здесь официальный документ смутно ссылается на Кобертуру.

Во-первых, я пытался использовать Cobertura для покрытия кода, но мне казалось, что я столкнулся с трудностями в своих многомодульных проектах. Плагин Cobertura находится здесь:


Случайно я понял, что у ребят из Sonar есть репозиторий GitHub с примерами настройки сонаров для различных систем сборки, включая Gradle:

В своих примерах они используют
JaCoCo , который не упоминается в оригинальных документах Gradle, и, возможно, я мог бы продолжить с Cobertura, но казалось, что Sonar предпочитает JaCoCo, и поэтому я продолжил с этим.

Некоторые ограничения плагина Gradle Sonar У плагина

Gradle Sonar есть досадное ограничение, где я могу запустить его для проекта ROOT ИЛИ для подпроектов индивидуально. Подробности смотрите в следующем билете Gradle Jira:

Кроме того, я столкнулся с незначительной проблемой: я не могу установить ссылки на приборной панели Sonar. Похоже, это связано со следующей проблемой Sonar Jira:


Плагин покрытия кода JaCoCo «немного меньше» поддерживается плагином Gradle Sonar, например, плагин Gradle
не имеет явного установщика для
JacocoReportPath  и по умолчанию принимает «целевую» папку в качестве каталога сборки. Поэтому вы должны установить явно:
props["sonar.jacoco.reportPath"]  = "${buildDirName}/jacoco.exec"

Наконец, я немного отклонился от примера SonarSource Gradle, и вместо системных свойств я хотел использовать
свойства Gradle, чтобы позволить пользователям предоставлять нестандартные параметры конфигурации Sonar (url базы данных, параметры jdbc и т. Д.). Ну, во время настройки я столкнулся с еще одной проблемой Gradle Jira:

Но в итоге я с радостью могу запустить многомодульный проект Gradle с Sonar и собирать статистику Code Coverage.
Вот соответствующий код из моего
файла
build.gradle :
apply plugin: 'sonar'
 
sonar {
 
    if (rootProject.hasProperty('sonarHostUrl')) {
        server.url = rootProject.sonarHostUrl
    }
 
    database {
        if (rootProject.hasProperty('sonarJdbcUrl')) {
            url = rootProject.sonarJdbcUrl
        }
        if (rootProject.hasProperty('sonarJdbcDriver')) {
            driverClassName = rootProject.sonarJdbcDriver
        }
        if (rootProject.hasProperty('sonarJdbcUsername')) {
            username = rootProject.sonarJdbcUsername
        }
        if (rootProject.hasProperty('sonarJdbcPassword')) {
            password = rootProject.sonarJdbcPassword
        }
    }
 
    project {
        dynamicAnalysis  = "reuseReports"
        withProjectProperties { props ->
            props["sonar.core.codeCoveragePlugin"] = "jacoco"
            props["sonar.jacoco.reportPath"]       = "${buildDirName}/jacoco.exec"
        }
    }
 
    println("Sonar parameters used: server.url='${server.url}'; database.url='${database.url}'; database.driverClassName='${database.driverClassName}'; database.username='${database.username}'")
 
}
 
subprojects { subproject ->
 
    ...
 
    // See http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:configurations
    // and http://www.gradle.org/docs/current/dsl/org.gradle.api.artifacts.ConfigurationContainer.html
    configurations {
        jacoco //Configuration Group used by Sonar to provide Code Coverage using JaCoCo
    }
 
    // dependencies that are common across all java projects
    dependencies {
        ...
        jacoco group: "org.jacoco", name: "org.jacoco.agent", version: "0.5.3.201107060350", classifier: "runtime"
        ...
    }
 
    test {
        jvmArgs "-javaagent:${configurations.jacoco.asPath}=destfile=${buildDir}/jacoco.exec,includes=org.your.project.*"
    }
    ...
}

Я надеюсь, что это полезная информация для всех пользователей Gradle.

 

С http://hillert.blogspot.com/2012/01/sonar-and-gradle-multi-module-projects.html