對程式碼進行靜態掃描是一種非常常見的程式碼質量保證手段,這種掃描不僅僅可以檢查到程式碼中的缺陷,應用各種業界最佳實踐,也可以檢查出安全方面的漏洞,給予專案程式碼全方位的提升。在各種程式碼掃描方案之中,SonarQube 最為人熟知,應用最為廣泛。各種持續整合方案都有自己的方式融入 SonarQube 進行程式碼的靜態掃描工作。
今天介紹一種基於 SonarScanner 在 Rainbond 原始碼構建過程中,對 Java Maven 專案進行靜態掃描的方法。
使用 SonarScanner for Maven 對 Maven 專案進行程式碼靜態掃描,是 SonarQube 官方推薦的預設掃描器。只需要在 mvn 命令中加入指定的引數,就可以整合該掃描器,並在構建的過程中分析程式碼漏洞。
範例命令:
mvn clean verify sonar:sonar -Dsonar.login=myAuthenticationToken
在實際執行過程中, myAuthenticationToken
會被替代成為 SonarQube 中,某個實際使用者自己生成的令牌。
瞭解 SonarScanner for Maven 的工作方式之後,我們就可以嘗試將程式碼掃描這個過程,融入到 Rainbond 的自動化持續整合鏈條之中。我們希望最終達成的效果,是在程式碼提交後自動觸發專案的構建,在構建過程中進行程式碼的掃描分析,並生成相應的報告。
整個流程可以概括為如下幾個階段:
接下來,將會從實際操作的角度出發,基於 Rainbond 一點點實現上述持續整合鏈條。
本文中介紹的包括了程式碼掃描的持續整合鏈條,都是基於 Rainbond 雲原生管理平臺實現的。所以需要使用者自行準備可用的 Rainbond 環境,該環境需要連線公網,為使用開源應用商店做準備。
除了 Rainbond 雲原生應用管理平臺,還需要準備程式碼倉庫和 SonarQube 服務。前者我們選擇使用 Gitlab ,而 SonarQube 服務則可以直接基於開源應用商店安裝。目前開源應用商店提供了 8.9.9 (lts)版本的 SonarQube ,供使用者一鍵安裝。
使用者只需要在 Rainbond 的應用市場介面選擇開源應用商店,搜尋 sonarqube
即可找到對應的安裝入口:
點選安裝,選擇好安裝位置,即可將 SonarQube 服務以及 Postgresql 資料庫一鍵安裝到指定的位置。
存取 SonarQube 的對外伺服器埠,即可進入它的登入頁面 ,預設的使用者名稱和密碼為: admin / admin
。
如果使用者還沒有自己的程式碼倉庫,也可以遵循相似的流程,基於開源應用商店安裝 Gitlab。
在 SonarQube 中,每個使用者都可以生成 AuthenticationToken
來作為通訊令牌,SonarScanner 就是通過這個令牌和 SonarQube 服務通訊,驗證自己的身份。
在這裡,我們為 Administrator
使用者生成專門用於掃描 Java Maven 專案的 AuthenticationToken
。
以 admin 使用者登入後,在 我的賬戶 頁面切換到 安全 索引標籤,即可生成 Token。
複製記錄下建立出來的 AuthenticationToken
,它只會出現一次!
Rainbond 可以基於 Oauth2.0 與 Gitlab 程式碼倉庫對接,可以非常方便的選擇構建 Gitlab 中的專案,並自動設定程式碼自動構建。
我所使用的 Gitlab 中已經存在一份標準的 Java Maven 專案程式碼。點選基於原始碼構建元件,選擇對接好的 Gitlab,就可以搜尋想要部署的專案了。
建立元件的過程中,可以開啟自動構建的開關,相當於設定好了程式碼推播觸發自動構建的開關。
點選確認建立之後,會完成程式碼語言的檢測,此時進入高階設定,點選左側的部署屬性,我們需要做些高階設定來適配 SonarScanner 。
需要進行的設定包括:宣告 SonarQube 服務的地址,對應賬戶的 AuthenticationToken
,以及新增了程式碼掃描步驟的構建命令。
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 中元件的操作記錄,會發現手動構建與自動構建之間的區別。