Gradle Sonar Runner 插件

2022-08-03 16:00 更新

Sonar runner 插件是目前仍是孵化狀態(tài)。請務必注意,在以后的 Gradle 版本中,DSL 和其他配置可能會有所改變。

Sonar Runner 插件提供了對 Sonar,一個基于 web 的代碼質量監(jiān)測平臺的集成。它基于 Sonar Runner,一個分析源代碼及構建輸出,并將所有收集的信息儲存在 Sonar 數據庫的 Sonar 客戶端組件。相比單獨使用 Sonar Runner,Sonar Runner 插件提供了以下便利:

自動配置 Sonar Runner

可以通過一個正規(guī)的 Gradle 任務來執(zhí)行 Sonar Runner,這使得在任何 Gradle 可用的地方,它都可以用(開發(fā)人員構建,CI 服務器等),而無需下載,安裝,和維護 Sonar Runner 的安裝。

通過 Gradle 構建腳本動態(tài)配置

根據需要,可以利用 Gradle 腳本的所有特性去配置 Sonar Runner。

提供了廣泛范圍的默認配置

Gradle 已經有很多 Sonar Runner 成功分析一個項目所需的信息。基于這些信息對 Sonar Runner 進行預配置,減少了許多手動配置的需要。

插件狀態(tài)和兼容性

Sonar Runner 插件是 Sonar 插件的繼任者。目前它還在孵化中的狀態(tài)。該插件基于 Sonar Runner 2.0,這使它與 Sonar 2.11 或更高的版本相兼容。不同于 Sonar 插件,Sonar Runner 插件與 Sonar 3.4 或更高的版本一起使用時也表現(xiàn)正常。

入門

若要開始,請對要分析的項目配置使用 Sonar Runner 插件。

配置使用 Sonar Runner 插件

build.gradle

apply plugin: "sonar-runner"  

假設一個本地的 Sonar 服務使用開箱即用的設置啟動和運行,則不需要進一步的強制性的配置。執(zhí)行 gradle sonarRunner 并等待構建完成,然后打開 Sonar Runner 輸出結果的底部所指示的網頁。你現(xiàn)在應該能夠看到分析結果了。

在執(zhí)行 sonarRunner 任務前,所有產生輸出以用于 Sonar 分析的需要都需要被執(zhí)行。通常情況下,它們是編譯任務、測試任務和代碼覆蓋任務。為了滿足這些需要,如果應用了 java 插件,Sonar Runner 插件將從 sonarRunner 添加一個對 test 的任務依賴。根據需要,可以添加更多的任務依賴。

配置 Sonar Runner

Sonar Runner 插件向 project 添加了一個 SonarRunner 擴展,它允許通過被稱為 Sonar 屬性 的鍵/值對配置 Sonar Runner。一個典型的基線配置包括了 Sonar 服務器和數據庫的連接設置。

配置 Sonar 連接設置

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"
    }
}  

對于標準的 Sonar 屬性的完整列表,請參閱 Sonar 文檔。如果你碰巧使用另外的 Sonar 插件,請參考它們的文檔。

或者,可以從命令行設置 Sonar 屬性。有關更多信息,請參見第35.6節(jié),“從命令行配置 Sonar 設置” 。

Sonar Runner 插件利用 Gradle 的對象模型所包含的信息,提供了許多標準的 Sonar 屬性的智能默認值。下表總結了這些默認值。注意,對于配置使用了 java-base 或 java 插件的project,有提供另外的默認值。對于一些屬性(尤其是服務器和數據庫的連接配置),確定留給 Sonar Runner 一個合適的默認值。

表 36.1. 標準 Sonar 屬性的 Gradle 默認值

