在現代化的 DevOps 流程中,我們希望在程式碼合併到主線之前就能發現問題。然而,SonarQube 社群版(Community Edition)預設僅支援對主分支(Main Branch)進行掃描。這意味著在開發分支(Feature Branch)上的錯誤只有在合併後才會被發現,這顯然不符合「左移測試(Shift-Left Testing)」的原則。
本篇將介紹如何透過開源外掛突破這項限制。
為了在不升級到昂貴的商業版(Developer Edition 及以上)的前提下實現多分支掃描,我們需要安裝 sonarqube-community-branch-plugin-1.23.0.jar。此外,建議同時安裝 sonar-cnes-report 插件,這能讓我們生成專業的分析與審計報表,對於團隊內部的合規性檢查非常有幫助。
這個外掛與一般外掛不同,它需要透過 JVM 的 -javaagent 參數載入。這是因為它需要動態修改 SonarQube 核心的字節碼(Bytecode),以攔截並繞過原本僅限於商業版的「分支檢核邏輯」。
前往 GitHub Release 下載與您 SonarQube 版本對應的 JAR (本實戰使用 1.23.0)。
# 安裝社群分支插件與 CNES 報表插件
sudo cp sonarqube-community-branch-plugin-1.23.0.jar /home/sonarqube/extensions/plugins/
sudo cp sonar-cnes-report-*.jar /home/sonarqube/extensions/plugins/
此插件必須同時作用於 Web 服務(處理 UI 顯示)與 Compute Engine (CE)(處理分析報告)。
除了透過 Docker 環境變數,最穩健的做法是在 sonar.properties 中明確指定 -javaagent:
sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.23.0.jar=web
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.23.0.jar=ce
若您使用 Docker 啟動,請更新環境變數:
sudo docker run -d --name sonarqube-ce \
-e SONAR_WEB_JAVAADDITIONALOPTS="-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.23.0.jar=web" \
-e SONAR_CE_JAVAADDITIONALOPTS="-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.23.0.jar=ce" \
-p 9000:9000 \
sonarqube:lts-community
安裝完成後,執行 SonarScanner 時可傳入分支相關參數,這些參數原本在社群版是無效的:
sonar-scanner \
-Dsonar.projectKey=my-project \
-Dsonar.branch.name=feature/user-auth
當開發者提交 PR 時,我們可以傳入 PR 的元數據。如果搭配 GitLab/GitHub 配置,掃描結果會直接以留言方式回傳到 PR 頁面。
sonar-scanner \
-Dsonar.pullrequest.key=42 \
-Dsonar.pullrequest.branch=feature/user-auth \
-Dsonar.pullrequest.base=main
透過 community-branch-plugin,我們以零預算實現了商業版最核心的功能。這讓我們的 CI 流程具備了「預防勝於治療」的能力。在接下來的章節中,我們將探討如何將這些日益複雜的掃描邏輯封裝進 Jenkins Shared Library,實現多專案的快速套用。