程序員寫代碼是有一些開發規范的,比如java程序員經常會用到的阿里巴巴java開發手冊;其他語言也會有一些自己的規范。不少公司都比較重視代碼的質量,會做代碼走讀或者code review,叫法不一樣,但目的都是盡量保證代碼的質量和安全。
以前用過crucible這樣的工具來協助code review,公司對于code review是有強制性要求的,需要不少于3個人來做,并且要解決提出的合理要求;其實這樣比較費時間和精力,尤其是不少代碼是并不是核心業務代碼,記得當時看到沒有注解、魔法值這些每次都會提出來。那么有沒有工具來解決這些重復性的工作,讓大家更加關注核心業務的code review呢(自檢的插件還是有的,比如Alibaba Java Coding Guidelines;這里主要介紹需要部署服務器,讓多人協同工作的)。
以前經常聽到過sonar來進行代碼檢查,正好今天被分配了個任務要求做自動代碼檢查,就找資料學習并安裝使用了下,發現用起來比較簡單而且效果也還不錯。
sonar簡介
官網地址:https://www.sonarqube.org/
這個沒有國際化,只能看英文的了。首頁這里加粗的就是sonar最大的作用就是:代碼質量和安全,他的使用對象是your teammate團隊成員,所以明確介紹了是為團隊成員的代碼質量和安全。
不急著下載,先找到官方文檔Document:https://docs.sonarqube.org/latest/
文檔首頁左邊這里是導航,右邊是歡迎頁加一些簡介,這里告訴我們從7.4版本后在sonar內部就可以看到這些文檔:
右邊這里更細致的區分了使用對象(比如作為新人,sonar管理員,程序員使用者等),建立了更快捷的導航:
很明顯,我們是做為新人來使用的。這里有2個鏈接:一個是快速的demo,一個是生產使用。在進入這里之前,我們先看下左側導航的Requirements需求:
這里對于軟件環境就一點明確的要求JRE11或者OpenJDK11,硬件要求操作系統至少2G內存和1G的可用內存,然后明確指出不支持32位的系統;至于硬盤空間則是根據需要分析的代碼來定的,有興趣的可以自己去看下說明,這里不具體描述了。大概意思是使用sonar云在Amazon EC2 large的實例上分析有5年歷史3億5000萬行代碼需要每個節點50G的空間來運行。
然后企業級硬件的推薦配置8核16G:
支持的平臺,java(服務器要求jre11,掃描的要求jre11和jre8)和數據庫等:
如果不想使用最新的(目前是8.2版本),可以在左側導航切換:
當然如果要使用舊版本的話最好選擇7.9LTS,這個表示7.9版本會長期支持。
sonar安裝
好吧,前面簡介廢話了這么多(其實還是很有用處的,起碼知道了一些基本要求);進入正式的安裝。首先回到文檔首頁https://docs.sonarqube.org/latest/:
選擇快速demo版本:
發現快速demo版本果真簡單,在2分鐘內搞定。然后他告訴你這只是怎么安裝一個demo實例,如果準備好安裝到正式環境,需要看對應服務器文檔。
快速安裝有2種方式:
1、通過zip解壓安裝:需要下載SonarQube 社區版,然后用非root賬戶解壓并運行。
既然這里說了有社區版那肯定就有收費版,進入下載頁https://www.sonarqube.org/downloads/
根據實際情況選擇吧,社區版支持的語言和功能沒有Developer版強大,不過也足夠用了。因為這里需要jre11或openjdk11的環境,所以不演示了。
2、使用docker安裝:應該不少人都用過docker了,這里不詳細描述docker了。
centos7下安裝docker:
yum install docker -y
安裝后啟動并設置成開機啟動
systemctl start docker
systemctl enable docker
然后按照文檔安裝(這個時間有點長,遠超2分鐘;這里推薦使用阿里云鏡像加速,具體操作去百度docker阿里云鏡像加速,速度很快),需要注意9000端口沒被占用:
docker pull sonarqube
docker run -d --name sonarqube -p 9000:9000 sonarqube
執行命令后如果沒問題會看到一串字符串,可以理解為docker啟動了一個容器的id標識:
然后通過瀏覽器訪問:
可以看到about頁面了,點擊登錄按鈕:
可以看到登錄界面下方有個警告,說內嵌的數據庫僅適用于評估目的,推薦還是使用外部的數據庫。默認用戶名密碼是admin/admin,登錄:
可以在右邊看到各項評估指標統計,左邊是項目列表。
到這來sonar的安裝就完成了,下面介紹下怎么結合java進行代碼分析。
簡單使用
點右側的創建新項目:
如果有項目的話可以點右上角的加號創建:
可以看到創建新項目需要填寫的項目關鍵字和顯示名稱:
點擊創建繼續:
這里需要生成一個token,隨便填寫token的名稱然后點生成:
點擊繼續:
可以看到第二步出現了,需要選擇你項目的主要語言,這里我們選擇java:
然后可以看到提示,我們用什么技術來構建,這里我用的是maven,所以選擇maven繼續:
可以看到分成具體的一個提示命令了,其中包含了項目名稱,sonar主機url和剛生產的token;我們先復制這個命令直接到工程下運行(在windows下需要去掉反斜杠):
經過一段時間的等待,發現分析成功了。我們在回到瀏覽器頁面,發現頁面也變化了:
看到左邊是整體結果Passed通過了,右邊是詳細統計。有多少bug,多少Vulnerabilities漏洞,多少Security Hotspots這些具體的信息及對應的評級。總之有數字的就是需要改進的,然后我們點擊3個Vulnerabilities漏洞查看:
可以看到左側還是導航欄,記錄了各種級別的問題;有右邊是對應問題的列表,可以看到每個漏洞的級別,甚至告訴你為什么是個issue。
先點擊第一條記錄:
頁面跳轉了,左側是剛才的問題列表,右側是具體的代碼。其實這里給出了他要求你怎么做了:
直接百度翻譯:將i設為靜態final常量或非公共常量,并在需要時提供訪問器;比較明確了吧。我們再看下為什么,點‘Why is this an issue’:
也給出了非常明確的解釋,還有例子:
提示信息和例子還是很有用的,明確地告訴你需要怎么去解決。
回到首頁發現剛才分析的項目在右側列表了:
好了,sonar安裝及簡單使用到這里基本上就可以了。實際項目中肯定是需要結合持續集成,后續可能會進一步做相關的介紹和使用。