SonarQube系列2、分析dotnet core/C#代碼

【前言】

本系列主要講述sonarqube的安裝部署以及如何集成jenkins自動化分析.netcore項目。目錄以下:html

  1. SonarQube系列1、Linux安裝與部署
  2. SonarQube系列2、分析dotnet core/C#代碼
  3. SonarQube系列3、Jenkins集成SonarQube(dotnetcore篇)

【實現功能】

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

  1. sonarqube分析.netcore項目下的C#代碼
  2. sonarqube生成單元測試報告(代碼覆蓋率)

【SonarQube分析C#代碼】

1.sonarqube帳號token的生成

sonarqube支持生成用戶token,以便在命令行或者腳本中使用token表明帳號操做sonarbue,避免形成帳號密碼的泄露。web

點擊sonarqube首頁右上角頭像,進入個人帳號api

而後進入安全tab頁,隨便輸入個標識,點擊生成,生成一個帳號專屬的token安全

生成的token只會顯示一次,且後續沒法查詢,所以先把他手動備份下來,後續會用到。架構

2.安裝netcore分析器

分析netcore項目,微軟和sonar一塊兒協做作了不少工做,大大簡化了咱們的工具使用,官網能夠查看相關工具及命令:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/app

咱們按照官方提示,找到 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工具,也便於腳本通用化,方便地應用到多個項目中。

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

原文出處:https://www.cnblogs.com/7tiny/p/11342902.html

相關文章
相關標籤/搜索