天天看點

使用 SonarQube 來分析 .NET Core 項目代碼問題

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 端口即可看到我們最終的效果。

使用 SonarQube 來分析 .NET Core 項目代碼問題
注意:在這裡我們沒有針對這兩個容器進行資料卷挂載,挂載可以參考下列 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 的項目管理界面。

使用 SonarQube 來分析 .NET Core 項目代碼問題

步驟:

  • 首先輸入你的項目名稱,生成一個 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。

動圖在這裡:

使用 SonarQube 來分析 .NET Core 項目代碼問題

2.3 檢視結果

現在來到 Sonar 的站點就可以看到我們剛剛分析的結果啦。

使用 SonarQube 來分析 .NET Core 項目代碼問題

可以看到說我有一個 BUG。

使用 SonarQube 來分析 .NET Core 項目代碼問題

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 這個資料卷裡面的。

漢化完成的界面如下:

使用 SonarQube 來分析 .NET Core 項目代碼問題

4.結語

後面會分享如何與 Jenkins + Git(Gogs) 來進行內建的。

繼續閱讀