通過 SonarQube 搭建代碼質(zhì)量管理平臺(tái)(一) 的介紹,如果每次都需要手動(dòng)執(zhí)行 sonar-scanner ,想想也是醉了,所以我們需要進(jìn)一步完善 SonarQube 進(jìn)行自動(dòng)化代碼分析。
從官方文檔的 Scanners 部分可以看出,Scanner 支持 MSBuild、Maven、Gradle、Ant、Jenkins 等。本文將介紹使用 Jenkins 進(jìn)行自動(dòng)化代碼分析, 測(cè)試項(xiàng)目的代碼基于 .NET 開發(fā),所以會(huì)用到 MSBuild 相關(guān)命令。
安裝 Jenkins
根據(jù)操作系統(tǒng) 下載 Jenkins,我使用的是 Windows ,直接都下一步就可以了。
Windows 環(huán)境下 Jenkins 安裝后默認(rèn)登錄身份是 “本地系統(tǒng)”,會(huì)無法訪問,所以需要修改登錄身份,我這里使用的是賬戶方式

啟動(dòng)成功后訪問 http://localhost:8080/
Jenkins 配置 Github
-
在 Github 生成 Personal access tokens,設(shè)置 token 相關(guān)權(quán)限
access token
access token scope -
Jenkins 配置 GitHub Server
Jenkins 安裝后默認(rèn)已包含 GitHub,在 “系統(tǒng)管理” => “系統(tǒng)設(shè)置” 中找到 Github,然后在 Credentials 處添加全局憑據(jù),類型選 Secret text,Secret 處輸入上一步生成的 access token
GitHub ServerSecret text
添加完成后可點(diǎn)擊 Test connection 進(jìn)行測(cè)試
如果使用的是 Gitlab,需要在 Jenkins 中安裝 Gitlab 插件,全局憑據(jù)添加 GitLab API token,token 使用 Gitlab Account 下的 Private token, 其他配置基本類似
Jenkins 配置 SonarQube
-
在 SonarQube 中生成 Server authentication token
登錄 SonarQube 后,在 “My Account” => “Securiy” 中生成 toekn
SonarQube token
重新進(jìn)入這個(gè)頁(yè)面之前生成的 token 就看不到的,只能看到一次,我呵呵 在 Jenkins 的管理插件中安裝 SonarQube Scanner 插件
-
配置 SonarQube Sever,這部分和配置 GitHub Server 類似,在 “系統(tǒng)管理” => “系統(tǒng)設(shè)置” 中找到 SonarQube servers
Name:隨意;
Server URL:為啟動(dòng)的 SonarQube 服務(wù)地址,我這里使用本地啟動(dòng)的默認(rèn)地址 http://localhost:9000 ;
Server authentication token: 輸入之前生成的 token;SonarQube server -
配置 SonarScanner for MSBuild
在 “系統(tǒng)管理” => “全局工具配置” 找到 SonarScanner for MSBuild(
測(cè)試項(xiàng)目是基于 .NET),官方提供了 .NET Framework 和 .NET Core 兩個(gè)版本,我們可以先都加上,之后根據(jù)實(shí)際項(xiàng)目選擇使用哪個(gè)。有兩中方式配置 MSBUILD_SQ_SCANNER_HOME,可以選擇自動(dòng)安裝或手動(dòng)配置,手動(dòng)配置需要單獨(dú)下載,我使用的是手動(dòng)配置方式SonarScanner for MSBuild
Jenkins 任務(wù)配置
上面是 Jenkins 的一些全局配置,下面需要對(duì)單個(gè)任務(wù)進(jìn)行配置。新建一個(gè) “構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目” 類型的任務(wù) “Test”
配置項(xiàng)目的倉(cāng)庫(kù)地址,這個(gè)項(xiàng)目就是要進(jìn)行代碼分析的項(xiàng)目,在 Credentials 處添加憑據(jù),這里添加一個(gè)用戶名密碼類型的憑據(jù)(其他類型的也可以,能訪問這個(gè)倉(cāng)庫(kù)即可)。在添加憑據(jù)后,會(huì)自動(dòng)檢測(cè)是否有效,如果無效會(huì)直接出現(xiàn)錯(cuò)誤提示


在 “構(gòu)建” 中增加構(gòu)建步驟:

-
SonarScanner for MSBuild - Begin Analysis
SonarScanner for MSBuild:選擇基于 .NET Framework,因?yàn)?Test 項(xiàng)目是基于 .NET Framework;
Project key: 在 SoanrQube 中的項(xiàng)目 key;
Project name:在 SoanrQube 顯示的項(xiàng)目名稱,如果不填,則顯示 Project key;
Project version:版本號(hào);
Additional arguments:其他參數(shù),比如可以設(shè)置只檢測(cè)某種語(yǔ)言(/d:sonar.language=cs)、排除哪些文件(夾) 等,參考; -
執(zhí)行 Windows 批處理命令
先通過 nuget restore(如果沒有安裝 nuget 命令的需要提前安裝) 還原依賴的 NuGet 包,然后使用 MSBuild 批處理命令重新生成項(xiàng)目。這一步 Build 可能會(huì)出現(xiàn)各種奇葩的問題,主要就是少了一些依賴包,建議在安裝 Jenkins 的機(jī)器安裝上 VS,然后將 MSBuild 加入環(huán)境變量,我的機(jī)器添加了兩個(gè)路徑:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin C:\Program Files (x86)\NuGet SonarScanner for MSBuild - End Analysis
配置完成后保存,然后點(diǎn)擊 “立即構(gòu)建” 試試效果,構(gòu)建成功后我們將通過 SonarQube UI 看到對(duì) Test 項(xiàng)目的分析結(jié)果

這就實(shí)現(xiàn)了將 Jenkins 與 SonarQube 關(guān)聯(lián)起來,代碼構(gòu)建完成后會(huì)把結(jié)果發(fā)送到 SonarQube 中,我們還可以根據(jù)需要在 Jenkins 任務(wù)中設(shè)置構(gòu)建執(zhí)行時(shí)間,比如每天早上9點(diǎn)執(zhí)行一次

SonarQube 中有 Webhook 的功能,當(dāng)接收到一次提交,可以將這次的分析結(jié)果發(fā)送給設(shè)置的 Webhook 地址,這樣我們可以通過消息(比如短信、郵件、微信等)將有問題的分析結(jié)果及時(shí)的通知到相關(guān)負(fù)責(zé)人






