如何使用 SonarQube 檢查 .NET Core 專案? (macOS)
SonarQube 是一套 程式碼品質檢查工具,可以幫我們檢查 code 的 bugs、 vulenrability、code smell 與 duplication,也屬於 持續整合 重要的一環。
SonarQube 已經內建 SonarC#,可以直接對 C# 進行檢查,本文將以 .NET Core 為例,並搭配 Jenkins 自動執行 SonarQube。
Version
macOS High Sierra 10.13.4
SonarQube 7.1
Jenkins 2.107.1
.NET Core 2.0.7
GitHub
將 .NET Core 專案放到 GitHub。

- 本文將 .NET Core 專案放在
https://github.com/oomusou/Core2SonarQubeJenkins
當然也可以將 git repository 放在不同的 git server,如 Bitbucket
SonarQube
安裝 SonarQube
1 | $ brew install sonarqube |
使用 Home-brew 安裝 SonarQube。

- 輸入
brew install sonarqube安裝 - 若想在每次 Mac 重開機就自動執行 SonarQube,輸入
brew services start sonarqube - 若想自行啟動 SonarQube,輸入
sonar console
啟動 SonarQube
1 | $ sonar console |
使用 sonar console 自行啟動 SonarQube。

- 輸入
sonar console自行啟動 SonarQube
測試 SonarQube

- 輸入
localhost:9000,若看到 SonarQube 首頁,則表示安裝成功 - 右上角
Log in可登入管理設定 SonarQube,預設為admin/admin
SonarQube Scanner for MSBuild
SonarQube 雖然已經包含 SonarC#,但必須靠 SonarQube Scanner for MSBuild 才能執行,預設 SonarQube 並沒有包含 Scanner,必須自行安裝。
其實 SonarQube Scanner for MSBuild 包含 SonarQube Scanner,只是為了 C# 要編譯的特性再包了一層
下載 Scanner

- 到 Analyzing with SonarQube Scanner for MSBuild 下載 Scanner,選擇
Download for .NET core 2.0下載。

下載後為一 zip 壓縮檔,解壓縮後可安裝在任何目錄。

將 zip 解開後,放到 home directory 下,並重新命名為 SonarScannerMsbuild 。
重新命名只為了縮短目錄名稱而已
設定 Server
SonarQube.Analysis.xml
1 | <Property Name="sonar.host.url">http://localhost:9000</Property> |
編輯 ~/SonarScannerMsbuild/SonarQube.Analysis.xml ,修改 sonar.host.url、sonar.login 與 sonar.password 三個 property。

- 編輯
SonarQube.Analysis.xml - 預設是註解,將註解拿掉設定 server 與 login
測試 Scanner
1 | ~/MyProject $ dotnet ~/SonarScannerMsbuild/SonarScanner.MSBuild.dll begin /k:core2 /n:Core2 /v:1.0 |
使用 SonarQube Scanner for MSBuild 對 .NET Core 專案進行檢查。
由於 .NET Core 是跨平台,SonarScanner.MSBuild.dll 必須由 dotnet 執行。
SonarScanner.MSBuild.dll需指定完整路徑,無法透過$PATH設定- 需加上
begin,dotnet build必須包在 scanner 內 - /k:SonarQube 對專案的 key,內部將以此 key 作為辨別,必須唯一
- /n:在 SonarQube 網頁上顯示的專案名稱
- /v:在 SonarQube 網頁上顯示的版本編號

- 在專案目錄下使用
SonarScanner.MSBuild.dll檢查 C#
1 | ~/MyProject $ dotnet build |
使用 dotnet build 編譯專案。
Script 類不用編譯,可以直接使用 SonarQube Scanner 就可以檢查,但 C# 需要編譯,因此必須 dotnet build

- 輸入
dotnet build編譯專案 - Scanner 檢查出警告
1 | ~/MyProject $ dotnet ~/SonarScannerMsbuild/SonarScanner.MSBuild.dll end |
- 需加上
end,scanner 正式將dotnet build檢查出的結果寫入 SonarQube project

- 在專案目錄下使用
SonarScanner.MSBuild.dll結束檢查

進入 SonarQube 網頁,就可看到 Core2 專案已經出現 SonarQube,也顯示剛剛 dotnet build 檢查出的 1 個 code smell 警告。
到目前為止,SonarQube 對 C# 的檢查已經完成,就算只將 SonarQube 裝在本機,也對 C# 程式碼品質的檢查有很大的幫助。
若能搭配 Jenkins 自動執行 SonarQube,那就更好了。
Jenkins
安裝 Jenkins
1 | $ brew install jenkins |
使用 Homebrew 安裝 Jenkins。

- 輸入
brew install jenkins安裝 - 若想在每次 Mac 重開機就自動執行 Jenkins,輸入
brew services start jenkins - 若想自行啟動 Jenkins,輸入
jenkins
啟動 Jenkins
1 | $ jenkins |
使用 jenkins 自行啟動 Jenkins。

Unlock Jenkins

- 輸入
localhost:8080,看到 Unlock Jenkins,開始設定 Jenkins - 預設密碼放在
~/jenkins/secrets/initialAdminPassword - 將預設密碼貼上
- 按
Continue繼續
Customize Jenkins

- 選擇
Install suggested plugins即可
Getting Started

安裝 suggested plugin 中。
Create Admin User

- 建立管理者帳號
- 按
Save and Finish繼續
Jenkins is Ready

- Jenkins 安裝完成,按
Start using jenkins開始使用 Jenkins
Welcome to Jenkins

- 進入 Jenkins 管理介面,如此 Jenkins 已經設定成功
Jenkins Job
建立 Job

- 按左側
New Item建立新 job

- 輸入 Job 名稱
- 選擇
Freestyle project - 按
OK繼續
Source Code Management

- 找到
Source Code Management區段 - 將 Git 的
Repository URL設定到https://github.com/oomusou/Core2SonarQubeJenkins
Build Environment

- 找到
Build Environment區段 - 勾選
Delete workspace before build starts
Build

- 找到
Build區段 - 選擇
Add build step - 新增
Execute shell
- 講以下 command 貼上
1 | dotnet /Users/oomusou/SonarScannerMsbuild/SonarScanner.MSBuild.dll begin /k:core2 /n:Core2 /v:1.0 |
- 按
Save儲存設定

- 按左側
Build Now執行 Job

- Job 執行成功會出現
藍燈

剛剛 Jenkins 執行的 Project 出現在 SonarQube 上。
Conclusion
- SonarQube 已經內建 SonarC#,也可以用來檢查 C# 與 .NET Core
- 就算不將 SonarQube 安裝在 server,安裝在本機也能有效的檢查 C# 程式碼品質
- 藉由 Jenkins 幫忙,我們就可以自動化執行 SonarQube
Sample Code
完整的範例可以在我的 GitHub 上找到
Reference
SonarQube, Analyzing with SonarQube Scanner for MSBuild
SonarQube, Analying with SonarQube Scanner for Jenkins