天天看點

代碼品質掃描工具SonarQube原理及環境搭建

作者:大剛測試開發實戰

前言

靜态代碼掃描是CI/CD中重要的一環,可以在代碼送出到代碼倉庫之後,在CI/CD流程中加入代碼掃描步驟,進而及時地對代碼進行品質的檢查。這可以有效地降低後期維護成本,優化産品品質,提高産品傳遞速度。同時,靜态代碼掃描還可以将代碼問題自動通知給開發人員,使得問題得到及時發現和解決。

通俗地說,通過将靜态代碼分析融入到CI/CD流程中,可以進一步提高軟體開發過程的效率和品質,幫助團隊快速傳遞高品質的産品。

一、靜态代碼分析

1.什麼是靜态代碼分析

靜态代碼分析是指無需運作被測代碼,僅通過分析或檢查源程式的文法、結構、過程、接口等來檢查程式的正确性,找出代碼隐藏的錯誤和缺陷,如:參數不比對、有歧義的嵌套語句、錯誤的遞歸、非法計算、可能出現的空指針引用等等。

2.靜态代碼分析作用

  • 快速定位代碼隐藏錯誤和缺陷;
  • 提高軟體可靠性并節省軟體開發和測試成本;

二、常見的靜态代碼分析工具

1.Java語言常用的靜态代碼分析工具

名稱 簡介
SonarQube 是一個開源的代碼品質管理平台,可以幫助團隊分析代碼品質,并生成報告和名額。它支援檢測常見的代碼品質問題,如代碼重複、複雜性、安全漏洞等。
Checkstyle 是一個開源的Java代碼規範檢查工具,可以自定義代碼規範并對Java代碼進行實時檢查,可以檢測到常見的Java編碼約定問題,側重編碼風格的檢查。
PMD 是一個開源的代碼檢查器,用于分析Java源代碼,可以檢測到常見的代碼問題,如不必要的對象建立、未使用的變量、空循環等。通過内置的編碼規則,通過缺陷比對對代碼進行靜态檢查。
FindBugs 是一個用于靜态分析Java位元組碼的開源工具,支援查找并修複在Java應用程式中常見的錯誤。它可以檢測到潛在的錯誤、線程安全問題、不良實踐等。
IntelliJ IDEA 是一款流行的Java內建開發環境,内置了豐富的代碼分析功能,如代碼檢查、代碼重構、代碼搜尋和代碼審閱。它可以幫助開發人員更輕松地識别和調試代碼問題。

2.Python語言常用的靜态代碼分析工具

名稱 簡介
Pylint 是Python語言靜态代碼分析的一種工具,可以識别并報告程式中的錯誤、代碼不規範、不安全的代碼等,支援多種代碼風格。
Flake8 是一個內建了多個Python代碼檢查工具的工具,包括PyFlakes、PEP8和mccabe等工具,可以檢查代碼文法、代碼風格以及代碼複雜性。
Pyflakes 是一個輕量級的Python代碼靜态分析工具,用來檢查文法和代碼風格,并識别出不合法的操作或語句。
Bandit 是一個基于AST(抽象文法樹)的Python安全性掃描器,能識别出代碼中的常見漏洞如SQL注入、XSS和代碼注入等。
mypy 是Python的靜态類型檢查器,在代碼編寫時就可以發現類型問題,并幫助開發人員編寫更穩健、易維護的Python代碼。
Pysa Facebook開源的、側重代碼安全性檢測的工具

三、代碼品質檢測神器-SonarQube

1.SonarQube簡介

1)什麼是SonarQube

代碼品質掃描工具SonarQube原理及環境搭建

Sonarqube是一款開源的代碼品質管理平台,用于檢測代碼中的錯誤,漏洞和代碼規範,通過插件的機制,可以基于現有的Gitlab、Jenkins 內建、以便在項目拉取後進行連續的代碼檢查。旨在提供一個完整的代碼品質管了解決方案。

2)SonarQube的優勢

  • 支援衆多計算機程式設計語言
  • 通過插件機制能內建IDE、Jenkins、Git等
  • 内置大量常用代碼檢查規則
  • 支援定制開發規則
  • 可視化界面
  • 支援從可靠性、安全性、可維護性、覆寫率、重複率等方面分析項目
代碼品質掃描工具SonarQube原理及環境搭建

2.SonarQube組成

代碼品質掃描工具SonarQube原理及環境搭建

Sonarqube的架構可以分為以下幾個部分:

  • 資料庫層:Sonarqube使用一個資料庫來存儲所有的代碼品質資料。
  • 應用程式層:Sonarqube的應用程式層包括一系列基于Java的Web應用程式,這些應用程式負責收集資料、分析代碼和生成報告等任務。
  • 插件層:Sonarqube的插件層是一個可擴充的架構,它允許使用者安裝和使用各種不同的插件來增強Sonarqube的功能和靈活性。
  • 資料采集層:Sonarqube支援多種不同的代碼倉庫和版本控制系統,包括SVN、Git、Mercurial和ClearCase等。使用這些資料采集插件,Sonarqube可以輕松地從不同的代碼庫中收集資料。

3.SonarQube工作原理

代碼品質掃描工具SonarQube原理及環境搭建

Sonarqube的工作原理如下:

  1. 代碼收集:首先,Sonarqube向代碼倉庫請求代碼,并将代碼下載下傳到本地。
  2. 代碼分析:然後,Sonarqube使用其内置的代碼分析器分析代碼并生成有關代碼品質的重要資訊,例如代碼複雜性、代碼重複性、代碼測試覆寫率等。
  3. 資料存儲:Sonarqube将收集的資料存儲在其資料庫中,以供後續使用。
  4. 報告生成:Sonarqube使用其内置的報告生成器生成各種資料可視化圖表、報告和警告,并将其呈現給使用者。
  5. 回報和持續改進:使用者可以使用Sonarqube提供的回報功能來共享意見和建議,以改善代碼品質。此外,Sonarqube還提供了持續內建和持續傳遞等功能,以幫助團隊在代碼開發過程中不斷改進代碼品質。

4.Sonar與Sonarqube的關系

Sonar是一個開源的代碼品質管理平台,而SonarQube是Sonar的一個商業版本(之前叫做Sonar Enterprise Edition)。SonarQube有許多增強功能,如更強大的規則引擎、更好的報告和更進階的內建等。

SonarQube是開源的,但它還包括了許多收費的插件和額外的支援服務,這些隻能在商業許可下使用。Sonar和SonarQube之間的差別在于SonarQube提供了一些進階功能,特别是在企業環境中需要更多的規則和細粒度的安全,并且需要承擔更多的管理和支援責任。

四、Sonarqube環境搭建

以下提供Windows和Linux兩種搭建方式。

1.SonarQube配置與啟動-Windows

1)下載下傳解壓SonarQube

将sonarqube壓縮包解壓後,即可進入bin目錄啟動,sonar相容Mac、Linux、Windows系統,不同系統進入對應的目錄啟動即可。

代碼品質掃描工具SonarQube原理及環境搭建

例如,我的電腦系統是Windows x86架構64位系統,則進入“D:\sonarqube-7.6\bin\windows-x86-64”目錄,輕按兩下StartSonar.bat即可啟動sonar服務。啟動成功後,打開浏覽器,通路http://localhost:9000,預設使用者名密碼:admin/admin

代碼品質掃描工具SonarQube原理及環境搭建

2)SonarQube配置資料庫

打開SonarqQube安裝目錄,修改\conf\sonar.properties檔案,指定連接配接的資料庫、使用者名、密碼,不同的資料庫修改對應的jdbc連接配接、使用者名密碼等。

代碼品質掃描工具SonarQube原理及環境搭建

3)SonarQube修改服務端口号

預設端口号為9000,可以通過\conf\sonar.properties檔案中“WEB SERVER”配置修改端口号,修改完成後需要重新開機sonar服務:

代碼品質掃描工具SonarQube原理及環境搭建

2.SonarQube配置與啟動-Linux

1)MySQL資料庫配置

我安裝的SonarQube-7.6版本,要求MySQL版本要>=5.6且<8.0,否則sonar無法啟動

CREATE USER 'sonar'@'%' IDENTIFIED BY 'sonar';  # 建立使用者
CREATE DATABASE sonar CHARACTER SET UTF8;  # 建立sonar專用資料庫
GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'%';  # 為sonar使用者授予sonar資料庫全部操作權限           
代碼品質掃描工具SonarQube原理及環境搭建

2)Linux sonar使用者配置

① 建立sonar使用者

useradd sonar  # 建立sonar使用者
passwd sonar  # 為sonar使用者設定密碼,運作此指令後輸入兩遍密碼           

② 為sonar使用者添加root權限

修改 /etc/sudoers 檔案,找到root一行,在root下面添加一行,如下:

sonar    ALL=(ALL)    ALL           
代碼品質掃描工具SonarQube原理及環境搭建

③ 以root權限登入sonar使用者

su - sonar           

3)上傳并解壓sonarqube

上傳壓縮檔案到sonar使用者目錄下,并解壓,確定解壓後的目錄屬組為sonar

代碼品質掃描工具SonarQube原理及環境搭建

4)配置sonarqube資料庫連接配接

編輯sonarqube/conf目錄下的配置檔案sonar.properties,配置sonarqube連接配接資料庫的使用者名、密碼,以及資料庫位址。資料庫版本要求:MySQL >=5.6 && < 8.0

代碼品質掃描工具SonarQube原理及環境搭建

5)修改sonar web端通路端口号(如需要)

若sonar所在伺服器的9000端口被占用,則需要修改為其他端口,若未被占用則不需要修改

代碼品質掃描工具SonarQube原理及環境搭建

6)配置sonar環境變量

配置環境變量後不需要再進入sonar的bin目錄即可快速啟動sonar

用root使用者編輯 /etc/profile 檔案,添加如下内容:

export SONAR_HOME=/home/sonar/sonarqube

export PATH=${PATH}:${SONAR_HOME}"/bin/linux-86-64"

代碼品質掃描工具SonarQube原理及環境搭建
source /etc/profile           

7)啟動sonar

sonar啟動有兩種方式:一種是帶日志啟動,一種是背景啟動

sonar.sh start  # 不列印日志啟動sonar
sonar.sh console start  # 列印日志啟動sonar、前台啟動           

出現SonarQube is up表示啟動成功:

代碼品質掃描工具SonarQube原理及環境搭建

啟動成功後,sonar資料庫中會自動生成多張表

代碼品質掃描工具SonarQube原理及環境搭建

8)登入sonarqube

通路位址:http://192.168.1.122:9000/,賬号密碼:admin admin

登入成功後界面如下:

代碼品質掃描工具SonarQube原理及環境搭建

3.SonarQube漢化

直接搜尋Chinese Pack安裝即可,但是舊版本的sonar無法直接搜尋安裝,需要對照對應插件版本下載下傳安裝。

代碼品質掃描工具SonarQube原理及環境搭建

以sonar-7.6版本為例:

① 下載下傳漢化插件

1.26版本漢化插件下載下傳位址:https://github.com/xuhuisheng/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.26

sonar與漢化插件版本對應關系:

代碼品質掃描工具SonarQube原理及環境搭建

② 将插件放入sonarqube安裝目錄的extensions\plugins目錄下,并重新開機sonar服務

漢化後的效果:

代碼品質掃描工具SonarQube原理及環境搭建

4.安裝過程中常見問題及解決辦法

參考連結:https://www.cnblogs.com/zndxall/p/12095769.html

1)啟動sonar報錯“/temp/conf/es/elasticsearch.yml”通路被拒絕

代碼品質掃描工具SonarQube原理及環境搭建

問題原因:注意檢查/home/sonarqube-7.6/temp目錄下的子目錄及檔案所屬使用者是否為sonar,如果是root,要改為sonar(有可能是第一次使用chown指令設定所屬使用者後,再次使用root使用者修改配置檔案,導緻該conf目錄所屬使用者發生變更)

代碼品質掃描工具SonarQube原理及環境搭建

解決辦法:重新配置conf目錄所屬使用者,一定要確定sonarqube-7.6目錄及子目錄所屬使用者為sonar。

chown -R sonar:sonar sonarqube-7.6           

再次檢視,目錄配置正确

代碼品質掃描工具SonarQube原理及環境搭建

2)root使用者啟動sonar報錯

問題原因:因為安全問題elasticsearch 不讓用root使用者直接運作

解決辦法:要建立一個使用者,以該使用者來啟動sonar,同時注意sonar主目錄的所屬使用者要是該使用者

小結

以上就是靜态代碼掃描工具sonarqube組成、原理及在不同系統中的環境搭建的全部過程,在環境搭建過程中,一定要注意:

  • sonarqube與資料庫的版本對應關系;
  • sonarqube解壓後的目錄屬組為sonar使用者組;
  • 一定要以非root使用者啟動;

繼續閱讀