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) 來進行集成的。