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

效果圖

注意:在這里我們沒有針對這兩個容器進行數據卷掛載,掛載可以參考下列 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 的項目管理界面。

img

步驟:

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

動圖在這里:

img

2.3 查看結果

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

1530079707597

可以看到說我有一個 BUG。

1530079727905

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM