SonarQube 平台透過多維度指標分析程式碼品質,涵蓋可靠性、安全性、可維護性、測試覆寫率及程式碼重複性等導向。它能識別潛在錯誤、漏洞及程式碼異味,並提供修復建議,有效降低技術負債。SonarQube 支援多種程式語言和開發工具,並可與持續整合系統整合,實作自動化程式碼品質監控。此外,它根據 SQALE 方法論評估技術負債,並能透過設定品質門檻,確保程式碼符合預期標準。整合 PVS-Studio 等靜態分析工具,更能強化程式碼缺陷檢測能力,提升整體程式碼健壯性。

透過 SonarQube 平台控制程式碼品質

在軟體開發過程中,程式碼品質控制是一項至關重要的任務。本文將探討 SonarQube 平台的主要功能,以及如何利用它來持續分析和測量程式碼品質。

為什麼需要程式碼品質控制?

在軟體開發過程中,程式碼品質的重要性不言而喻。良好的程式碼品質可以提高軟體的穩定性、可維護性和可擴充套件性。反之,糟糕的程式碼品質可能導致軟體錯誤、效能問題和維護困難。

SonarQube 平台簡介

SonarQube 是一個開源平台,旨在持續分析和測量程式碼品質。它支援多種程式語言,包括 Java、C、C++、C#、Objective-C、Swift、PHP、JavaScript 和 Python 等。SonarQube 提供了一系列功能,包括:

  • 程式碼重複性檢測
  • 編碼標準遵循檢查
  • 單元測試程式碼覆寫率分析
  • 程式碼中的潛在錯誤檢測
  • 程式碼中的註解密度分析
  • 技術負債評估

SonarQube 的優勢

SonarQube 的優勢在於其能夠提供全面的程式碼品質分析報告,並且支援與多種開發工具和持續整合系統的整合。SonarQube 的主要優勢包括:

  • 全面的程式碼品質分析:SonarQube 提供了一系列指標,可以全面評估程式碼品質。
  • 與多種開發工具整合:SonarQube 支援與多種開發工具和持續整合系統的整合,包括 Maven、Ant、Gradle、JIRA、Mantis 和 LDAP 等。
  • 可擴充套件性:SonarQube 支援第三方外掛,可以擴充套件其功能。
  • SQALE 方法論支援:SonarQube 實作了 SQALE 方法論,可以評估技術負債。

為什麼選擇 SonarQube?

選擇 SonarQube 的理由在於其能夠提供全面的程式碼品質分析報告,並且支援與多種開發工具和持續整合系統的整合。SonarQube 的強大功能和可擴充套件性使其成為程式碼品質控制的理想選擇。

實施 SonarQube 的好處

實施 SonarQube 可以帶來多方面的好處,包括:

  • 提高程式碼品質:SonarQube 可以幫助團隊發現和修復程式碼中的錯誤和問題,提高程式碼品質。
  • 降低維護成本:透過及時發現和修復程式碼中的問題,可以降低軟體的維護成本。
  • 提高開發效率:SonarQube 可以幫助團隊更好地管理程式碼品質,提高開發效率。

實施 SonarQube 的挑戰

雖然 SonarQube 提供了許多好處,但實施 SonarQube 也面臨一些挑戰,包括:

  • 學習曲線:SonarQube 的功能和組態可能需要一定的學習和培訓。
  • 整合複雜性:SonarQube 需要與多種開發工具和持續整合系統整合,這可能需要一定的技術投入。

SonarQube 的應用場景

SonarQube 可以應用於多種場景,包括:

  • 大型專案:SonarQube 適合於大型專案,可以幫助團隊管理複雜的程式碼函式庫。
  • 長期專案:SonarQube 可以幫助團隊長期監控程式碼品質,確保軟體的穩定性和可維護性。
  • 多語言專案:SonarQube 支援多種程式語言,可以滿足多語言專案的需求。

隨著軟體開發技術的不斷進步,程式碼品質控制將變得越來越重要。SonarQube 將繼續發揮其在程式碼品質控制領域的重要作用,幫助團隊提高程式碼品質、降低維護成本和提高開發效率。

  graph LR
    A[開始] --> B[程式碼開發]
    B --> C[程式碼品質分析]
    C --> D[SonarQube 分析]
    D --> E[程式碼品質報告]
    E --> F[改行程式碼品質]
    F --> B

圖表翻譯: 此圖表展示了使用 SonarQube 進行程式碼品質控制的流程。首先,開發人員開始進行程式碼開發。然後,透過 SonarQube 對程式碼進行品質分析,生成程式碼品質報告。根據報告,開發人員可以改行程式碼品質,並再次進行程式碼開發,形成一個持續改進的迴圈。

