利用 SonarScanner 靜態掃描 Rainbond 上的 Maven 項目
- 2022 年 8 月 8 日
- 筆記
對程式碼進行靜態掃描是一種非常常見的程式碼品質保證手段,這種掃描不僅僅可以檢查到程式碼中的缺陷,應用各種業界最佳實踐,也可以檢查出安全方面的漏洞,給予項目程式碼全方位的提升。在各種程式碼掃描方案之中,SonarQube 最為人熟知,應用最為廣泛。各種持續集成方案都有自己的方式融入 SonarQube 進行程式碼的靜態掃描工作。
今天介紹一種基於 SonarScanner 在 Rainbond 源碼構建過程中,對 Java Maven 項目進行靜態掃描的方法。
SonarScanner For Maven 簡介
使用 SonarScanner for Maven 對 Maven 項目進行程式碼靜態掃描,是 SonarQube 官方推薦的默認掃描器。只需要在 mvn 命令中加入指定的參數,就可以集成該掃描器,並在構建的過程中分析程式碼漏洞。
示例命令:
mvn clean verify sonar:sonar -Dsonar.login=myAuthenticationToken
在實際執行過程中, myAuthenticationToken
會被替代成為 SonarQube 中,某個實際用戶自己生成的令牌。
融入持續集成鏈條
了解 SonarScanner for Maven 的工作方式之後,我們就可以嘗試將程式碼掃描這個過程,融入到 Rainbond 的自動化持續集成鏈條之中。我們希望最終達成的效果,是在程式碼提交後自動觸發項目的構建,在構建過程中進行程式碼的掃描分析,並生成相應的報告。
整個流程可以概括為如下幾個階段:
- 開發人員向程式碼倉庫提交程式碼,觸發整個持續集成鏈條。
- 程式碼倉庫利用 Webhook 調用 Rainbond 的 Openapi 介面,觸發對應的服務組件構建自身。
- Rainbond 自動構建對應服務組件的同時,觸發 SonarScanner 掃描工作,並將掃描結果發送給 SonarQube 服務。
- SonarQube 服務分析掃描結果,生成程式碼檢測報告。
- 開發人員讀取程式碼檢測報告,獲悉改進點。
- 開發人員根據報告完善程式碼,並再次提交,回到步驟1,形成持續集成的閉環。
接下來,將會從實際操作的角度出發,基於 Rainbond 一點點實現上述持續集成鏈條。
前提條件
本文中介紹的包括了程式碼掃描的持續集成鏈條,都是基於 Rainbond 雲原生管理平台實現的。所以需要用戶自行準備可用的 Rainbond 環境,該環境需要連接公網,為使用開源應用商店做準備。
搭建 SonarQube
除了 Rainbond 雲原生應用管理平台,還需要準備程式碼倉庫和 SonarQube 服務。前者我們選擇使用 Gitlab ,而 SonarQube 服務則可以直接基於開源應用商店安裝。目前開源應用商店提供了 8.9.9 (lts)版本的 SonarQube ,供用戶一鍵安裝。
用戶只需要在 Rainbond 的應用市場介面選擇開源應用商店,搜索 sonarqube
即可找到對應的安裝入口:
點擊安裝,選擇好安裝位置,即可將 SonarQube 服務以及 Postgresql 資料庫一鍵安裝到指定的位置。
訪問 SonarQube 的對外服務埠,即可進入它的登錄頁面 ,默認的用戶名和密碼為: admin / admin
。
如果用戶還沒有自己的程式碼倉庫,也可以遵循相似的流程,基於開源應用商店安裝 Gitlab。
生成 AuthenticationToken
在 SonarQube 中,每個用戶都可以生成 AuthenticationToken
來作為通訊令牌,SonarScanner 就是通過這個令牌和 SonarQube 服務通訊,驗證自己的身份。
在這裡,我們為 Administrator
用戶生成專門用於掃描 Java Maven 項目的 AuthenticationToken
。
以 admin 用戶登錄後,在 我的賬戶 頁面切換到 安全 選項卡,即可生成 Token。
複製記錄下創建出來的 AuthenticationToken
,它只會出現一次!
從 Gitlab 構建 Maven 項目
Rainbond 可以基於 Oauth2.0 與 Gitlab 程式碼倉庫對接,可以非常方便的選擇構建 Gitlab 中的項目,並自動配置程式碼自動構建。
我所使用的 Gitlab 中已經存在一份標準的 Java Maven 項目程式碼。點擊基於源碼構建組件,選擇對接好的 Gitlab,就可以搜索想要部署的項目了。
創建組件的過程中,可以開啟自動構建的開關,相當於配置好了程式碼推送觸發自動構建的開關。
點擊確認創建之後,會完成程式碼語言的檢測,此時進入高級設置,點擊左側的部署屬性,我們需要做些高級設置來適配 SonarScanner 。
需要進行的設定包括:聲明 SonarQube 服務的地址,對應賬戶的 AuthenticationToken
,以及添加了程式碼掃描步驟的構建命令。
配置 Settings.xml
SonarScanner 的一般性配置,包括 SonarQube 服務地址,以及 AuthenticationToken
都可以配置進 Settings.xml 全局配置,供 Java Maven 項目構建時使用。
Rainbond 在針對 Java Maven 類型的項目進行構建時,提供入口配置全局生效的 Settings.xml 。在高級設置——部署屬性中,可以點擊 管理Maven配置 來編輯默認的 Settings.xml。此處我們已經提供了一份默認的配置,我們需要在 xml 格式下添加以下配置來定義 SonarQube 服務地址,以及 AuthenticationToken
。
<settings xmlns="//maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/SETTINGS/1.0.0
//maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>
//9000.grba63fe.duaqtz0k.17f4cc.grapps.cn
</sonar.host.url>
<sonar.login>
c1041c2b4ac2e89d1fe3f5fa5bb5971bc8dc85b7
</sonar.login>
</properties>
</profile>
</profiles>
</settings>
當然,用戶也可以新建一份專用的 Settings.xml 配置,在我的環境中,我將這份配置命名為 sonar-scanner
。全局配置只需要定義一次就可以了。
修改構建命令
SonarScanner For Maven 通過在 mvn 命令中加入特定的參數來進行程式碼掃描。
在 Maven 構建命令 輸入框中,修改命令如下:
clean verify sonar:sonar -Dsonar.projectName=Maven-demo -Dsonar.projectKey=Maven-demo install
對於每一個不同的項目,需要自定義 -Dsonar.projectName
-Dsonar.projectKey
的值。前者定義了在 SonarQube 服務中,這個項目的名字,後者則定義了項目的唯一 ID。
開始首次構建
當前使用的 SonarScanner 要求 JDK 版本高於 1.8 。這裡我們選擇 OpenJDK 11,因為這個版本是 1.8 之後的另一個長期支援版本。
到現在,部署屬性中,構建源資訊頁面應該體現如下:
點擊確認創建,即可跳轉頁面,進入第一次構建流程之中。稍等一會,首次構建就會完成,程式碼會自動被打包並上線,查看構建日誌,可以了解構建過程中的分析步驟:
訪問日誌中提及的地址,可以在 SonarQube 服務中查看新增的報告。
程式碼分析報告
開發人員參考 SonarQube 服務提供的報告,可以了解目前程式碼的問題。SonarQube 報告中會給出業界最佳實踐來修復漏洞。以我使用的項目為例,掃描到了 2 個 Bug,和 4 個安全問題。以其中一個 Bug 為例, SonarQube 給出了很詳盡的提示,包括合理的程式碼提示。
更新迭代程式碼
開發人員根據分析報告,修復程式碼後,再次提交程式碼,在程式碼提交資訊中包含關鍵字,即可自動觸發項目的構建以及新一輪的程式碼掃描。
Commit Message 中包含的 @deploy
是觸發自動構建的關鍵字。有關 Rainbond 自動構建的詳細資訊,請參考文檔 Rainbond自動構建
等待項目自動構建完成,再次審查分析報告,來確定 Bug 是否得到了解決。
回顧 Rainbond 中組件的操作記錄,會發現手動構建與自動構建之間的區別。