一文搞定 SonarQube 接入 C#(.NET) 程式碼質量分析
1. 前言
C#語言接入Sonar程式碼靜態掃描相較於Java、Python來說,相對麻煩一些。Sonar檢測C#程式碼時需要預先編譯,而且C#程式碼必須用MSbuid進行編譯,如果需要使用SonarQube對C#進行程式碼質量分析,則需要下載Sonar-Scanner-MSBuild和MSBuild,其中要求MSBuild在V14.0以上。
2. Sonar-Scanner for MSBuild安裝與配置
1、下載SonarQube Scanner for MSBuild,它是C# Framework的Sonar分析外掛。
下載地址:sonar-scanner-msbuild-4.3.1.1372
2、下載並解壓之後,設定SonarQube Scanner for MSBuild的環境變數。
例如我的解壓路徑是:C:\Users\Administrator\Downloads\sonar-scanner-msbuild-4.3.1.1372-net466,則把該路徑新增到Path下。
SonarQube Scanner for MSBuild解壓目錄如下圖所示:
3、修改SonarQube.Analysis.xml檔案,要修改的地方只是關於SonarQube伺服器的一些配置,如伺服器URL、USER、PASSWORD等,詳細配置修改如下:<?xml version="1.0" encoding="utf-8" ?> <!-- This file defines properties which would be understood by the SonarQube Scanner for MSBuild, if not overridden (see below) By default the SonarScanner.MSBuild.exe picks-up a file named SonarQube.Analysis.xml in the folder it is located (if it exists). It is possible to use another properties file by using the /s:filePath.xml flag The overriding strategy of property values is the following: - A project-specific property defined in the MSBuild *.*proj file (corresponding to a SonarQube module) can override: - A property defined in the command line (/d:propertyName=value) has which can override: - A property defined in the SonarQube.Analysis.xml configuration file [this file] which can override: - A property defined in the SonarQube User Interface at project level which can override: - A property defined in the SonarQube User Interface at global level which can't override anything. Note that the following properties cannot be set through an MSBuild project file or an SonarQube.Analysis.xml file: sonar.projectName, sonar.projectKey, sonar.projectVersion The following flags need to be used to set their value: /n:[SonarQube Project Name] /k:[SonarQube Project Key] /v:[SonarQube Project Version] --> <SonarQubeAnalysisProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1"> <Property Name="sonar.host.url">http://sonar_ip:sonar_port</Property> <Property Name="sonar.login">login_username</Property> <Property Name="sonar.password">login_password</Property> <!-- Required only for versions of SonarQube prior to 5.2 --> <Property Name="sonar.jdbc.url">jdbc:mysql://db_ip:db_port/sonar?useUnicode=true;characterEncoding=utf8;rewriteBatchedStatements=true;useConfigs=maxPerformance;useSSL=false</Property> <Property Name="sonar.jdbc.username">jdbc.username</Property> <Property Name="sonar.jdbc.password">jdbc.password</Property> </SonarQubeAnalysisProperties>
3. MSBuild安裝與配置
Visual Studio IDE在編譯*.sln解決方案時預設是呼叫msbuild.exe來實現的。如果你的機器上沒有裝有Visual Studio,那麼也可以單獨使用MSBuild來編譯.sln(工程解決方案)或.csproj(專案)。MSBuild可以直接通過.NETFramework來安裝獲得。
msbuild.exe的路徑一般如下:
X86: C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe X64: C:\Program Files (x86)\MSBuild\14.0\Bin\amd64\MSBuild.exe
msbuild.exe 目錄如下所示:
將MSBuild.exe新增到Path環境變數,便於後面在命令列中呼叫MSBuild。
msbuild常用編譯命令:
MSBuild MyApp.sln /t:Rebuild /p:Configuration=Release MSBuild MyApp.csproj /t:Clean /p:Configuration=Debug;/p:Platform=x86;TargetFrameworkVersion=v3.5 編譯為 Release 程式碼 -p:configuration="release" 清理專案 -t:clean 重新編譯 -t:rebuild 編譯專案 -t:build 預設可以忽略這個引數 釋出 -t:Publish 注意:這裡的 -t 和 /t 作用是相同的。
4. Sonar+命令列分析C#程式碼
1、開啟CMD,切換到指定的專案根目錄,必須和.sln或者.csproj同級目錄。例如以\hcloud\Common\KDY.WebApi.Core專案為例,如下圖所示。
2、使用MSBuild方式進行Sonar Scanner掃描程式碼前期準備檔案生成,CMD命令下執行:
SonarScanner.MSBuild.exe begin /k:"hcloud.Common.KDY.WebApi.Core" /n:"hcloud.Common.KDY.WebApi.Core" /v:"1.0"
命令執行結果如下:
引數說明:- /key(簡寫k):對應projectKey即專案的唯一程式碼,如兩套原始碼使用同一個projectKey那掃描的結果將混在一起,所以一個專案需要有一個單獨的projectKey
- /name(簡寫n):對應projectName即專案的名稱,為專案的一個顯示的名稱,建立使用完整的專案名稱
- /version(簡寫v):對應projectVersion即專案的版本,專案在不同的時期版本也是不一樣的,如果方便,可以在sonarQube的伺服器中檢視到不同的版本程式碼其中問題的變化
執行上述命令後,在專案目錄下,生成.sonarqube目錄。
3、通過MSBuild命令編譯專案,在CMD命令列下執行:
MSBuild.exe /t:Rebuild (預設為Debug模式) 或者 MSBuild.exe /t:Rebuild /p:Configuration=Release (指定編譯模式) 或者 MSBuild.exe D:\hcloud\Common\Common.sln /t:Rebuild (指定具體的.sln解決方案)
編譯專案執行結果如下所示:
0個錯誤,則代表MSBuild編譯成功,編譯成功後,在當前目錄下會生成一個obj目錄。(編譯成功後預設生成Debug產物),SonarQube分析C#專案工程時,前提需要MSBuild能預編譯成功,如果存在錯誤,則無法成功完成後續Sonar分析動作。
4、分析C#掃描結果,將分析報告上傳給SonarQube,CMD命令下執行:
SonarScanner.MSBuild.exe end
執行結果如下圖所示:
溫馨提示:
- 如果執行出現錯誤請檢查sonar server的log,路徑為Snoar\sonarqube-6.7\logs下的sonar.log,web.log和access.log。
- 如果遇到需要檢測比較大的專案,可能上傳的mysql資料量會很大,會超出預設的mysql上傳的最大值,此時需要設定mysql的max_allowed_packet。
5、檢視Sonar分析掃描後的結果,訪問http://10.0.0.147:9000/dashboard?id=hcloud.Common.KDY.WebApi.Core,分析結果如下圖所示:
5. Jenkins+Sonar+MSBuild分析C#程式碼
1、編譯.NET(C#)應用程式可通過微軟提供的MSBuild工具,先安裝外掛MSBuild,在Jenkins中搜索並安裝MSBuild外掛,如下圖所示。
2、外掛安裝完畢後,進入系統管理->全域性工具配置(Global Tool Configuration)找到MSBuild配置選項,如下圖所示。
3、配置SonarScanner for MSBuild,如下圖所示。
4、由於示例中的Jenkins服務是部署在Linux系統中,故此處可新增一臺Windows主機(10.0.0.148)作為C#專案編譯執行環境,在Windows從節點配置中,新增並配置相應工具,如下圖所示。
5、新建並配置JOB,新增JOB執行節點(編譯C#工程專案的執行機),如下圖所示。
6、配置原始碼管理及其它所需配置(較為簡單,此處省略)後,新增並配置構建選項,如下圖所示。
7、JOB構建執行結果如下圖所示。
8、JOB構建成功後,Sonar程式碼分析報告如下圖所示。
6. 常見問題
1、解決SonarQube檢測C#執行成功,但不能獲取檢測結果的問題,現象如下圖所示。
由圖中可以看到檔案掃描成功了,但是卻沒有任何檔案被發現,所有的指標資料皆為0。
解決方案:
將Sonar外掛中的C#外掛改為5.9的版本即可。修改方式將plugin目錄下原本的C#外掛刪除掉,將5.9版本的外掛放入進來。重啟SonarQube後問題即可解決。(備註示例中的SonarQube版本為6.7.5)
plugin目錄替換後如下圖所示:
2、Jenkins +MSBuild+Sonar構建編譯Job時提示Running the Scanner for MSBuild under Local System or Network Service account is not supported. Please, use a local or domain user account instead.
現象如下圖所示:
解決方法:
登入從節點10.0.0.148(windows主機),右擊我的電腦選擇管理然後從管理介面裡面找到服務或者在cmd介面輸入services.msc開啟服務管理介面,從服務管理介面找到jenkins slave服務,右鍵點選屬性,在彈出的對話方塊中切換到登陸標籤,預設登入方式為本地系統帳號,此處我們選擇此賬戶。然後輸入賬戶和密碼點選確定,完成以上操作以後重新啟動jenkins slave服務然後再重新執行即可。
修改方式如下圖所示:
3、Jenkins單獨構建沒問題,Sonar靜態檢查程式碼單獨執行也沒問題,但是Jenkins+Sonar整合時出現未經授權問題,現象如下圖所示。
解決方案:
原因是由於Jenkins上已經通過admin生成了Token來進行連線認證,需要註釋掉SonarQube.Analysis.xml裡面的sonar.login和sonar.password,刪除或者註釋後,再重新執行即可。
修改如下圖所示(下圖採用註釋來解決該問題的)。
7. 最後
原文連結發表於筆者公眾號內:一文搞定SonarQube接入C#(.NET)程式碼質量分析
感興趣的可以關注筆者公眾號:技術大全(mikezhou_talk)