程式碼示例

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

內容解密

這是一個簡單的 Java 程式,用於輸出 “Hello, World!"。SonarQube 可以對這段程式碼進行分析,檢查其是否符合編碼標準、是否存在潛在錯誤等。

function add(a, b) {
    return a + b;
}

內容解密

這是一個簡單的 JavaScript 函式,用於計算兩個數字的和。SonarQube 可以對這段程式碼進行分析,檢查其是否符合編碼標準、是否存在潛在錯誤等。

SonarQube 如何協助評估程式碼品質

SonarQube 的品質模型根據 SQALE(根據生命週期期望的軟體品質評估)方法論,並進行了特定的補充。眾所周知,SQALE 方法論主要集中在程式碼的可維護性上,而不考慮專案的風險。例如,如果今天在專案中發現了嚴重的安全問題,嚴格遵循 SQALE 方法論將要求您解決所有已存在的可靠性、可變更性、可測試性等問題,然後才能回到新的嚴重問題。事實上,如果潛在問題在程式碼中存在已久且未以使用者錯誤報告的形式顯現出來,那麼專注於修復新的錯誤要重要得多。

品質模型的重點

考慮到這一點,SonarQube 的開發人員修改了根據 SQALE 的品質模型,以強調以下幾個重要方面:

  • 品質模型應該盡可能簡單易用
  • 錯誤和漏洞不應該在可維護性問題中被忽視
  • 在專案中存在嚴重的錯誤和漏洞應該導致品質門檻要求未被滿足
  • 程式碼的可維護性問題也很重要,不能被忽視
  • 計算問題解決成本(使用 SQALE 分析模型)是重要的,應該執行

標準的 Quality Gate

SonarQube 使用以下指標值來確定程式碼是否成功透過檢查:

  • 0 個新錯誤
  • 0 個新漏洞
  • 新程式碼的技術負債係數 <= 5%
  • 新程式碼的覆寫率不低於 80%

增加技術負債的七宗罪

Sonar 團隊確定了七個增加技術負債的開發者七宗罪:

  1. 錯誤與潛在錯誤
  2. 違反編碼標準
  3. 程式碼重複
  4. 模組測試覆寫率不足
  5. 糟糕的複雜度分配
  6. 義大利麵設計
  7. 不足或過多的註解

SonarQube 的主要功能

讓我們更詳細地考慮 SonarQube 的主要功能。

首頁

在 SonarQube 的首頁上,您可以看到系統中新增的專案列表,並附有每個專案的簡要統計資訊:構建版本、程式碼行數、錯誤數量、漏洞數量以及「有臭味的程式碼」的標記,最後分析的日期。

專案指標

要取得有關專案狀態的更詳細資訊,請轉到專案指標頁面。這裡提供有關以下程式碼指標的資訊:可靠性、安全性、可維護性、測試覆寫率、重複性、程式碼函式庫大小、複雜性、檔案和問題。

可靠性指標

轉到可靠性指標,我們獲得有關發現的錯誤總數和在最近一次分析中發現的新錯誤的資訊,程式碼的可靠性評級從 A 到 E,其中 E 是最差的評級,表明至少發現了一個阻塞錯誤,以及修復所有發現的錯誤所需的時間。

安全性指標

在安全性指標頁面上,可以找到有關總漏洞數、新漏洞、安保評級(也以 A 到 E 的等級表示)以及修復漏洞所需時間的資訊。

可維護性指標

維護性頁面包含有關專案中技術負債的資訊。透過「自上而下」的導航,您可以轉到按程式碼檢測次數排序的檔案列表,然後直接進入需要注意的程式碼。

測試覆寫率

在 Coverage 頁面上提供了有關測試程式碼覆寫率的資訊。

程式碼重複

Duplications 頁面包含有關專案中程式碼重複的資訊。使用此指標,您可以輕鬆發現重複的行、程式碼區塊甚至整個檔案。

程式碼函式庫大小

頁面 Size 包含有關專案大小的資訊:程式碼行數、表示式、函式、類別、檔案和目錄的數量。

複雜性

在 Complexity 頁面上,提供了有關專案總體迴圈複雜度的資訊,以及函式和檔案的平均複雜度。

檔案

檔案頁面提供有關程式碼中註解的資訊:帶有註解的行與專案中總行數的比例、註解行的數量、公共 API 的數量以及公共 API 的檔案水平。

問題

專案指標的最後一個標籤是「問題」— 包含在程式碼中發現的問題總數(錯誤、漏洞和程式碼異味的數量總和),以及按狀態分佈的問題:開放、重新開放、已確認、誤報和不修復。

錯誤和程式碼的導航

在分析完程式碼指標後,我們將看看 SonarQube 如何處理程式碼中發現的問題。為此,我們將進入問題(Issues)部分。這裡列出了所有在程式碼中發現的問題,並提供了廣泛的過濾選項,使您能夠專注於最重要的問題。

規則、品質組態檔和品質門檻

診斷規則(Rules)、品質組態檔(Quality Profiles)和品質閾值(Quality Gates)是 SonarQube 平台的關鍵概念。每個用於 SonarQube 的靜態程式碼分析外掛都包含一個描述該外掛執行的診斷規則的函式庫。這些規則的違反用於確定程式碼中的技術負債並計算解決問題所需的時間。

品質組態檔

為了方便使用,這些規則被組合成品質組態檔(Quality Profiles)。預設情況下,SonarQube 為每種支援的語言建立一個預設品質組態檔,但您可以建立自己的品質組態檔,包含您可能需要的診斷規則集。

品質門檻

品質門檻 — 是指程式碼專案符合(或不符合)指定指標的指標。預設情況下,所有新增到 SonarQube 的專案都使用標準品質門檻,其中定義了以下指標及其門檻值。

使用 SonarQube 平台控制原始碼品質

品質門檻設定

為了確保程式碼品質達到特定標準,可以設定品質門檻。以下是一個範例組態:

  • 新的錯誤 = 0
  • 新的漏洞 = 0
  • 新程式碼的技術負債係數 <= 5%
  • 新程式碼覆寫率 >= 80%

您可以根據原始碼的品質要求,修改或建立新的品質門檻。

與 PVS-Studio 和 SonarQube 的整合

為了將 PVS-Studio 分析器的結果匯入 SonarQube,我們開發了 sonar-pvs-studio-plugin。這個外掛允許將 PVS-Studio 的診斷訊息新增到 SonarQube 伺服器的訊息函式庫中。

外掛功能

該外掛包含一個描述 PVS-Studio 靜態分析器執行的診斷的函式庫。在 SonarQube 中新增我們的外掛後,您將看到一個名為 PVS-Studio 的函式庫,適用於 C、C++ 和 C# 語言。

  graph LR;
    A[SonarQube] -->|整合| B[PVS-Studio];
    B -->|診斷訊息| C[訊息函式庫];

圖表翻譯

此圖示呈現了 SonarQube 與 PVS-Studio 的整合過程。SonarQube 透過整合 PVS-Studio,將其診斷訊息新增到訊息函式庫中。

使用方法

要將 PVS-Studio 的分析結果新增到 SonarQube,只需安裝 sonar-pvs-studio-plugin,將 PVS-Studio 的診斷從外掛函式庫新增到品質組態檔案中,並在執行 SonarQube 掃描器時將 PVS-Studio 報告檔案的路徑傳遞到屬性 sonar.pvs-studio.reportPath

SonarQube 掃描器的使用

對於 MSBuild 專案,SonarQube 的開發人員建議使用 SonarQube Scanner for MSBuild。然而,這個掃描器有一些限制。

限制

首先,在分析 C/C++ 專案時,該掃描器僅會將新增到 .vcxproj 專案檔案的 ClCompileClInclude 屬性中的檔案新增到分析檔案列表中。

其次,SonarQube Scanner for MSBuild 不會將位於目錄樹中高於專案檔案所在目錄的原始檔案新增到分析中。

解決方案

根據這些限制,我們建議使用標準的 SonarQube 掃描器來匯入 PVS-Studio 分析結果。使用此掃描器需要手動建立組態檔案 sonar-project.properties

自動建立組態檔案

為了簡化組態檔案建立的過程,我們實作了 PVS-Studio 分析器的特殊工作模式,允許自動建立 SonarQube 掃描器的組態檔案。

程式碼品質控制的重要性

正如彼得·德魯克所說:「如果你無法衡量它,你就無法改善它。」 SonarQube 平台可以提供有關專案程式碼狀態的綜合報告,並評估修復程式碼問題所需時間。

// 範例程式碼:計算技術負債係數
public double CalculateTechnicalDebtRatio(int newCodeLines, int totalCodeLines)
{
    return (double)newCodeLines / totalCodeLines * 100;
}

內容解密

此段程式碼用於計算技術負債係數。它接受兩個引數:newCodeLinestotalCodeLines,分別代表新程式碼的行數和總程式碼行數。然後,它計算技術負債係數並傳回結果。

SonarQube 平台具有廣泛的整合能力和可擴充套件性,可以成為您 ALM 框架的一部分。如果您使用靜態分析器 PVS-Studio,我們的外掛將允許您將分析結果匯入 SonarQube,以利用其功能來研究程式碼品質問題。

有用的連結