Gradle Sonar 插件

2022-08-03 16:00 更新

你可能會(huì)想使用新的 Sonar Runner 插件來(lái)代替現(xiàn)在這個(gè)插件。尤其是因?yàn)橹挥?Sonar Runner 插件支持 Sonar 3.4 及更高的版本。

Sonar 插件提供了對(duì) Sonar,一個(gè)基于 web 的代碼質(zhì)量監(jiān)測(cè)平臺(tái)的集成。該插件添加了sonarAnalyze task ,用來(lái)分析一個(gè) project 及子 project 都應(yīng)用了哪個(gè)插件。分析結(jié)果存儲(chǔ)于 Sonar 數(shù)據(jù)庫(kù)中。該插件基于 Sonar Runner,并要求是 Sonar 2.11 或更高的版本。

SonarAnalyze task 是一項(xiàng)需要顯式執(zhí)行的獨(dú)立任務(wù),不依賴于任何其他 task。除了源代碼之外,該 task 還分析了類文件和測(cè)試結(jié)果文件(如果有)。為獲得最佳結(jié)果,建議在分析前運(yùn)行一次完整的構(gòu)建。在典型的設(shè)置中,會(huì)每天在構(gòu)建服務(wù)器上運(yùn)行一次分析。

用法

最低要求是必須配置 Sonar 插件應(yīng)用于該 project。

配置使用 Sonar 插件

build.gradle

apply plugin: "sonar"  

除非 Sonar 是在本地上運(yùn)行,并且有默認(rèn)的配置,否則有必要配置 Sonar 服務(wù)器及數(shù)據(jù)庫(kù)的連接設(shè)置。

配置 Sonar 連接設(shè)置

build.gradle

sonar
    server {
        url = "http://my.server.com"
    }
    database {
        url = "jdbc:mysql://my.server.com/sonar"
        driverClassName = "com.mysql.jdbc.Driver"
        username = "Fred Flintstone"
        password = "very clever"
    }
}  

或者,可以從命令行設(shè)置某些或全部的連接設(shè)置。

Project 設(shè)置會(huì)決定這個(gè)項(xiàng)目將如何進(jìn)行分析。默認(rèn)配置非常適合于分析標(biāo)準(zhǔn) Java 項(xiàng)目,并可以在許多方面進(jìn)行自定義。

配置 Sonar project 設(shè)置

build.gradle

sonar
    project
        coberturaReportPath = file("$buildDir/cobertura.xml")
    }
}  

在上面的例子中,sonar,server,database 和 project 塊分別配置的是SonarRootModel, SonarServer, SonarDatabase 及 SonarProject 類型的對(duì)象??梢圆殚喫鼈兊?API 文檔以了解更多信息。

分析多項(xiàng)目構(gòu)建

Sonar 插件能夠一次分析整個(gè)項(xiàng)目的層次結(jié)構(gòu)。它能夠在 Sonar 的 web 界面生成一個(gè)層次圖,該層次圖包含了綜合的指標(biāo)且能夠深入到子項(xiàng)目中。同時(shí),它比單獨(dú)分析每個(gè)項(xiàng)目更快。

要分析項(xiàng)目的層次結(jié)構(gòu), 需要把 Sonar 插件應(yīng)用于層次結(jié)構(gòu)的最頂層項(xiàng)目。通常(但不是一定)會(huì)是根項(xiàng)目。在該 project 中的 sonar 塊配置的是一個(gè) SonarRootModel 類型的對(duì)象。它擁有所有全局配置,最重要的服務(wù)器和數(shù)據(jù)庫(kù)的連接設(shè)置。

在多項(xiàng)目構(gòu)建中的全局配置

build.gradle

apply plugin: "sonar"
sonar {
    server {
        url = "http://my.server.com"
    }
    database {
        url = "jdbc:mysql://my.server.com/sonar"
        driverClassName = "com.mysql.jdbc.Driver"
        username = "Fred Flintstone"
        password = "very clever"
    }
}   

層次結(jié)構(gòu)中的每個(gè)項(xiàng)目都有其自身的項(xiàng)目配置。共同的值可以在父構(gòu)建腳本中進(jìn)行設(shè)置。

多項(xiàng)目構(gòu)建中的共同項(xiàng)目配置

build.gradle

subprojects {
    sonar
        project
            sourceEncoding = "UTF-8"
        }
    }
}  

在子項(xiàng)目中的 sonar 塊配置的是一個(gè) SonarProjectModel 類型的對(duì)象。

這些 Projects 也可以單獨(dú)配置。例如,設(shè)置 skip 屬性為 true 以防止一個(gè)項(xiàng)目(和它的子項(xiàng)目)被分析。跳過(guò)的項(xiàng)目將不會(huì)顯示在 Sonar 的 web 界面中。

多項(xiàng)目構(gòu)建中的單獨(dú)項(xiàng)目配置

build.gradle

project
    sonar
        project
            skip = true
        }
    }
}  

