利用 SonarScanner 靜態掃描 Rainbond 上的 Maven 專案

2022-08-08 18:01:07

對程式碼進行靜態掃描是一種非常常見的程式碼質量保證手段,這種掃描不僅僅可以檢查到程式碼中的缺陷,應用各種業界最佳實踐,也可以檢查出安全方面的漏洞,給予專案程式碼全方位的提升。在各種程式碼掃描方案之中,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 的自動化持續整合鏈條之中。我們希望最終達成的效果,是在程式碼提交後自動觸發專案的構建,在構建過程中進行程式碼的掃描分析,並生成相應的報告。

整個流程可以概括為如下幾個階段:

  1. 開發人員向程式碼倉庫提交程式碼,觸發整個持續整合鏈條。
  2. 程式碼倉庫利用 Webhook 呼叫 Rainbond 的 Openapi 介面,觸發對應的服務元件構建自身。
  3. Rainbond 自動構建對應服務元件的同時,觸發 SonarScanner 掃描工作,並將掃描結果傳送給 SonarQube 服務。
  4. SonarQube 服務分析掃描結果,生成程式碼檢測報告。
  5. 開發人員讀取程式碼檢測報告,獲悉改進點。
  6. 開發人員根據報告完善程式碼,並再次提交,回到步驟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 中元件的操作記錄,會發現手動構建與自動構建之間的區別。