sonarqube簡介+架構+搭建+不同語言詳細用法

 

SonarQube

 

一,簡介

 

Sonar 是一個很優秀的代碼分析工具,可以幫助程序員們發現很多潛在的問題和BUG。

Sonar可以從以下七個維度檢測代碼質量

1. 不遵循代碼標準

sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具規範代碼編寫。

2. 潛在的缺陷

sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具檢測出潛在的缺陷。

3. 糟糕的複雜度分佈

文件、類、方法等,如果複雜度過高將難以改變,這會使得開發人員 難以理解它們, 且如果沒有自動化的單元測試,對於程序中的任何組件的改變都將可能導致需要全面的迴歸測試。

4. 重複

顯然程序中包含大量複製粘貼的代碼是質量低下的,sonar可以展示 源碼中重複嚴重的地方。

5. 註釋不足或者過多

沒有註釋將使代碼可讀性變差,特別是當不可避免地出現人員變動 時,程序的可讀性將大幅下降 而過多的註釋又會使得開發人員將精力過多地花費在閱讀註釋上,亦違背初衷。

6. 缺乏單元測試

sonar可以很方便地統計並展示單元測試覆蓋率。

7. 糟糕的設計

通過sonar可以找出循環,展示包與包、類與類之間的相互依賴關係,可以檢測自定義的架構規則 通過sonar可以管理第三方的jar包

 

需要用到的軟件有:SonarQube,Sonar-scanner。

SonarQube爲代碼檢查的server,並提供可視化界面;

Sonar-scanner爲client。用於收集檢查數據並且發送到server中。也就是傳統的C/S關係:

 

 

 

 

二,架構介紹

SonarQube平臺主要由4個組件組成:

 


1). SonarQube服務器:
主要包括web服務器,基於ElasticSearch的搜索服務器,計算引擎服務器。
其中,web服務器,是供開發人員瀏覽查看代碼分析結果,進行相應的配置等。

計算引擎服務器主要是處理代碼分析報表並將其存儲在數據庫。
(2). SonarQube 數據庫:
存儲配置信息和代碼分析報表。
(3). 多個Soanr插件:包括分析各種語言的插件。
(4). 多個Sonar Scanner,主要運行在開發人員的代碼端,可以單獨部署,也可以集成在Maven,Gradle等。

 

http://1.2.2.7:9009

用戶:admin

密碼:admin

 

三,安裝

版本分析:

最新版本是8.3.1202004發佈  已整合CI / CD

但是環境依賴比較高:要求 Java 11  且不支持mysql 管理配置元數據

綜合考量,功能最大化,依賴Java 8,且支持mysql管理元數據的最後版本

故選擇版本   7.8 20190619日發佈

安裝過程

  1. 安裝Java jdk 1.8 (安裝過程省略)
  2. 安裝mysql 5.6.3 (安裝過程省略)
  3. 安裝maven 3.5.2 (安裝過程省略)
  4. 安裝sonarqube

<1>https://www.sonarqube.org/downloads/下載文件 解壓安裝文件

(1)unzip  sonarqube-7.8.zip

 

(2)在mysql中創建相關用戶和密碼

create  database     sonar_db ;

create user 'sonar_ntd'@'%' identified by 'ntd123';

grant all privileges  on sonar_db.*  to "sonar_ntd"@'%';

grant all privileges on sonar_db.* to 'sonar_ntd'@'localhost' identified by 'ntd123';

grant all privileges on sonar_db.* to 'sonar_ntd'@'master01' identified by 'ntd123';

 

<2>,修改配置文件  sonarqube-7.8/conf/sonar.properties

#web端口號 默認9000

sonar.web.port=9009

 

#元數據保存到mysql

sonar.jdbc.url=jdbc:mysql://1.2.2.7:3306/sonar_db?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

sonar.jdbc.username=sonar_ntd

sonar.jdbc.password=ntd123

sonar.sorceEncoding=UTF-8

sonar.login=admin

sonar.password=admin

 

#

sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false  

 

<3>安裝中文插件https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases下載 7.8 對應版本中文插件  sonar-l10n-zh-plugin-1.28.jar

放入 sonarqube-7.8/extensions/plugins 目錄

<4>啓動服務

/sonarqube-7.8/bin/linux-x86-64/sonar.sh  start

<5>安裝掃描器(用於除Java,c++外的,比如 python php 等等其他語言)

https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/下載

解壓 sonar-scanner-cli-4.2.0.1873-linux.zip

修改配置文件sonar-scanner-4.2.0.1873-linux/conf

