前言
靜态代碼掃描是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是一款開源的代碼品質管理平台,用于檢測代碼中的錯誤,漏洞和代碼規範,通過插件的機制,可以基于現有的Gitlab、Jenkins 內建、以便在項目拉取後進行連續的代碼檢查。旨在提供一個完整的代碼品質管了解決方案。
2)SonarQube的優勢
- 支援衆多計算機程式設計語言
- 通過插件機制能內建IDE、Jenkins、Git等
- 内置大量常用代碼檢查規則
- 支援定制開發規則
- 可視化界面
- 支援從可靠性、安全性、可維護性、覆寫率、重複率等方面分析項目
2.SonarQube組成
Sonarqube的架構可以分為以下幾個部分:
- 資料庫層:Sonarqube使用一個資料庫來存儲所有的代碼品質資料。
- 應用程式層:Sonarqube的應用程式層包括一系列基于Java的Web應用程式,這些應用程式負責收集資料、分析代碼和生成報告等任務。
- 插件層:Sonarqube的插件層是一個可擴充的架構,它允許使用者安裝和使用各種不同的插件來增強Sonarqube的功能和靈活性。
- 資料采集層:Sonarqube支援多種不同的代碼倉庫和版本控制系統,包括SVN、Git、Mercurial和ClearCase等。使用這些資料采集插件,Sonarqube可以輕松地從不同的代碼庫中收集資料。
3.SonarQube工作原理
Sonarqube的工作原理如下:
- 代碼收集:首先,Sonarqube向代碼倉庫請求代碼,并将代碼下載下傳到本地。
- 代碼分析:然後,Sonarqube使用其内置的代碼分析器分析代碼并生成有關代碼品質的重要資訊,例如代碼複雜性、代碼重複性、代碼測試覆寫率等。
- 資料存儲:Sonarqube将收集的資料存儲在其資料庫中,以供後續使用。
- 報告生成:Sonarqube使用其内置的報告生成器生成各種資料可視化圖表、報告和警告,并将其呈現給使用者。
- 回報和持續改進:使用者可以使用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系統,不同系統進入對應的目錄啟動即可。
例如,我的電腦系統是Windows x86架構64位系統,則進入“D:\sonarqube-7.6\bin\windows-x86-64”目錄,輕按兩下StartSonar.bat即可啟動sonar服務。啟動成功後,打開浏覽器,通路http://localhost:9000,預設使用者名密碼:admin/admin
2)SonarQube配置資料庫
打開SonarqQube安裝目錄,修改\conf\sonar.properties檔案,指定連接配接的資料庫、使用者名、密碼,不同的資料庫修改對應的jdbc連接配接、使用者名密碼等。
3)SonarQube修改服務端口号
預設端口号為9000,可以通過\conf\sonar.properties檔案中“WEB SERVER”配置修改端口号,修改完成後需要重新開機sonar服務:
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資料庫全部操作權限
2)Linux sonar使用者配置
① 建立sonar使用者
useradd sonar # 建立sonar使用者
passwd sonar # 為sonar使用者設定密碼,運作此指令後輸入兩遍密碼
② 為sonar使用者添加root權限
修改 /etc/sudoers 檔案,找到root一行,在root下面添加一行,如下:
sonar ALL=(ALL) ALL
③ 以root權限登入sonar使用者
su - sonar
3)上傳并解壓sonarqube
上傳壓縮檔案到sonar使用者目錄下,并解壓,確定解壓後的目錄屬組為sonar
4)配置sonarqube資料庫連接配接
編輯sonarqube/conf目錄下的配置檔案sonar.properties,配置sonarqube連接配接資料庫的使用者名、密碼,以及資料庫位址。資料庫版本要求:MySQL >=5.6 && < 8.0
5)修改sonar web端通路端口号(如需要)
若sonar所在伺服器的9000端口被占用,則需要修改為其他端口,若未被占用則不需要修改
6)配置sonar環境變量
配置環境變量後不需要再進入sonar的bin目錄即可快速啟動sonar
用root使用者編輯 /etc/profile 檔案,添加如下内容:
export SONAR_HOME=/home/sonar/sonarqube
export PATH=${PATH}:${SONAR_HOME}"/bin/linux-86-64"
source /etc/profile
7)啟動sonar
sonar啟動有兩種方式:一種是帶日志啟動,一種是背景啟動
sonar.sh start # 不列印日志啟動sonar
sonar.sh console start # 列印日志啟動sonar、前台啟動
出現SonarQube is up表示啟動成功:
啟動成功後,sonar資料庫中會自動生成多張表
8)登入sonarqube
通路位址:http://192.168.1.122:9000/,賬号密碼:admin admin
登入成功後界面如下:
3.SonarQube漢化
直接搜尋Chinese Pack安裝即可,但是舊版本的sonar無法直接搜尋安裝,需要對照對應插件版本下載下傳安裝。
以sonar-7.6版本為例:
① 下載下傳漢化插件
1.26版本漢化插件下載下傳位址:https://github.com/xuhuisheng/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.26
sonar與漢化插件版本對應關系:
② 将插件放入sonarqube安裝目錄的extensions\plugins目錄下,并重新開機sonar服務
漢化後的效果:
4.安裝過程中常見問題及解決辦法
參考連結:https://www.cnblogs.com/zndxall/p/12095769.html
1)啟動sonar報錯“/temp/conf/es/elasticsearch.yml”通路被拒絕
問題原因:注意檢查/home/sonarqube-7.6/temp目錄下的子目錄及檔案所屬使用者是否為sonar,如果是root,要改為sonar(有可能是第一次使用chown指令設定所屬使用者後,再次使用root使用者修改配置檔案,導緻該conf目錄所屬使用者發生變更)
解決辦法:重新配置conf目錄所屬使用者,一定要確定sonarqube-7.6目錄及子目錄所屬使用者為sonar。
chown -R sonar:sonar sonarqube-7.6
再次檢視,目錄配置正确
2)root使用者啟動sonar報錯
問題原因:因為安全問題elasticsearch 不讓用root使用者直接運作
解決辦法:要建立一個使用者,以該使用者來啟動sonar,同時注意sonar主目錄的所屬使用者要是該使用者
小結
以上就是靜态代碼掃描工具sonarqube組成、原理及在不同系統中的環境搭建的全部過程,在環境搭建過程中,一定要注意:
- sonarqube與資料庫的版本對應關系;
- sonarqube解壓後的目錄屬組為sonar使用者組;
- 一定要以非root使用者啟動;