如何利用 SonarQube 增進程式寫作效率

Davidkuo
AsiaYo Engineering
Published in
Feb 4, 2023

在網站軟體工程裡隨著整個服務與架構逐漸地茁壯之下,除了會建置 CI/CD 之外,對於龐大的 code 也要有一套的管理方式。也是筆者今天要介紹的-靜態程式分析(Static program analysis),以下簡稱靜態分析。

網站的程式碼跟隨著公司的商業邏輯與服務異動,並且配合著來來去去的開發成員,有時候會有一些藏在角落甚至落掉的程式碼,然而這些原始碼配合著邏輯,有可能會造成不可預期的潛在錯誤,如果程式庫過大在找尋中也相對的困難。此時就非常需要靜態分析的工具才幫你分析程式碼中是否含帶有潛在風險、未使用、變數名稱重複…等問題,本篇文章將採用 SonarQube 作為靜態分析的工作,此外還將整合進開發流程裡面讓整個過程中是流暢且兼顧程式品質。

這邊簡介一下 SonarQube,本身為開源的靜態分析工具且支援 25+ 的程式語言並提供了程式碼重複程式碼風格單元測試測試覆蓋率程式碼複雜度潛在Bug註釋和軟體設計報告等功能,至於其他更細部的功能請至 官網 或是 wiki 來查閱,接下來筆者將會介紹如何在自己的服務上簡易的應用 SonarQube。

SonarQube 可以採用 docker 來運行整個服務,而筆者挑選的是 community version,雖然有些限制但對於目前的工作項目已經足夠矣,首先請先下載官方的 image 並啟動 docker 來運作

  1. 下載 image 檔案docker pull sonarqube
  2. 執行 container docker run -p 9000:9000 -d sonarqube

服務開始運作時需要一點點時間讓它配置相關的參數與設定,約3~5分鐘後就可看到登入的畫面,預設的 account/password 就是 admin/admin,輸入後會在請您更換密碼。

接下來是我們的重頭戲了,要開始創建一個專案來針對我們服務的程式碼做第一次的靜態分析,這邊就針對 AsiaYo 其中一個 service 來實作整個流程。

1. 畫面上有多重選擇可以連結你的 github, gitlab..等,本次操作則選擇手動(Mannually)建立
2. 新的專案及金鑰名稱預設是兩個都一樣,可以隨團隊政策習慣修訂
3. 這邊會請您輸入 token name,完成後會賦予一組金鑰,請把這組金鑰記好
4. 建立完成後在畫面右上角有著上一步驟的金鑰,而下方有個 Excute the scanner 的 command line 直接 copy 到你的程式碼根目錄直接執行即可啟動第一次分析
開始執行 sonar-scanner CLI
可以看到掃描的過程共有 1700 個檔案套用各種 rules 分析處理,但沒有 unit test 相關的報表因此後續的圖表中則可發現相關的數據為 0%
全程共花了約 5 分鐘執行完畢

分析完畢後會產出一開始提及的相關報表,可以參考下面例圖裡完整報告如下,有著 11 個 bug、0 個 security issue、42 個 security hotspot、技術債、程式臭味…等等的總體報告,我們挑選了 bug 分頁來看一下目前有哪些問題。

整體報告的產出
可以看到每一個 bug 產生的原因

點進單一 bug 透過頁面明確指出問題在哪邊且有告知要如何修復此問題,這邊筆者就不放出畫面截圖了讓讀者可以親自嘗試看看。透過這份報告去逐一的修正你的程式後整體維護性會大幅的增加許多,畢竟大部分的問題都是經年累月產出的,經由人工直接處理的成本過高不符合經濟效益現在則是交付 SonarQube 處理即可。

Bug 已全部修復

上圖為筆者修復所有 bug 後重新針對 code 再作一次分析的結果,可以看到 bug 已經全部修復完畢為 0 了,Reliability 也轉變成 A。透過這些反覆的執行動作使產品程式品質不斷精進且提升了團隊整體工作效率。

另外前幾篇文章有提到 AsiaYo 是採用 Drone 這個服務來管理我們的 CI/CD 流程,當然 SonarQube 也有提供相對應的解決方案,下圖是筆者做個單純的 .drone.yml 檔案的內容,只要透過簡單的設定就可以導入至 Drone 的流程內,測試結果是完全沒有問題的,也鼓勵讀者們自己手動去嘗試實作看看。

Drone with SnoarQube

筆者最後總結一下,在團隊與公司業務快速成長的時期靜態分析常常扮演著非常重要的環節,可讓開發人員直接看到程式的問題與弱點,進而避免潛在的問題使得產品在將來上有著太多不可確定因素,造成功能延伸上太過於複雜或是重構上無法下手,開發團隊只要秉持著良好習慣必定可以在產品上可以事倍功半,也可以更專注在整個產品開發上而不至於花太多額外的時間在除錯或是造成服務中斷問題。

最後是工商時間,有一個免費空間夥伴的資訊分享給大家! 我們深信公開、分享,是能快速成長的重要方式, 希望延續分享的文化,為新創圈盡一份心力。 AsiaYo 的辦公室區會議室與討論空間將免費提供, 可作為研討會、活動、技術交流使用, 歡迎新創圈、同業夥伴、各界商務人士洽詢。 一起共享、交流,成長! 詳情請見完整空間夥伴資訊(連結

--

--