Property Gradle 默認值
sonar.projectKey "$project.group:$project.name" (所分析的層次結構的根項目,否則留給 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 插件時另外添加的默認值

Property Gradle 默認值
sonar.java.source project.sourceCompatibility
sonar.java.target project.targetCompatibility

表 36.2. 配置使用 java 插件時另外添加的默認值

Property Gradle 默認值
sonar.sources sourceSets.main.allSource.srcDirs(過濾為只包含存在的目錄)
sonar.tests sourceSets.test.allSource.srcDirs(過濾為只包含存在的目錄)
sonar.binaries sourceSets.main.runtimeClasspath (過濾為只包含存在的目錄)
sonar.libraries sourceSets.main.runtimeClasspath (過濾為僅包括文件 ;如果有必要會加上 rt.jar
sonar.surefire.reportsPath test.testResultsDir (如果該目錄存在)
sonar.junit.reportsPath test.testResultsDir (如果該目錄存在)

分析多項目構建

Sonar Runner 插件能夠一次分析整個項目的層次結構。它能夠在 Sonar 的 web 界面生成一個層次圖,該層次圖包含了綜合的指標且能夠深入到子項目中。分析一個項目的層次結果還可以比單獨分析每個項目花費更省時間。

要分析一個項目的層次結構, 需要把 Sonar Runner 插件應用于層次結構的最頂層項目。通常(但不是一定)會是這個 Gradle 構建的根項目。與分析有關的信息作為一個整體,比如服務器和數據庫的連接設置,必須在這一個 project 的 sonarRunner 塊中進行配置。在命令行上設置的任何 Sonar 屬性也會應用到這個 project 中。

全局配置設置

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 塊中,可以配置共享子項目之間的配置。

共享的配置設置

build.gradle

subprojects {
    sonarRunner {
        sonarProperties {
            property "sonar.sourceEncoding", "UTF-8"
        }
    }
}  

特定項目的信息在對應的 project 的 sonarRunner 塊中配置。

個別配置設置

build.gradle

project
    sonarRunner {
        sonarProperties {
            property "sonar.language", "grvy"
        }
    }
}  

對于一個特定的子項目,要跳過 Sonar 分析,可以設置 sonarRunner.skipProject。

跳過項目分析

build.gradle

project
    sonarRunner {
        skipProject = true
    }
}  

分析自定義的 Source Sets

默認情況下, Sonar Runner 插件傳給 project 的 main source set 將作為生產源文件,傳給 project 的 test source sets 將作為測試源文件。這個過程與 project 的源目錄布局無關。根據需要,可以添加額外的 source sets。

分析自定義的Source Sets

build.gradle

sonarRunner {
    sonarProperties {
        properties["sonar.sources"] += sourceSets.custom.allSource.srcDirs
        properties["sonar.tests"] += sourceSets.integTest.allSource.srcDirs
    }
}  

分析非 Java 語言

要分析非 Java 語言編寫的代碼,請安裝相應的 Sonar 插件,并相應地設置 sonar.project.language :

分析非 Java 語言

build.gradle

sonarRunner {
    sonarProperties {
        property "sonar.language", "grvy" // set language to Groovy
    }
}  

截至 Sonar 3.4,每個項目只可以分析一種語言。不過,在多項目構建中你可以為每一個項目分析一種不同的語言。

更多關于配置 Sonar 的屬性

讓我們再詳細看看 sonarRunner.sonarProperties {}塊。正如我們在示例中已經看到的, property()方法允許設置新屬性或重寫現(xiàn)有的屬性。此外,所有已配置到這一點的屬性,包括通過 Gradle 預配置的所有屬性,還可通過 properties 訪問器進行使用。

在 properties map 的條目可以使用常見的 Groovy 語法來讀取和寫入。為了方便它們的操作,這些值值仍然使用它們慣用的類型 (File,List等)。SonarProperties 塊在經過評估后,這些值值被轉換為字符串,如下所示: 集合的值(遞歸) 轉換為以逗號分隔的字符串,其他所有的值通過調用其tostring ()方法進行轉換。

因為 sonarProperties 塊的評估是惰性的,Gradle 的對象模型的屬性可以在塊中被安全地引用,而無需擔心它們還沒有被賦值。

從命令行設置 Sonar 屬性

Sonar 屬性也可以從命令行中設置,通過設置一個系統(tǒng)屬性,名稱就像正在考慮中的 Sonar 屬性。當處理敏感信息 (例如證件),環(huán)境信息,或點對點配置時,這會非常有用。

gradle sonarRunner -Dsonar.host.url=http://sonar.mycompany.com -Dsonar.jdbc.password=myPassword -Dsonar.verbose=true     

雖然有時當然很有用,但我們建議在 (版本控制的)構建腳本中,能夠方便地讓每個人都保持大部分的配置。

通過一個系統(tǒng)屬性設置的 Sonar 屬性值將覆蓋構建腳本中設置的任何值(同樣的屬性名稱)。當分析項目的層次結構時,通過系統(tǒng)屬性設置的值應用于所分析層次結構的根項目。

在一個單獨的進程中執(zhí)行 Sonar Runner

根據項目大小,Sonar Runner 可能需要大量的內存。由于這個和其他(主要是隔離)的原因,最好在一個獨立的進程中執(zhí)行 Sonar Runner。一旦 Sonar Runner 2.1 發(fā)布,將提供這個功能,并由 Sonar Runner 插件采用。到那時,Sonar Runner 會在 Gradle 主進程中執(zhí)行。

任務

Sonar Runner 插件向 project 中添加了以下任務。

表 36.4. Sonnar Runner 插件 - 任務

任務名稱 依賴于 類型 描述
sonarRunner { - sonarRunner { 分析項目層次結構,并將結果存儲在 Sonar 數據庫。
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號