首頁 > 軟體

使用 SonarQube 來分析 NetCore 專案程式碼問題

2020-06-16 16:50:35

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


IT145.com E-mail:sddin#qq.com