另一種典型的各個(gè)項(xiàng)目配置是配置要分析的編程語(yǔ)言。注意,Sonar 只能分析每個(gè)項(xiàng)目的一種語(yǔ)言。

配置語(yǔ)言分析

build.gradle

project
    sonar
        project
            language = "groovy"
        }
    }
}  

當(dāng)一次只設(shè)置一個(gè)屬性時(shí),等效屬性的語(yǔ)法更加簡(jiǎn)潔:

使用屬性語(yǔ)法

build.gradle

project(":project2").sonar.project.language = "groovy"  

分析自定義的 Source Sets

默認(rèn)情況下,Sonar 插件將分析 main source set 里的生產(chǎn)源文件,以及 test source sets 里的測(cè)試源文件。它的分析獨(dú)立于項(xiàng)目的源目錄布局。根據(jù)需要,可以添加額外的 source sets。

分析自定義的 Source Sets

build.gradle

sonar.project {
    sourceDirs += sourceSets.custom.allSource.srcDirs
    testDirs += sourceSets.integTest.allSource.srcDirs
}  

分析非 Java 語(yǔ)言

要分析非 Java 語(yǔ)言編寫的代碼,請(qǐng)安裝相應(yīng)的 Sonar 插件,并相應(yīng)地設(shè)置 sonar.project.language :

分析非 Java 語(yǔ)言

build.gradle

sonar.project {
    language = "grvy" // set language to Groovy
}  

截至 Sonar 3.4,每個(gè)項(xiàng)目只可以分析一種語(yǔ)言。不過(guò),在多項(xiàng)目構(gòu)建中你可以為不同的項(xiàng)目設(shè)置不同的語(yǔ)言。

設(shè)置自定義的 Sonar 屬性

最終,大多數(shù)配置都會(huì)以被稱為 Sonar 屬性的鍵-值對(duì)的形式傳遞給 Sonar 的代碼分析器。在 API 文檔中的 SonarProperty 注解顯示了插件的對(duì)象模型的屬性是如何映射到相應(yīng)的 Sonar 屬性中的。Sonar 插件提供了 hooks,用于 Sonar 屬性傳給代碼分析器前的后置處理。相同的 hook 可以用來(lái)添加額外的屬性,并且不會(huì)被插件的對(duì)象模型所覆蓋。

對(duì)于全局的 Sonar 屬性,可以使用 SonarRootModel 上的 withGlobalProperties hook:

設(shè)置自定義的全局屬性

build.gradle

sonar.withGlobalProperties { props ->
    props["some.global.property"] = "some value"
    // non-String values are automatically converted to Strings
    props["other.global.property"] = ["foo", "bar", "baz"]
}  

對(duì)于每個(gè)項(xiàng)目的 Sonar 屬性,使用 SonarProject 上的 withProjectProperties hook:

設(shè)置自定義的項(xiàng)目屬性

build.gradle

sonar.project.withProjectProperties { props ->
    props["some.project.property"] = "some value"
    // non-String values are automatically converted to Strings
    props["other.global.property"] = ["foo", "bar", "baz"]
}  

Sonar 的可用屬性的列表可以在 Sonar 文檔中找到。注意,對(duì)于大多數(shù)的這些屬性,Sonar 插件的對(duì)象模型具有等效的屬性,且沒(méi)有必要使用 withGlobalProperties 或withProjectProperties 的 hook。對(duì)于第三方 Sonar 插件的配置,請(qǐng)參閱插件的文檔。

從命令行配置 Sonar 的設(shè)置

下面的屬性或者可以從命令行中或者是作為 sonarAnalyze 任務(wù)的任務(wù)參數(shù)這兩種方式之一來(lái)設(shè)置。任務(wù)參數(shù)將覆蓋任何在構(gòu)建腳本中設(shè)置的相應(yīng)值。

  • server.url
  • database.url
  • database.driverClassName
  • database.username
  • database.password
  • showSql
  • showSqlResults
  • verbose
  • forceAnalysis

下面是一個(gè)完整的例子:

gradle sonarAnalyze --server.url=http://sonar.mycompany.com --database.password=myPassword --verbose  

如果你需要從命令行設(shè)置其他屬性,你可以使用系統(tǒng)屬性來(lái)做:

實(shí)現(xiàn)自定義命令行屬性

build.gradle

sonar.project {
    language = System.getProperty("sonar.language", "java")
}  

然而,請(qǐng)記住,通常最好是配置在構(gòu)建腳本中,并在代碼控制下。

任務(wù)

Sonar 插件向 project 中添加了以下任務(wù)。

表 35.1. 聲納插件 - 任務(wù)

任務(wù)名稱 依賴于 類型 描述
sonarAnalyze - sonarAnalyze 分析項(xiàng)目層次結(jié)構(gòu),并將結(jié)果存儲(chǔ)在 Sonar 數(shù)據(jù)庫(kù)。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)