【前言】
本系列主要講述sonarqube的安裝部署以及如何集成jenkins自動化分析.netcore項目。目錄如下:
- SonarQube系列一、Linux安裝與部署
- SonarQube系列二、分析dotnet core/C#代碼
- SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)
【實現功能】
這篇文章將要介紹的主要內容如下:
- sonarqube分析.netcore項目下的C#代碼
- 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工具,也便於腳本通用化,方便地應用到多個項目中。
如有任何疑問,歡迎在評論區討論~