Sonar runner 插件是目前仍是孵化狀態(tài)。請(qǐng)務(wù)必注意,在以后的 Gradle 版本中,DSL 和其他配置可能會(huì)有所改變。
Sonar Runner 插件提供了對(duì) Sonar,一個(gè)基于 web 的代碼質(zhì)量監(jiān)測(cè)平臺(tái)的集成。它基于 Sonar Runner,一個(gè)分析源代碼及構(gòu)建輸出,并將所有收集的信息儲(chǔ)存在 Sonar 數(shù)據(jù)庫(kù)的 Sonar 客戶端組件。相比單獨(dú)使用 Sonar Runner,Sonar Runner 插件提供了以下便利:
自動(dòng)配置 Sonar Runner
可以通過一個(gè)正規(guī)的 Gradle 任務(wù)來執(zhí)行 Sonar Runner,這使得在任何 Gradle 可用的地方,它都可以用(開發(fā)人員構(gòu)建,CI 服務(wù)器等),而無需下載,安裝,和維護(hù) Sonar Runner 的安裝。
通過 Gradle 構(gòu)建腳本動(dòng)態(tài)配置
根據(jù)需要,可以利用 Gradle 腳本的所有特性去配置 Sonar Runner。
提供了廣泛范圍的默認(rèn)配置
Gradle 已經(jīng)有很多 Sonar Runner 成功分析一個(gè)項(xiàng)目所需的信息?;谶@些信息對(duì) Sonar Runner 進(jìn)行預(yù)配置,減少了許多手動(dòng)配置的需要。
Sonar Runner 插件是 Sonar 插件的繼任者。目前它還在孵化中的狀態(tài)。該插件基于 Sonar Runner 2.0,這使它與 Sonar 2.11 或更高的版本相兼容。不同于 Sonar 插件,Sonar Runner 插件與 Sonar 3.4 或更高的版本一起使用時(shí)也表現(xiàn)正常。
若要開始,請(qǐng)對(duì)要分析的項(xiàng)目配置使用 Sonar Runner 插件。
配置使用 Sonar Runner 插件
build.gradle
apply plugin: "sonar-runner"
假設(shè)一個(gè)本地的 Sonar 服務(wù)使用開箱即用的設(shè)置啟動(dòng)和運(yùn)行,則不需要進(jìn)一步的強(qiáng)制性的配置。執(zhí)行 gradle sonarRunner 并等待構(gòu)建完成,然后打開 Sonar Runner 輸出結(jié)果的底部所指示的網(wǎng)頁(yè)。你現(xiàn)在應(yīng)該能夠看到分析結(jié)果了。
在執(zhí)行 sonarRunner 任務(wù)前,所有產(chǎn)生輸出以用于 Sonar 分析的需要都需要被執(zhí)行。通常情況下,它們是編譯任務(wù)、測(cè)試任務(wù)和代碼覆蓋任務(wù)。為了滿足這些需要,如果應(yīng)用了 java 插件,Sonar Runner 插件將從 sonarRunner 添加一個(gè)對(duì) test 的任務(wù)依賴。根據(jù)需要,可以添加更多的任務(wù)依賴。
Sonar Runner 插件向 project 添加了一個(gè) SonarRunner 擴(kuò)展,它允許通過被稱為 Sonar 屬性 的鍵/值對(duì)配置 Sonar Runner。一個(gè)典型的基線配置包括了 Sonar 服務(wù)器和數(shù)據(jù)庫(kù)的連接設(shè)置。
配置 Sonar 連接設(shè)置
build.gradle
sonarRunner {
sonarProperties {
property "sonar.host.url", "http://my.server.com"
property "sonar.jdbc.url", "jdbc:mysql://my.server.com/sonar"
property "sonar.jdbc.driverClassName", "com.mysql.jdbc.Driver"
property "sonar.jdbc.username", "Fred Flintstone"
property "sonar.jdbc.password", "very clever"
}
}
對(duì)于標(biāo)準(zhǔn)的 Sonar 屬性的完整列表,請(qǐng)參閱 Sonar 文檔。如果你碰巧使用另外的 Sonar 插件,請(qǐng)參考它們的文檔。
或者,可以從命令行設(shè)置 Sonar 屬性。有關(guān)更多信息,請(qǐng)參見第35.6節(jié),“從命令行配置 Sonar 設(shè)置” 。
Sonar Runner 插件利用 Gradle 的對(duì)象模型所包含的信息,提供了許多標(biāo)準(zhǔn)的 Sonar 屬性的智能默認(rèn)值。下表總結(jié)了這些默認(rèn)值。注意,對(duì)于配置使用了 java-base 或 java 插件的project,有提供另外的默認(rèn)值。對(duì)于一些屬性(尤其是服務(wù)器和數(shù)據(jù)庫(kù)的連接配置),確定留給 Sonar Runner 一個(gè)合適的默認(rèn)值。
表 36.1. 標(biāo)準(zhǔn) Sonar 屬性的 Gradle 默認(rèn)值
Property | Gradle 默認(rèn)值 |
sonar.projectKey | "$project.group:$project.name" (所分析的層次結(jié)構(gòu)的根項(xiàng)目,否則留給 Sonar Runner 處理) |
sonar.projectName | project.name |
sonar.projectDescription | project.description |
sonar.projectVersion | project.version |
sonar.projectBaseDir | project.projectDir |
sonar.working.directory | "$project.buildDir/sonar" |
sonar.dynamicAnalysis | "reuseReports" |
表 36.2. 配置使用 java-base 插件時(shí)另外添加的默認(rèn)值
Property | Gradle 默認(rèn)值 |
sonar.java.source | project.sourceCompatibility |
sonar.java.target | project.targetCompatibility |
表 36.2. 配置使用 java 插件時(shí)另外添加的默認(rèn)值
Property | Gradle 默認(rèn)值 |
sonar.sources | sourceSets.main.allSource.srcDirs(過濾為只包含存在的目錄) |
sonar.tests | sourceSets.test.allSource.srcDirs(過濾為只包含存在的目錄) |
sonar.binaries | sourceSets.main.runtimeClasspath (過濾為只包含存在的目錄) |
sonar.libraries | sourceSets.main.runtimeClasspath (過濾為僅包括文件 ;如果有必要會(huì)加上 rt.jar ) |
sonar.surefire.reportsPath | test.testResultsDir (如果該目錄存在) |
sonar.junit.reportsPath | test.testResultsDir (如果該目錄存在) |
Sonar Runner 插件能夠一次分析整個(gè)項(xiàng)目的層次結(jié)構(gòu)。它能夠在 Sonar 的 web 界面生成一個(gè)層次圖,該層次圖包含了綜合的指標(biāo)且能夠深入到子項(xiàng)目中。分析一個(gè)項(xiàng)目的層次結(jié)果還可以比單獨(dú)分析每個(gè)項(xiàng)目花費(fèi)更省時(shí)間。
要分析一個(gè)項(xiàng)目的層次結(jié)構(gòu), 需要把 Sonar Runner 插件應(yīng)用于層次結(jié)構(gòu)的最頂層項(xiàng)目。通常(但不是一定)會(huì)是這個(gè) Gradle 構(gòu)建的根項(xiàng)目。與分析有關(guān)的信息作為一個(gè)整體,比如服務(wù)器和數(shù)據(jù)庫(kù)的連接設(shè)置,必須在這一個(gè) project 的 sonarRunner 塊中進(jìn)行配置。在命令行上設(shè)置的任何 Sonar 屬性也會(huì)應(yīng)用到這個(gè) project 中。
全局配置設(shè)置
build.gradle
sonarRunner {
sonarProperties {
property "sonar.host.url", "http://my.server.com"
property "sonar.jdbc.url", "jdbc:mysql://my.server.com/sonar"
property "sonar.jdbc.driverClassName", "com.mysql.jdbc.Driver"
property "sonar.jdbc.username", "Fred Flintstone"
property "sonar.jdbc.password", "very clever"
}
}
在 subprojects 塊中,可以配置共享子項(xiàng)目之間的配置。
共享的配置設(shè)置
build.gradle
subprojects {
sonarRunner {
sonarProperties {
property "sonar.sourceEncoding", "UTF-8"
}
}
}
特定項(xiàng)目的信息在對(duì)應(yīng)的 project 的 sonarRunner 塊中配置。
個(gè)別配置設(shè)置
build.gradle
project
sonarRunner {
sonarProperties {
property "sonar.language", "grvy"
}
}
}
對(duì)于一個(gè)特定的子項(xiàng)目,要跳過 Sonar 分析,可以設(shè)置 sonarRunner.skipProject。
跳過項(xiàng)目分析
build.gradle
project
sonarRunner {
skipProject = true
}
}
默認(rèn)情況下, Sonar Runner 插件傳給 project 的 main source set 將作為生產(chǎn)源文件,傳給 project 的 test source sets 將作為測(cè)試源文件。這個(gè)過程與 project 的源目錄布局無關(guān)。根據(jù)需要,可以添加額外的 source sets。
分析自定義的Source Sets
build.gradle
sonarRunner {
sonarProperties {
properties["sonar.sources"] += sourceSets.custom.allSource.srcDirs
properties["sonar.tests"] += sourceSets.integTest.allSource.srcDirs
}
}
要分析非 Java 語言編寫的代碼,請(qǐng)安裝相應(yīng)的 Sonar 插件,并相應(yīng)地設(shè)置 sonar.project.language :
分析非 Java 語言
build.gradle
sonarRunner {
sonarProperties {
property "sonar.language", "grvy" // set language to Groovy
}
}
截至 Sonar 3.4,每個(gè)項(xiàng)目只可以分析一種語言。不過,在多項(xiàng)目構(gòu)建中你可以為每一個(gè)項(xiàng)目分析一種不同的語言。
讓我們?cè)僭敿?xì)看看 sonarRunner.sonarProperties {}塊。正如我們?cè)谑纠幸呀?jīng)看到的, property()方法允許設(shè)置新屬性或重寫現(xiàn)有的屬性。此外,所有已配置到這一點(diǎn)的屬性,包括通過 Gradle 預(yù)配置的所有屬性,還可通過 properties 訪問器進(jìn)行使用。
在 properties map 的條目可以使用常見的 Groovy 語法來讀取和寫入。為了方便它們的操作,這些值值仍然使用它們慣用的類型 (File,List等)。SonarProperties 塊在經(jīng)過評(píng)估后,這些值值被轉(zhuǎn)換為字符串,如下所示: 集合的值(遞歸) 轉(zhuǎn)換為以逗號(hào)分隔的字符串,其他所有的值通過調(diào)用其tostring ()方法進(jìn)行轉(zhuǎn)換。
因?yàn)?sonarProperties 塊的評(píng)估是惰性的,Gradle 的對(duì)象模型的屬性可以在塊中被安全地引用,而無需擔(dān)心它們還沒有被賦值。
Sonar 屬性也可以從命令行中設(shè)置,通過設(shè)置一個(gè)系統(tǒng)屬性,名稱就像正在考慮中的 Sonar 屬性。當(dāng)處理敏感信息 (例如證件),環(huán)境信息,或點(diǎn)對(duì)點(diǎn)配置時(shí),這會(huì)非常有用。
gradle sonarRunner -Dsonar.host.url=http://sonar.mycompany.com -Dsonar.jdbc.password=myPassword -Dsonar.verbose=true
雖然有時(shí)當(dāng)然很有用,但我們建議在 (版本控制的)構(gòu)建腳本中,能夠方便地讓每個(gè)人都保持大部分的配置。
通過一個(gè)系統(tǒng)屬性設(shè)置的 Sonar 屬性值將覆蓋構(gòu)建腳本中設(shè)置的任何值(同樣的屬性名稱)。當(dāng)分析項(xiàng)目的層次結(jié)構(gòu)時(shí),通過系統(tǒng)屬性設(shè)置的值應(yīng)用于所分析層次結(jié)構(gòu)的根項(xiàng)目。
根據(jù)項(xiàng)目大小,Sonar Runner 可能需要大量的內(nèi)存。由于這個(gè)和其他(主要是隔離)的原因,最好在一個(gè)獨(dú)立的進(jìn)程中執(zhí)行 Sonar Runner。一旦 Sonar Runner 2.1 發(fā)布,將提供這個(gè)功能,并由 Sonar Runner 插件采用。到那時(shí),Sonar Runner 會(huì)在 Gradle 主進(jìn)程中執(zhí)行。
Sonar Runner 插件向 project 中添加了以下任務(wù)。
表 36.4. Sonnar Runner 插件 - 任務(wù)
任務(wù)名稱 | 依賴于 | 類型 | 描述 |
sonarRunner
{
|
- | sonarRunner { | 分析項(xiàng)目層次結(jié)構(gòu),并將結(jié)果存儲(chǔ)在 Sonar 數(shù)據(jù)庫(kù)。 |
更多建議: