天天看點

Jenkins內建Sonar進行代碼審查

  由于最近客戶要求在devops持續內建平台上增加代碼審計功能,經過一番對比,決定選用sonar來實作,通過網上的文檔艱難的完成了安裝,寫篇部落格記錄下。

SonarQube 簡介

  Sonar是一個用于代碼品質管理的開源平台,用于管理Java源代碼的品質。通過插件機制,Sonar 可以內建不同的測試工具,代碼分析工具,以及持續內建工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼品質的變化,進而可以友善地對不同規模和種類的工程進行代碼品質管理。同時 Sonar 還對大量的持續內建工具提供了接口支援,可以很友善地在持續內建中使用 Sonar。 此外,Sonar 的插件還可以對 Java 以外的其他程式設計語言提供支援,對國際化以及報告文檔化也有良好的支援。

Sonar可以從以下七個次元檢測代碼品質,而作為開發人員至少需要處理前5種代碼品質問題

  1.不遵循代碼标準

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

  2.潛在的缺陷

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

  3.糟糕的複雜度分布

  檔案、類、方法等,如果複雜度過高将難以改變,這會使得開發人員難以了解它們且如果沒有自動化的單元測試,對于程式中的任何元件的改變都将可能導緻需要全面的回歸測試

  4.重複

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

  5.注釋不足或者過多

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

  6.缺乏單元測試

  sonar可以很友善地統計并展示單元測試覆寫率

  7.糟糕的設計

  通過sonar可以找出循環,展示包與包、類與類之間的互相依賴關系,可以檢測自定義的架構規則通過sonar可以管理第三方的jar包,可以利用LCOM4檢測單個任務規則的應用情況, 檢測耦合。

SonarQube與Sonar-Scanner的安裝與配置

下載下傳sonarQube安裝包

  SonarQube可以在官網(https://www.sonarqube.org/downloads/)下載下傳,在Linux伺服器上安裝始終加載不到靜态檔案,是以最後決定直接在Windows伺服器上安裝sonar,将從官網下載下傳的安裝包解壓到任意目錄。

建立sonar資料庫

  SonarQube自帶了一個H2資料庫,但是為了獲得更好的性能還是選擇MySQL資料庫。首先在mysql中建立一個sonar資料庫,用于存放分析的資料,并且建立一個資料庫使用者,實測直接用root賬戶會報錯。

> CREATE USER 'sonar'@'%' IDENTIFIED BY 'password';
> GRANT all privileges ON sonarqube.* TO sonar'@''%' IDENTIFIED BY 'password';
> flush privileges;
> create database sonar;
           

注意:MySQL資料庫一定要在5.6以上(sonar要求資料庫支援事務,mysql5.6+才是InnerDB)

配置sonar應用mysql

  修改配置檔案sonar.properties

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://:/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.host=
sonar.web.context=/sonar
sonar.web.port=
           

儲存配置檔案後,進入\bin\windows-x86-64目錄下,輕按兩下startup.bat啟動。如果啟動過程沒有報錯,打開浏覽器輸入http://172.17.20.125:9000/sonar/,出現如下畫面說明安裝成功

Jenkins內建Sonar進行代碼審查

配置Sonar-Scanner 進行項目代碼審查

  下載下傳sonar-scanner,解壓到任意目錄,同樣的修改sonar.properties 配置檔案

# --------指定系統中sonar通路路徑
sonar.host.url=http://localhost:9000/sonar
           

如果安裝的不是同一台機器,将localhost修改為對應位址即可

sonar-scanner在項目中使用需要在項目根目錄下添加sonar-project.properties檔案

#sonar-project.properties内容如下
sonar.projectKey=project_key
sonar.projectName=project_name
sonar.projectVersion=1.0
sonar.sources=./
sonar.language=py //需要掃描哪種語言的代碼,如python:py,java:java
sonar.sourceEncoding=UTF-8
sonar.host.url=http://your_host:your_port/[your_prefix]
           

進入項目根目錄,啟動cmd指令行,輸入sonar-scanner,sonar-scanner會自動對項目進行檢查,檢查的結果發送到sonar伺服器進行解析,然後回報的使用者。

Jenkins內建Sonar進行代碼審查

将sonar內建到jenkins中

  将sonar配置到jenkins中,當使用jenkins自動化部署項目時,就能夠自動的對代碼進行檢查

1.手動下載下傳jenkins插件SonarQube Scanner for Jenkins。也可以直接在jenkins中下載下傳,在[Manage Jenkins]-[Global Tool Configuration]中配置JDK和Maven後,再在Jenkins上安裝SonarQube插件。在[Manage Jenkins]-[Global Tool Configuration]中選擇SonarQube Scanner for Jenkins插件,點選下載下傳,下載下傳完成後重新開機jenkins伺服器。

Jenkins內建Sonar進行代碼審查

2.jenkins重新開機成功後,打開[Manage Jenkins]-[Configure System]和[Manage Jenkins]-[Global Tool Configuration],可以看到新增了Sonar Qube的選項。在[Manage Jenkins]-[Configure System]中配置SonarQube Server。

Jenkins內建Sonar進行代碼審查

[Server authentication token]行對應的token請輸入第一次啟動sonar server時生成的token

在jenkins中配置sonar進行代碼審查

  完成好以上步驟後,在進行項目編譯打包時,點選[增加建構步驟],會發現多了Execute SonarQube Scanner選項

Jenkins內建Sonar進行代碼審查

在Execute SonarQube Scanner中進行如下配置:

Jenkins內建Sonar進行代碼審查

Task to run 可以随便寫,JDK一定要選擇jenkins 中配置的jdk(版本不能太低,sonar要求jdk版本為1.8),Path to project properties: 相當于sonar-scanner中的sonar-project.properties,如果在項目的根目錄下有sonar-scanner配置檔案配置即可。Additional arguments中可寫可不寫,個人習慣加上“-X”,表示以Debug的形式啟動,能夠顯示更多的資訊。

Analysis properties示例如下圖所示:

sonar.projectKey=$proName
sonar.projectName=$proName
sonar.projectVersion=
sonar.sources=${proName}/src
sonar.language=java  
sonar.sourceEncoding=UTF-   
           

在sonar-java插件4.10版本之後,還需要添加sonar.java.binaries=target/classes。但是因為打包時可能沒有編譯後的檔案,是以我在sonarqube中替換了sonar-java-plugin檔案,将版本改為4.10。

儲存好Execute SonarQube Scanner配置,開始編譯打包,檢視日志

Jenkins內建Sonar進行代碼審查

然後打開sonarqube server,即可檢視分析結果

Jenkins內建Sonar進行代碼審查

關于啟動與關閉的問題&

  sonar 如果安裝在Linux伺服器下,啟動和關閉都不是問題,進入sonar安裝目錄的bin檔案夾的Linux-x86-64目錄下,直接使用指令啟動

# 啟動sonar
$ ./sonar.sh start
# 關閉sonar
$ ./sonar.sh stop
           

哎!公司伺服器抽風,Linux安裝一直出現靜态資源沒法加載,估計是環境的問題,但是沒法改,隻能在Windows伺服器上安裝。

在Windows中啟動比在Linux中更簡單,直接進入安裝目錄下的[E:\sonarqube-6.7.3\bin\windows-x86-64]目錄下,輕按兩下startSonar.bat啟動。(選擇Windows-x86-64還是32,根據系統中安裝的jdk版本而定,必須跟jdk版本對應,Linux中同理)。

Windows中啟動簡單,但是關閉卻比較複雜,各種關聯檔案,一個個的都必須釋放才能徹底關閉。

繼續閱讀