利用 SonarScanner 靜態掃描 Rainbond 上的 Maven 專案
對程式碼進行靜態掃描是一種非常常見的程式碼質量保證手段,這種掃描不僅僅可以檢查到程式碼中的缺陷,應用各種業界最佳實踐,也可以檢查出安全方面的漏洞,給予專案程式碼全方位的提升。在各種程式碼掃描方案之中,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 中的專案,並自動配置程式碼自動構建。
參閱文件: Rainbond 與 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="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://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> http://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 中元件的操作記錄,會發現手動構建與自動構建之間的區別。
- 爆肝整理5000字!HTAP的關鍵技術有哪些?| StoneDB學術分享會#3
- Java併發程式設計解析 | 基於JDK原始碼解析Java領域中ReentrantLock鎖的設計思想與實現原理 (一)
- 【程式碼級】全鏈路壓測的整體架構設計,以及5種實現方案(流量染色、資料隔離、介面隔離、零侵入、服務監...
- 電商行業:全鏈路監測廣告投放效果,用資料驅動業務增長
- 如何給玩偶建模並讓它跳個舞?
- 原來 Rust 當然 Lint 是這樣工作的
- 基於 Zadig 的 GitOps 實踐
- What's new in dubbo-go-pixiu 0.5.1
- 負載均衡原理分析與原始碼解讀
- 利用 SonarScanner 靜態掃描 Rainbond 上的 Maven 專案
- 分散式鏈路追蹤Jaeger 微服務Pig在Rainbond上的實踐分享
- 收藏!0基礎開源資料視覺化平臺FlyFish大屏開發指南
- 從開源的視角,解析SAP經典ERP “三十年不用變”的架構設計 薦 轉
- 從碼農轉型大音樂家,你需要這些音樂製作處理工具
- 五分鐘給你的 gRPC 服務加上 HTTP 介面
- 【詳細教程】一文參透MongoDB聚合查詢 原 薦
- 【超詳細】手把手教你搭建MongoDB叢集 原 薦
- 從伺服器到雲託管,到底經歷了什麼?
- 敏捷需求管理篇|如何從0-1寫好一個使用者故事
- go-zero微服務實戰系列(四、CRUD熱熱身)