SonarQube系列二、分析dotnet core/C#程式碼

7tiny發表於2019-08-13

【前言】

本系列主要講述sonarqube的安裝部署以及如何整合jenkins自動化分析.netcore專案。目錄如下:

  1. SonarQube系列一、Linux安裝與部署
  2. SonarQube系列二、分析dotnet core/C#程式碼
  3. SonarQube系列三、如何整合jenkins實現分析自動化

【實現功能】

  這篇文章將要介紹的主要內容如下:

  1. sonarqube分析.netcore專案下的C#程式碼
  2. sonarqube生成單元測試報告(程式碼覆蓋率)

【SonarQube分析C#程式碼】

1.sonarqube賬號token的生成

sonarqube支援生成使用者token,以便在命令列或者指令碼中使用token代表賬號操作sonarbue,避免造成賬號密碼的洩露。

點選sonarqube首頁右上角頭像,進入我的賬號

然後進入安全tab頁,隨便輸入個標識,點選生成,生成一個賬號專屬的token

生成的token只會顯示一次,且後續無法查詢,因此先把他手動備份下來,後續會用到。

2.安裝netcore分析器

分析netcore專案,微軟和sonar一起協作做了很多工作,大大簡化了我們的工具使用,官網可以檢視相關工具及命令:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/

我們按照官方提示,找到 MSBuild .NET Core Global Tool ,直接安裝dotnet全域性工具

dotnet tool install --global dotnet-sonarscanner --version 4.3.1

安裝完後,我們把我們的sonar的token注入到該命令的配置中,以便在執行命令時自動關聯到對應賬戶的sonar。

在dotnet tool的安裝目錄下,找到一個叫 SonarQube.Analysis.xml 的配置檔案。

我的xml在該目錄下:/root/.dotnet/tools/.store/dotnet-sonarscanner/4.6.2/dotnet-sonarscanner/4.6.2/tools/netcoreapp2.1/any

然後我們在對應節點將 sonarweb 的地址和 token 填寫上即可。

當然如果不配置也是可以的,那麼就需要每次執行命令時將token一起當作引數填寫,肯定是不如一次性配置好方便的。

3.開始分析程式碼

首先隨便找個專案,這個就不多說了。有了程式碼以後然後進入程式碼目錄,依次輸入下面命令:

開始命令,下面命令已經備註了三個引數的用途

dotnet sonarscanner begin /k:這裡填SonarQube將要生成的專案的唯一編碼 /n:sonarqube中將要顯示的專案名稱 /v:當前執行活動號(可以動態遞增或使用時間戳)

編譯命令,build 後面的引數為 dotnet core 專案的 xxx.sln 檔案的完整路徑

dotnet build xxx.csproj

分析並將分析結果推送到sonarqube站點

dotnet sonarscanner end 

例如:

dotnet sonarscanner begin /k:SevenTiny.Bantina /n:SevenTiny.Bantina /v:11

dotnet build 20-Solution/SevenTiny.Bantina.sln

dotnet sonarscanner end 

經過一段時間以後,可以看到輸入日誌已經 push 到 sonarqube 站點成功,那麼就可以去 sonarqube 站點檢視結果了,專案會通過 api 自動建立。

上述步驟並不會有覆蓋率,先忽略,我們後面會繼續講解如何提供單元測試覆蓋率。

我們點選標題進入專案詳情頁:

這裡主要報告了幾個指標(sonar有預設標準,如果不達標會報警,例如頂端紅色錯誤提示):

Bugs 漏洞:程式碼中的重大漏洞,可能影響到專案的正常執行,急需改正;

異味:無關緊要的編碼不規範問題,建議改正,一般不會影響功能,點開詳細信心可以看到規範的使用案例,對規範自己的變成水平有相當大的幫助;

覆蓋率:專案的單元測試情況;

重複:專案中的重複程式碼塊,建議重構;

sonarqube 還提供了很多圖表來展示多維度的程式碼分析情況。

【新增單元測試資訊】

經過上述步驟並不能實現單元測試的結果展示,事實上,sonarqube 本身也辦不到對單元測試的分析,通常的做法是將其他工具生成的單元測試結果整合到 sonarqube 中,藉助 sonarqube 來更好地展示單元測試結果。

首先我們的專案要有專門的單元測試專案,並且規範地使用 Assert 等單元測試語句對專案程式碼進行了單元測試。

1.使用 coverlet 分析單元測試覆蓋率

在單元測試專案安裝 coverlet.msbuild nuget包(單測專案,不是正式的專案),這種方式便於和dotnet test命令整合。這種方式下, 當它被啟用後, 它會整合到dotnet test 這個命令架構裡, 在測試執行後自動生成覆蓋率報告.

2.通過 dotnet test 命令輸出單元測試結果

dotnet test 是 dotnet 預設的整合工具,用於執行單元測試專案並輸出測試結果。

執行命令

dotnet test xxxtest.csproj --logger:"trx;LogFileName=test.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput='./TestResults/'

上述命令指定了某個測試專案,並輸出測試結果為 test.trx 檔案,同時輸出單元測試覆蓋率分析檔案為 opencover 格式的檔案。

也就是說,上述命令會生成兩個檔案,一個是單測的結果,一個是單測覆蓋率的詳情描述 xml 檔案。

3.將單測檔案整合到sonarqube

開啟 sonarqube 的單個專案設定(不是全域性設定)

然後找到對應語言的頁籤,當然我們今天的語言是C#,找到單元測試覆蓋率 opencover 的設定區域,用萬用字元 ** 去匹配生成的單測覆蓋率檔案。

還有單元測試報告檔案設定

這樣下次執行 dotnet sonarscanner 命令的時候,就會自動把單元測試的相關檔案輸出結果也推送到 sonarqube 中。

最後的結果也就是圖中展示的那樣,顯示出了專案程式碼的單元測試覆蓋率,甚至是本次有提交新程式碼的時候新程式碼的單元測試覆蓋率,如果低於閾值(預設80%)則會出現上面的報警:

點進單元測試覆蓋率詳情頁,我們可以看到更加詳細地對單元測試的描述,例如覆蓋了多少行程式碼,漏掉了多少行程式碼:

點開具體的程式碼行還可以看到那些行有單元測試的覆蓋,總之是非常詳盡了...

【擴充套件】

SonarQube 如何排除不需要分析地程式碼檔案?

有些時候,引入了很多第三方的庫(尤其是web專案的jquery庫),我們並不需要對第三方引用的庫進行分析(甚至會因為包含的雜七雜八的的各種語言指令碼太多),那麼我們就要將無關的程式碼排除。

 開啟單獨專案的設定(非全域性設定)

找到排除,可以採用萬用字元排除檔案或資料夾,下面有萬用字元的使用介紹。

當然了也可以指定哪些檔案是需要包含的,這樣可以按需進行分析。

【總結】

使用 sonarqube 分析dotnet core/C#程式碼的全部過程已經完成了,下一章我們會將過程中的所有命令指令碼化,使其便於整合CI/CD工具,也便於指令碼通用化,方便地應用到多個專案中。

如有任何疑問,歡迎在評論區討論~

相關文章