SonarQube系列-通過配置掃描分析范圍,聚焦關鍵問題

?

在許多情況下,你可能不希望分析項目中每個源文件的各個方面。例如,項目可能包含生成的代碼、庫中的源代碼或有意復制的代碼。在這種情況下,跳過這些文件分析的部分或全部方面是有意義的,從而消除干擾并將焦點縮小到真正重要的問題上。

?

「如果SonarQube的結(jié)果不相關,那么沒有人會想要使用它。這就是為什么精確配置每個項目要分析的內(nèi)容是非常重要的一步?!?/strong>為了幫助縮小焦點,Sonar Qube提供了幾個選項來精確配置將要分析的內(nèi)容和方式。

  • 「完全忽略一些文件或目錄」
  • 「從問題中排除文件或目錄,但分析所有其它方面」
  • 「從重復性中排除文件或目錄,但分析所有其它方面」
  • 「從覆蓋率中排除文件或目錄,但分析其它所有方面」

你可以在全局或項目級別配置它們。 定義分析范圍的大多數(shù)屬性都可以在Sonar Qube UI中定義。其他參數(shù)必須在scanner調(diào)用中或在適當?shù)呐渲梦募忻鞔_設置,

設置初始分析范圍

分析的初始范圍由以下參數(shù)控制:

  • sonar.sources定義了項目中非測試代碼的初始分析范圍。
  • sonar.tests定義了項目中測試代碼的初始分析范圍。

「這些參數(shù)定義了分析范圍調(diào)整的起點:」

  • 「根本不會」分析這些參數(shù)定義的范圍之外的文件。
  • 除非通過進一步調(diào)整(排除、包含等)排除,否則將「分析這些參數(shù)定義范圍內(nèi)」的文件。

此外,這些參數(shù)包括:

  • 僅在項目級別設置。這些參數(shù)沒有全局的、服務器級別的等效參數(shù)。
  • 由Sonar Scanner自動設置,在配置文件中顯式設置,或在調(diào)用Scanner命令行上設置。這些參數(shù)沒有UI設置。sonar-project.properties
  • 顯式設置,并且兩者都接受逗號分隔的路徑列表。不支持使用通配符的模式匹配。

測試/非測試代碼的作用域是分開的

測試代碼和非測試代碼是有區(qū)別的,因為

  • 對這兩個類別應用了不同的分析規(guī)則。
  • 這兩個類別具有不同的指標
  • 測試代碼不計入許可證定義的代碼行數(shù)限制。
  • 測試代碼不計入覆蓋率(您不必測試測試代碼)
image.png

Maven、Gradle和.NET的自動設置

如果使用 SonarScanner for Maven、SonarScanner for Gradle 或 SonarScanner for .NET 分析代碼,則會根據(jù)項目配置中的信息自動確定參數(shù),不必顯式設置參數(shù)。 如果您確實顯式設置了參數(shù)(例如,在 Maven 的情況下,這將覆蓋自動pom.xml 中的 sonar.sources, sonar.tests

其他場景的默認設置

如果您沒有使用Maven、Gradle或。NET

  • 默認情況下,設置為當前工作目錄(路徑)sonar.sources
  • 默認情況下,未設置 sonar.tests

顯式設置

如果默認值不合適(例如_,如果您有測試_代碼),則必須在掃描程序調(diào)用或相應的配置文件中顯式設置參數(shù)(請參閱分析參數(shù))。 顯式設置時,兩者兼而有之,并采用逗號分隔的目錄或文件列表。sonar.sourcessonar.tests

  • 列表中的條目是簡單路徑。不允許使用通配符(、 和 )***?
  • 列表中的目錄意味著包含所有可分析的文件和其下方的目錄遞歸。列表中的單個文件表示包含該文件。
  • 路徑是相對于項目基目錄進行解釋的?;夸浻赡谑褂玫膾呙璩绦蚨x。在大多數(shù)情況下,這是項目的根目錄。如果您使用的是SonarScanner CLI,則基目錄將是調(diào)用該工具的當前目錄(盡管可以使用參數(shù)將其覆蓋)。sonar.projectBaseDir

示例

假設您的存儲庫看起來像這樣,您的源代碼和測試代碼在頂層明確分離:

在這種情況下,您可以像這樣設置:sonar.sources 和 sonar.tests

如果在文件中配置范圍,它將如下所示:sonar-project.properties, ?無需進一步微調(diào)

#?Define?separate?root?directories?for?sources?and?tests
sonar.sources?=?src/
sonar.tests?=?test/

通配符模式

SonarQube中可以使用以下通配符, 下面討論的大多數(shù)參數(shù)都使用通配符模式

「符號」 「匹配」
* 匹配一個或多個字符 (不包括目錄分隔符 )
** 匹配一個或多個目錄
? 匹配一個字符 (不包括目錄分隔符 )

:::info

  • The pattern ?**/*.css
    • matches ?anyDirectory/anyFile.css
    • doesn't match ?org/sonar.api/MyBean.java
  • The pattern ?**/*Bean.java
    • matches ?org/sonar.api/MyBean.java
    • doesn't match ?org/sonar/util/MyDTO.java
  • The pattern ?**/*Bean?.java
    • matches ?org/sonar/util/MyOtherBean1.java
    • doesn't match ?org/sonar/util/MyOtherBean.java
  • The pattern ?org/sonar/*
    • matches ?org/sonar/MyClass.java
    • doesn't match ?org/sonar/util/MyClassUtil.java
  • The pattern ?org/sonar/**/*
    • matches ?org/sonar/MyClass.java
    • doesn't match ?org/radar/MyClass.java :::

通過UI設置分析過濾范圍

除非另有說明,否則以下所有參數(shù)均可在全局和項目級別設置。設置的 UI 位置位于:(新舊版本位置會有細微差異

  • 「管理」>「配置」>「常規(guī)設置」(用于全局設置)
  • 「項目設置」>「常規(guī)設置」(適用于項目級設置)

在全局級別進行的任何設置都將應用于所有項目,除非在項目級別被覆蓋(唯一的例外是上面討論的全局排除參數(shù))

特定文件的排除和包含

如果項目的目錄結(jié)構(gòu)沒有在頂層將源代碼測試代碼完全分開,則可能需要使用排除項和包含項來調(diào)整范圍。 :::warning 包含項和排除項不應是初始分析配置的一部分。建議僅設置它們以解決問題。例如,當您注意到某個分析選取了您不想分析的文件時。 :::

全局級別設置

Administration > Configuration > General Settings > Analysis Scope > A. File Exclusions

項目級別設置

Project Settings > General Settings > Analysis Scope > A. File Exclusions

針對項目級配置,要進行如下參數(shù)配置:

  • 在配置文件中設置它們<YOUR_PROJECT>/sonar-project.properties
<properties>
??<!--?找到pom文件的properties標簽,在里面新增如下配置?-->
??<!--?Sonar掃描需要排除的包、類?多個用英文?,?隔開?-->
??<sonar.exclusions>
????<!--?指定需要排除的包?-->
????src/main/java/com/zhibo/**/model/**,
????src/main/java/com/zhibo/**/vo/**,
????<!--?排除以Enum結(jié)尾的類?-->
????src/main/java/com/zhibo/**/*Enum.*
??</sonar.exclusions>
</properties>
  • 調(diào)用掃描程序時,在命令行上設置它們。
  • 對于 Maven、Gradle 或 .NET 項目,請在相應的特定于框架的配置文件中設置它們。
#?排除所有Bean結(jié)尾的類
#?匹配org/sonar.api/MyBean.java,?org/sonar/util/MyOtherBean.java,?org/sonar/util/MyDTO.java等
sonar.exclusions=**/*Bean.java,**/*DTO.java
#?排除src/main/java/org/sonar目錄下所有文件
#?但不包括其子目錄下的文件
sonar.exclusions=src/main/java/org/sonar/*
#?排除bank目錄及其子目錄下的所有文件
sonar.exclusions=bank/**/*
#?排除bank目錄及其子目錄下的所有.cs文件
sonar.exclusions=bank/**/*.cs

「注意:通配符模式是相對于項目基目錄(」**sonar.sources sonar.tests**「)進行解釋的?!?/strong>排除項 和 包含項 建立在上述范圍基礎上,僅僅充當篩選器得作用。它們只會減少可分析集中的文件數(shù)量,從不添加到分析集合范圍中。

示例

假設您的代碼庫看起來像這樣,您的測試代碼與源代碼混合在一起:

你可以這樣定義你的,包括整個目錄:sonar.sources = src/
然后將「“源文件排除」項(鍵)”設置為sonar.exclusions``=src/**/test/**/*結(jié)果是要掃描的源文件集是減去每個子目錄下的所有內(nèi)容:src test
要定義測試文件,首先設置為整個目錄:sonar.tests= src/
然后將「“測試文件包含」(鍵)”設置為sonar.test.inclusions =src/**/test/**/*結(jié)果是要掃描的源文件集是下的所有內(nèi)容_減去所有不是_子目錄的內(nèi)容:src test
如果在文件中配置范圍,它將如下所示:sonar-project.properties

#?Define?the?same?root?directory?for?sources?and?tests
sonar.sources?=?src/
sonar.tests?=?src/
#?Include?test?subdirectories?in?test?scope
sonar.test.inclusions?=?src/**/test/**/*
#?Exclude?test?subdirectories?from?source?scope
sonar.exclusions?=?src/**/test/**/*

代碼覆蓋率的排除

「配置不應該檢測代碼覆蓋率的文件」。參數(shù)的值是相對于當前工作目錄的路徑匹配模式的逗號分隔列表 Administration > General Settings > Analysis Scope > Code Coverage > Coverage Exclusions。

按文件類型設置范圍

大多數(shù)語言都提供了一種將分析范圍限制為與一組擴展名匹配的文件的方法。您可以為每種語言指定一個或多個后綴(文件擴展名)。 例如,對于 C 語言,.c 和 .h是默認設置 通過參數(shù)key設置時,可使用相應參數(shù)sonar.<LANGUAGE>.file.suffixes

重復的排除

Administration > General Settings > Analysis Scope > Duplications 用于從重復檢測機制中排除某些源文件的模式。該值是相對于當前工作目錄的路徑匹配模式的逗號分隔列表。

忽略問題

可使用SonarQube忽略某些組件和某些編碼規(guī)則的問題。Administration > General Settings > Analysis Scope > Issues。 請注意,以下屬性只能通過Web界面設置,因為它們是多值的。

  • Ignore Issues on Files
  • Ignore Issues in Blocks
  • Ignore Issues on Multiple Criteria
  • Restrict Scope of Coding Rules
image.png

根據(jù)內(nèi)容忽略文件中的問題

Analysis Scope > D. Issue Exclusions > Ignore Issues on Files可以忽略包含與給定正則表達式匹配的代碼塊的文件。這些文件中的所有問題以及安全熱點都將被忽略。在此設置中,可以輸入一個或多個正則表達式模式。任何至少包含一種指定模式的文件都將被忽略。 例如,假設您在 Java 項目中生成了希望排除的類文件。這些文件看起來像這樣:

@Generated("com.example.generated")
public?class?GeneratedClass?extends?AnotherClass?{
????//?Some?generated?code
}

要排除所有此類文件,您可以將此參數(shù)設置為:

@Generated\(".*"\)
#如果在文件中找到此正則表達式,則會忽略整個文件

請注意,由于該值是正則表達式,因此您需要轉(zhuǎn)義()括號字符并使用表達式 .* 匹配這些括號之間的字符串。 然而,該參數(shù)的關鍵是 sonar.issue.ignore.allfile,因為它是一個多值屬性,所以我們建議僅通過 UI 設置它。

忽略文件中的塊

Analysis Scope > D. Issue Exclusions > Ignore Issues on Blocks您可以忽略文件中的特定代碼塊,同時繼續(xù)掃描文件的其余部分。要忽略的塊在文件內(nèi)由「開始」「結(jié)束」字符串分隔。您可以通過正則表達式指定這些開始和結(jié)束字符串。這些塊內(nèi)的所有問題以及安全熱點都將被忽略。您可以輸入一對或多對正則表達式模式。任何文件中位于起始模式與其相應的結(jié)束模式之間的任何代碼都將被忽略「注意:」

  • 如果找到第一個正則表達式但未找到第二個正則表達式,則文件末尾被視為塊的末尾。
  • 正則表達式不匹配多行。

例如,假設想忽略方法 doSomethingElse 中使用塊分隔符的代碼,如下所示:

public?class?MyClass?{
????public?MyClass()?{
????????...
????}

????public?void?doSomething()?{
????????...????}

????//?BEGIN-NOSCAN
????public?void?doSomethingElse()????{
????????...
????}
????//?END-NOSCAN}

您可以指定以下正則表達式:「塊的開始」 \s*//\s*START-NOSCAN「塊結(jié)束:」** **\s*//\s*END-NOSCAN這些正則表達式可確保無論行注釋字符 ( ) 周圍的空格數(shù)量如何,都可以識別起始塊分隔符和結(jié)束塊分隔符//。 該參數(shù)的關鍵是 sonar.issue.ignore.block. 但是,由于它是一個多值屬性,因此我們建議僅通過 UI 設置它。

從特定文件中排除特定規(guī)則

您可以通過組合由規(guī)則鍵模式** **和_文件路徑模式_組成的一對或多對字符串來防止將特定規(guī)則應用于特定文件。 然而,該參數(shù)的關鍵是 sonar.issue.ignore.multicriteria,,因為它是一個多值屬性,所以我們建議僅通過 UI 設置。

規(guī)則鍵模式

規(guī)則鍵模式由規(guī)則存儲庫名稱、后跟冒號、規(guī)則鍵或規(guī)則名稱通配模式組成。「例如:」

  • java:S195與java規(guī)則庫中的規(guī)則 rule S1195完全匹配。
  • java:Naming匹配java存儲庫中規(guī)則名稱中包含字符串Naming的所有規(guī)則。

您可以在規(guī)則定義中找到規(guī)則定義的完全限定規(guī)則 ID 和規(guī)則名稱。 例如,對于 此規(guī)則:

  • 規(guī)則ID: css:S4655
  • 規(guī)則名稱: ?"!important" should not be used on "keyframes"

文件路徑模式

文件路徑模式使用上述路徑匹配格式來指定一組目錄或文件。

示例

如下圖所示,這個配置將忽略所有文件的 針對規(guī)則 java:S2259 進行檢查

:::success

  • 忽略所有文件中的所有問題:
    • 規(guī)則關鍵模式: *
    • 文件路徑模式: */
  • 忽略文件中的所有問題 bank/ZTR00021.cbl:
    • 規(guī)則關鍵模式: *
    • 文件路徑模式: bank/ZTR00021.cbl
  • 忽略直接位于 Java 包中 com.foo但不位于其子包中的文件中的所有問題:
    • 規(guī)則關鍵模式: *
    • 文件路徑模式: com/foo/*
  • cpp:Union 忽略目錄 object 及其子目錄 中文件中所有違反編碼規(guī)則的問題 :
    • 規(guī)則關鍵模式: cpp:Union
    • 文件路徑模式: object/**/* :::

將特定規(guī)則應用于特定文件

  • Global level: Administration > Configuration > General Settings > Analysis Scope > D. Issue Exclusions > Restrict Scope of Coding Rules
  • Project level: Project Settings > General Settings > Analysis Scope > D. Issue Exclusions > Restrict Scope of Coding Rules

設置這些參數(shù)的機制與上面的 sonar.issue.**ignore**.multicriteria相同:每個條目都包含一個規(guī)則鍵模式和一個文件路徑模式。 不同的是,在這種情況下,這意味著指定的規(guī)則將僅應用于指定的文件集。 該參數(shù)的關鍵是 sonar.issue.**enforce**.multicriteria. 但是,由于它是一個多值屬性,因此我們建議僅通過 UI 設置它。

示例

:::success

  • 只檢查“Bean”對象上的“Magic Number”規(guī)則,而不檢查其他任何東西:
    • 規(guī)則鍵模式:checkstyle:com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck
    • 文件路徑模式:**/*Bean.java
  • 僅檢查規(guī)則_Prevent GO TO statement from transferring control outside current module on COBOL programs_ in the directories:bank/creditcardbank/bankcard
    • 規(guī)則鍵模式 1:cobol:COBOL.GotoTransferControlOutsideCurrentModuleCheck
    • 文件路徑模式 1:bank/creditcard/**/*
    • 規(guī)則鍵模式 2:cobol:COBOL.GotoTransferControlOutsideCurrentModuleCheck
    • 文件路徑模式 2:bank/bankcard/**/*:::

總結(jié)

「有以下幾種方式來縮小要分析源碼的范圍,如下:」

  1. 首先設置「初始化分析范圍」:設置_sonar.sources_參數(shù)指定源代碼目錄的范圍
  2. 文件后綴:許多語言都提供了限制文件后綴名的的參數(shù),’配置’–>’通用’–>’[語言]’,設置File suffixes屬性
  3. 「再從上述范圍內(nèi)選擇指定文件」,縮小關注的文件范圍
  • _sonar.exclusions/sonar.test.exclusions_ 設置分析「除指定文件以外的所有文件」
  • _sonar.inclusions/sonar.test.inclusions_ 設置「僅僅分析指定的文件」
  • 針對具體的問題,「再通過排除重復,忽略錯誤,實現(xiàn)更細粒度的控制」
  • 如下圖所示,通過四種不同的方法可將分析范圍縮小到與開發(fā)團隊相關的源代碼。 :::warning

    • 源目錄(Source Directories)
    • 文件后綴(File Suffixes)
    • 選擇文件(Choosing Files)

    本文使用 文章同步助手 同步

    ?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
    【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
    平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

    相關閱讀更多精彩內(nèi)容

    友情鏈接更多精彩內(nèi)容