sonar.host.url=http://1.2.2.7:9009

並加入環境變量

export SONAR_SCANNER_HOME=/home/software/sonar-scanner-4.2.0.1873-linux

export PATH=$PATH:$SONAR_SCANNER_HOME/bin

source  ~/.bashrc

四,整合maven的兩種使用方式

1.直接命令行控制(以Java maven 項目爲例)

創建一個項目

<1>,選擇創建新項目,設置項目的創建標誌以及顯示信息點擊完設置以後,會有頁面創建令牌和配置當前項目的信息自動生成

窗體頂端

Analyze "sonarQubeTest": 323220150f0f09643e87ae705fa249c24f8db01f

 

窗體底端

此令牌用於執行分析時認證時使用,如果這個令牌存在問題,可以隨時在你的用戶賬號下取消這個令牌。

<2>,分析你的項目(自動生成maven 命令)

選擇語言: Java

選擇構建框架:maven

會自動生成一下命令

mvn sonar:sonar \

  -Dsonar.projectKey=sonarQubeTest \

  -Dsonar.host.url=http://master01:9009 \

  -Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f

 

 

其中-Dsonar.projectKey表示的是項目的標識,-Dsonar.host.url表示的是sonar的 地址,-Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f設置的sonar的令牌信息

 

<3>,到項目目錄執行maven 命令(上一步生成的)

Cd  項目目錄,執行以下命令

mvn sonar:sonar \

  -Dsonar.projectKey=sonarQubeTest \

  -Dsonar.host.url=http://master01:9009 \

  -Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f \

  -Dsonar.java.binaries=target/sonar

 

 

注意:以上命令增加一行 -Dsonar.java.binaries=target/sonar 是指定sonar.java.binaries 項目的文件夾。否則會報錯Please provide compiled classes of your project with sonar.java.binaries property

 

2.全局配置maven

<1>. 在Maven的全局配置文件: $MAVEN_PATH/conf/settings.xml (也可能是.m2/settings.xml )中添加如下內容:

<<settings>

    <pluginGroups>

        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>

    </pluginGroups>

    <profiles>

        <profile>

            <id>sonar</id>

            <activation>

                <activeByDefault>true</activeByDefault>

            </activation>

            <properties>

                <sonar.host.url>

                  http://1.2.2.7:9009

                </sonar.host.url>

            </properties>

        </profile>

     </profiles>

</settings>

 

 

<2> .到Maven項目的根目錄執行如下命令,即可使用SonarQube分析項目:

 

mvn sonar:sonar -Dsonar.java.binaries=target/sonar

 

五,其他語言scala ,python,php 或者一個項目使用多種語言時通過以下方式使用sonar-scanner

<1>在項目目錄增加sonar-project.properties配置文件

sonar.projectKey=my:project

sonar.projectName=My project

sonar.projectVersion=1.0

sonar.projectDescription=test_project_description

sonar.sources=.

sonar.sourceEncoding=UTF-8

sonar.java.binaries=./target/sonar

sonar.projectKey在給定的SonarQube實例中必須是唯一的

sonar.projectName和sonar.projectVersion這是SonarQube用戶界面中顯示的名稱和版本。在SonarQube 6.1之前是強制性的。

sonar.projectDescription   項目描述

sonar.sources 是源代碼目錄

sonar.sourceEncoding源代碼的編碼。默認爲默認系統編碼

sonar.java.binaries分析的classes文件路徑

<2>在項目目錄執行一下命令

sonar-scanner

 

sonar-project.properties 各項參數說明

制參數

服務器

描述

默認

sonar.host.url

服務器URL

http://本地主機:9000

項目配置

描述

默認

sonar.projectKey

項目的唯一密鑰。允許的字符是:字母,數字-,_,.和:,與至少一個非數字字符。

對於Maven項目,默認爲 <groupId>:<artifactId>

 

可選參數

項目身份

描述

默認

sonar.projectName

將在Web界面上顯示的項目的名稱。

<name>對於Maven項目,否則爲項目密鑰。如果未提供並且數據庫中已經有名稱,則不會覆蓋該名稱

sonar.projectVersion

項目版本。

<version> 用於Maven項目,否則“不提供”

認證方式

如果“任何人”僞組沒有執行分析的權限,則需要向用戶提供具有“執行分析”權限的憑據才能在其下運行分析。

描述

默認

sonar.login

具有對項目執行執行分析權限的SonarQube用戶的登錄或身份驗證令牌。

 

sonar.password

sonar.login用戶名附帶的密碼。如果正在使用身份驗證令牌,則應將其留爲空白。

 

網頁服務

描述

默認

sonar.ws.timeout

等待Web服務調用響應的最長時間(以秒爲單位)。僅當您在等待服務器響應Web Service調用的分析過程中遇到超時時,從默認值修改此值纔有用。

60

項目配置

描述

默認

sonar.projectDescription

項目說明。

<description> 用於Maven項目

sonar.links.homepage

項目主頁。

<url> 用於Maven項目

sonar.links.ci

持續集成。

<ciManagement><url> 用於Maven項目

sonar.links.issue

問題追蹤器。

<issueManagement><url> 用於Maven項目

sonar.links.scm

項目源存儲庫。

<scm><url> 用於Maven項目

sonar.sources

包含主源文件的目錄的逗號分隔路徑。

從Maven,Gradle,MSBuild項目的構建系統中讀取。如果sonar.sources未sonar.tests提供,則默認爲項目基本目錄。

sonar.tests

包含測試源文件的目錄的逗號分隔路徑。

從Maven,Gradle,MSBuild項目的構建系統中讀取。其他默認爲空。

sonar.sourceEncoding

源文件的編碼。例如:UTF-8,MacRoman,Shift_JIS。該屬性可以用project.build.sourceEncodingMaven項目中的標準屬性替換。可用編碼的列表取決於您的JVM。

系統編碼

sonar.externalIssuesReportPaths

通用問題報告路徑的路徑,以逗號分隔。

 

sonar.projectDate

爲分析分配日期。僅當需要追溯創建未分析之前的項目的歷史記錄時,此參數纔有用。格式爲yyyy-MM-dd,例如:2010-12-01。由於您無法執行分析日期早於數據庫中最新日期的分析,因此您必須按時間順序(最早的順序)進行分析以重新創建項目歷史。注意:如果您想創建長期運行的歷史記錄,則可能需要調整客房清潔設置。

當前的日期

sonar.projectBaseDir

當您需要在不是從其啓動目錄的目錄中進行分析時,請使用此屬性。EG分析從開始,jenkins/jobs/myjob/workspace但是要分析的文件在中ftpdrop/cobol/project1。該路徑可以是相對的或絕對的。不指定源目錄,而是指定源目錄的某些父目錄。此處指定的值將成爲新的“分析目錄”,然後指定其他路徑,就像分析是從指定的值開始的sonar.projectBaseDir。請注意,分析過程將需要在此目錄中具有寫權限。這是sonar.working.directory創建的地方。

 

sonar.working.directory

爲使用SonarScanner或SonarScanner for Ant(版本大於2.0)觸發的分析設置工作目錄。此屬性與SonarScanner for MSBuild不兼容。路徑必須是相對的,並且對於每個項目都是唯一的。當心:每次分析之前,指定的文件夾都將被刪除。

.scannerwork

sonar.scm.provider

此屬性可用於明確告知SonarQube應該使用哪個SCM插件來獲取項目上的SCM數據(以防自動檢測無法正常工作)。此屬性的值始終爲小寫,並且取決於插件(例如TFVC插件的“ tfvc”)。查看每個插件的文檔頁面以獲取更多信息。

 

sonar.scm.forceReloadAll

默認情況下,僅針對更改的文件檢索非常規信息。將此屬性設置true爲加載所有文件的責任信息。如果您認爲某些SCM數據已過時,但SonarQube無法從SCM引擎獲取最新信息,則此功能很有用。

 

sonar.scm.exclusions.disabled

對於受支持的引擎,SCM忽略的文件(即中列出的文件).gitignore也將被分析自動忽略。將此屬性設置true爲禁用該功能。

 

sonar.scm.revision

覆蓋修訂,例如分析結果中顯示的Git sha1。默認情況下,此值由CI環境提供或由檢出源猜測。

 

sonar.buildString

通過此屬性傳遞的字符串將與分析一起存儲,並在的結果中可用api/project_analyses/search,因此使您以後可以標識特定的分析並獲取其ID以便與結合使用api/project_analyses/set_baseline。

 

sonar.analysis.[yourKey]

此屬性存根允許您將自定義鍵/值對插入到分析上下文中,這還將傳遞給webhooks

 

重複項

描述

默認

sonar.cpd.${language}.minimumtokens

只要一行sonar.cpd.${language}.minimumTokens中至少有10個代碼行(覆蓋)中至少有100個重複的令牌(用覆蓋),就認爲該代碼是重複的sonar.cpd.${language}.minimumLines。對於Java項目,如果一行中至少有10條語句,而不論標記和行的數量如何,則一段代碼被視爲重複。此閾值不能被覆蓋。

100

sonar.cpd.${language}.minimumLines

(往上看)

10

分析記錄

描述

默認

sonar.log.level

控制分析期間生成的日誌的數量/級別。DEBUG:INFO在DEBUG級別上顯示日誌和更多詳細信息。類似於sonar.verbose=true。TRACE:顯示DEBUG日誌以及SonarScanner執行的所有ElasticSearch查詢和Web API調用的時間。

INFO

sonar.verbose

向客戶端和服務器端分析日誌添加更多詳細信息。激活DEBUG掃描儀的模式,並將客戶端環境變量和系統屬性添加到分析報告處理的服務器端日誌中。注意:如果此設置存儲爲服務器端環境變量,則此設置可能會公開敏感信息,例如密碼。

sonar.scanner.dumpToFile

將傳遞給掃描儀API的屬性的完整列表輸出到指定文件,以調試分析。

 

sonar.scanner.metadataFilePath

設置掃描儀寫入report-task.txt文件的位置,其中包含ceTaskId。

的價值 

sonar.working.directory

 

 

 

 

 

 

六,idea結合sonarLint進行的代碼分析

idea結合sonar的話,可以下載sonarLint插件,操作步驟如下:

  1. 進入idea ,進入插件安裝,在插件市場中搜索sonarLint,點擊進行安裝後重啓idea;
  2. 配置sonarLint插件,設置settings中,查找到other settings,然後選擇sonarLint General Setting ,在右側的輸入
  3. 接下來輸入要連接的服務器的登錄信息,如輸入token或者是使用賬號和密碼的方式
  4. 配置當前的項目和sonar的關係,點擊進入設置settings->other settings->SonarLint Project Settings
  5. Bind to Server 選擇剛纔配置的服務器信息。SonarQube project的選擇可以點擊Search in list查看sonar倉庫中配置的項目信息,完成選擇以後點擊ok即可
  6. 代碼分析,可以查看到當前的窗口中多了一個SonarLint的窗口(如無此窗口,可以點擊view菜單進行查找),在其中選擇report,點擊文件夾圖標,會彈窗提示,點擊process之後即可進行項目分析。

 

 

 

 

  • 單元測試數,單元測試覆蓋率指標生成使用方法。

總體思路:使用mvn生成測試報告,使用 sonar-scanner 將測試報告傳到 SonarQube服務

 

<1> Java maven 項目

1,maven Java項目,pom文件增加以下依賴

            <plugin>

                <groupId>org.jacoco</groupId>

                <artifactId>jacoco-maven-plugin</artifactId>

                <version>0.7.8</version>

                <executions>

                    <execution>

                        <goals>

                            <goal>prepare-agent</goal>

                            <goal>report</goal>

                        </goals>

                    </execution>

                </executions>

            </plugin>

 

  1. 項目中增加對應方法的單元測試方法

   採用junit測試

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
</dependency>

 

舉例

 

3,執行以下maven命令

mvn  test  org.jacoco:jacoco-maven-plugin:prepare-agent  sonar:sonar

 

<2> scala maven 項目

 

  1. maven 項目,pom文件增加以下依賴

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
<configuration>
        <!--指定生成 .exec 文件的存放位置-->
    <destFile>target/coverage-reports/jacoco-unit.exec</destFile>
    <!--Jacoco 是根據 .exec 文件生成最終的報告,所以需指定 .exec 的存放路徑-->
    <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
</configuration>
    <executions>
        <execution>
            <id>jacoco-initialize</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>jacoco-site</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

 

 

  1. 項目中增加對應方法的單元測試方法

   採用junit測試

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
</dependency>

舉例

 

  1. 執行以下命令
  1. 在項目所在目錄,執行以下命令,生成測試報告

Mvn   test

 

  1. 在項目所在目錄,增加以下配置文件sonar-project.properties

sonar.projectKey=scalatest:scalatest01

sonar.projectName=scalatest01

sonar.projectVersion=1.0

sonar.sources=.

sonar.sourceEncoding=UTF-8

sonar.projectDescription=123456789beizhu

sonar.links.homepage=www.baidu.com

sonar.scala.coverage.reportPaths=./target/site/jacoco/jacoco.xml

備註:主要增加配置項sonar.scala.coverage.reportPaths=./target/site/jacoco/jacoco.xml  

指定測試xml報告所在目錄

  1. 在項目所在目錄,執行以下命令

sonar-scanner

備註:本次掃描會把 mvn test命令在項目目錄下target目錄生成的 css,html,xml等代碼全部當成項目代碼參與掃描。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章