2021-05-12 14:32:11
使用 SonarQube 來分析 NetCore 專案程式碼問題
0.介紹
Sonar 是一款開源的程式碼分析工具,可能有很多人已經用過,本篇文章主要是講解如何在 Docker 裡面安裝 Sonar 並且用其來分析 .Net Core 專案。
Sonar 是一個用於程式碼品質管理的開放平台。通過外掛機制,Sonar 可以整合不同的測試工具,程式碼分析工具,以及持續整合工具。
與持續整合工具(例如 Hudson/Jenkins 等)不同,Sonar 並不是簡單地把不同的程式碼檢查工具結果(例如 FindBugs,PMD 等)直接顯示在 Web 頁面上,而是通過不同的外掛對這些結果進行再加工處理,通過量化的方式度量程式碼品質的變化,從而可以方便地對不同規模和種類的工程進行程式碼品質管理。
1.安裝
安裝的話,秉承一貫的懶人原則,在本篇文章當中是直接使用的 Sonar 的 Docker 映象來進行安裝設定的。
1.1 安裝 Docker
安裝 Docker-CE 的教學在我的這篇文章裡面有講到過,這裡就不再多加贅述。
1.2 建立私有網路
執行以下命令:
docker network create sonar
將會建立一個 Docker 內部網路,名字為 sonar。
1.2 啟動 PostgreSql 容器
使用以下命令拉取 PostgreSql 的映象:
docker pull postgres
然後我們啟動一個 PostgreSql 容器,名字叫做 sonar-db。
docker run -d --name sonar-db --network sonar -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar postgres
這裡啟動容器的時候指定了容器的網路是 sonar-db ,那麼後面在 sonar 容器啟動的時候加入這個網路即可,其餘兩個環境變數是用作 PostgreSql 資料庫預設的賬號密碼。
1.3 啟動 Sonar 容器
使用以下命令拉取 Sonar 映象:
docker pull sonarqube
啟動 Sonar 容器:
docker run -d --name sonar --network sonar -p 9000:9000 -p 9092:9092 -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://sonar-db:5432/sonar sonarqube
至此,我們的 Sonar 已經部署完成了,存取你伺服器或者本地 IP 的 9000 埠即可看到我們最終的效果。
注意:在這裡我們沒有針對這兩個容器進行資料捲掛載,掛載可以參考下列 YML 檔案進行自己的設定,推薦在實際生產環境部署的時候使用 Docker-Compose 來進行部署。
1.3:擴充套件:使用 Docker-Compose 來執行 Sonar
如果你每次都需要手動輸入這麼多命令,其實很麻煩的,在 Sonar 官方的 GitHub 上面有一個 docker-compose.yml 檔案,你直接通過 Docker-Compose 就可以執行好環境的。
version: "2"
services:
sonarqube:
image: sonarqube
ports:
- "9000:9000"
networks:
- sonarnet
environment:
- SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar
volumes:
- sonarqube_conf:/opt/sonarqube/conf
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
db:
image: postgres
networks:
- sonarnet
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
volumes:
- postgresql:/var/lib/postgresql
# This needs explicit mapping due to https://github.com/docker-library/postgres/blob/4e48e3228a30763913ece952c611e5e9b95c8759/Dockerfile.template#L52
- postgresql_data:/var/lib/postgresql/data
networks:
sonarnet:
driver: bridge
volumes:
sonarqube_conf:
sonarqube_data:
sonarqube_extensions:
sonarqube_bundled-plugins:
postgresql:
postgresql_data:
將其儲存到你的 Linux 伺服器上,執行以下命令:
docker-compose up
如果需要重新啟動的話則執行以下命令即可:
docker-compose restart sonarqube
1.4 新建專案
Sonar 映象安裝的預設管理員賬號和密碼都是 admin,直接輸入進入到 Sonar 的專案管理介面。
步驟:
- 首先輸入你的專案名稱,生成一個 Token。
- 點選生成之後,點選 Continue ,這時候會提示你選擇專案型別,並輸入一個專案的唯一 Key,這裡我還是輸入的 TestProject。
- 點選 Done 之後右邊會生成相關的 Scanner 執行步驟,你可以 Copy 下來。
2.分析
如果你需要分析專案的話,有兩種選擇,第一種就是使用工具1,而如果你是擁有 DotNet Core 2.1 環境的話可以使用 Global Tool 來直接安裝分析器。
2.1 安裝 dotnet scanner
參照 Sonar 官方的文件 ,執行命令列工具,並且鍵入以下命令:
dotnet tool install --global dotnet-sonarscanner --version 4.3.1
就成功安裝好 Sonar Scanner 了。
2.2 分析專案
跳轉到你需要分析的專案的根目錄,這裡我新建了一個測試用的控制台程式,程式碼很簡單,傳入了一個 NULL 物件,並且判斷這個變數不等於空。
using System;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
string c = null;
if (c != null)
{
Console.WriteLine("不可能執行的程式碼.");
}
Console.WriteLine("Hello World!");
}
}
}
在命令列工具當中分步執行以下命令:
dotnet sonarscanner begin /k:"TestProject" /d:sonar.host.url="http://192.168.100.107:9000" /d:sonar.login="cfe594fd605f2e4821835e43c69da82e489c2f23"
dotnet build
dotnet sonarscanner end /d:sonar.login="cfe594fd605f2e4821835e43c69da82e489c2f23"
這裡的 /k 指定你的專案,/d 這些引數分別是你 Sonar 的地址與你剛才生成的 Token。
動圖在這裡:
2.3 檢視結果
現在來到 Sonar 的站點就可以看到我們剛剛分析的結果啦。
可以看到說我有一個 BUG。
3.漢化
可能有的朋友需要中文介面,這個在 Sonar 社群裡面提供了中文外掛,地址如下 https://github.com/SonarQubeCommunity/sonar-l10n-zh。你可以根據你的 Sonar 版本來選擇下載安裝哪一個版本的外掛,博主目前是基於 Sonar 的 7.1 映象的,所以下載的是 1.21 版本。
下載完成之後,使用在之前執行容器的時候,加上 -v
引數,將容器目錄 /opt/sonarqube/extensions/plugins
對映到你宿主機來,將你的這個檔案拷貝到對映好的目錄之下,然後重新啟動 Sonar 容器即可。
如果你是使用的 Docker-Compose 檔案來執行的容器,只需要找到相應的捲,比如說博主外掛的資料卷目錄在
/var/lib/docker/volumes/docker-ymls_sonarqube_extensions/_data
裡面,我直接拷貝過去重新啟動容器即可,大家的目錄路徑可能不一樣,使用 docker volume ls
命令可以看到存在的資料卷,比如說我的:
DRIVER VOLUME NAME
local 09d0144ebeb8fd9dc382bb14f33d35e156c6e7f29dcfa42ac52f2b82422fab98
local 2c6c4d351a919c9550de94797ce77805fbe178c9226e71bf99c07c44fd303af1
local c8b5b6cd301d4cea2e64866e12a9cf6a2bb4e257e5875449f62dede59ebc52c7
local docker-ymls_postgresql
local docker-ymls_postgresql_data
local docker-ymls_sonarqube_bundled-plugins
local docker-ymls_sonarqube_conf
local docker-ymls_sonarqube_data
local docker-ymls_sonarqube_extensions
local fd1127a3cec43dc992cbf0eefd053bd9dd8f3e93dc9fb0348c70048846f82308
local portainer_data
可以看到外掛目錄是放在 docker-ymls_sonarqube_extensions 這個資料捲裡面的。
漢化完成的介面如下:
4.結語
後面會分享如何與 Jenkins + Git(Gogs) 來進行整合的。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-06/152995.htm
相關文章