Skip to main content

Command Palette

Search for a command to run...

GitLab 與 SonarQube 整合

Updated
2 min read
GitLab 與 SonarQube 整合

Go_GitLab_SonarQube_Example

An example for go project on GitLab and integration with SonarQube


English Version

GitHub Repository連結

GitLab 與 SonarQube 整合

請參閱GitLab CI 可以自動檢測程式碼品質!SonarQube 程式碼品質檢測怎麼做?

SonarQube Project Properties

因為我們其實都是使用 SonarScanner 在掃描然後才把結果上傳至 SonarQube server, 所以需要一隻檔案名為sonar-project.properties 來給scanner 解讀該專案的配置.

專案基本設定

sonar.projectKey=xxx        # 專案在SonarQuber中的唯一識別碼
sonar.projectName=yyyy   # 專案名稱
sonar.qualitygate.wait=true              # 等待品質閘道檢查完成

sonar.scm.provider=git                   # 使用 git 作為version control

原始碼分析範圍設定

sonar.sources=.                          # 分析的根目錄(當前目錄)
sonar.inclusions=**/*.go                 # 只分析 .go 檔案
# 排除以下檔案:
sonar.exclusions=**/*_test.go,\          
                **/vendor/**,\          
                **/mock_*.go,\          
                **/*.pb.go,\           
                **/contract/*.go,\       
                **/*.pb.ts,\      
                **/docs/**

測試相關設定

sonar.tests=.                           # 測試檔案的根目錄
sonar.test.inclusions=**/*_test.go      # 包含所有 test.go 檔案
sonar.test.exclusions=**/vendor/**,     # 排除 vendor 目錄中的測試

sonar.go.coverage.reportPaths=coverage.out  # 程式碼覆蓋率報告的路徑
sonar.go.tests.reportPaths=test.out        # 測試結果報告的路徑
sonar.coverage.exclusions=               # 不計入覆蓋率統計的檔案:
    **/*_mock.go,\            
    **/mock/**/*,\                      
    cmd/**/*,\                      
    main.go,\                           
    **/test/**/*,\                      
    **/tests/**/*,\                     
    infrastructure/**/*,\             
    internal/config/**/*,\               
    internal/driver/**/*

但其實 SonarQube Scanner 本身不會直接執行go test指令, 畢竟他裡面也沒安裝 Go SDK, 所以需要依賴預先產生的測試報告檔案.因此接著就看 CI pipeline 中怎將報告傳遞給 SonarQube Scanner.

GitLab CI Pipeline

在 GitLab CI 中,我們需要設定適當的 pipeline 來執行測試並產生報告給 SonarQube Scanner 使用。以下是一個基本的 .gitlab-ci.yml 配置範例:

stages:
  - test
  - sonarqube

unit-test:
  stage: test
  script:
    # 執行測試並產生測試報告
    - go test -json ./... > test.out
    # 產生覆蓋率報告
    - go test -coverprofile=coverage.out ./...
  artifacts:
    paths:
      - test.out
      - coverage.out
    expire_in: 1 day  # 設定報告檔案的保存期限

sonarqube-check:
  stage: sonarqube
  image: 
    name: sonarsource/sonar-scanner-cli
    entrypoint: [""]
  dependencies:
    - unit-test  # 確保能取得測試階段產生的報告
  script:
    - sonar-scanner
  only:
    - merge_requests
    - main
    - develop

這個 pipeline 主要分為兩個階段:

  1. test 階段:
  • 使用 golang 映像檔執行測試

  • 產生兩個重要的報告檔案:

    • test.out:測試結果報告

    • coverage.out:程式碼覆蓋率報告

  • 使用 artifacts 保存這些報告檔案

  1. sonarqube 階段:
  • 使用 SonarQube Scanner 官方映像檔

  • 讀取先前產生的測試報告

  • 執行程式碼品質分析

  • 只在特定分支(main、develop)和合併請求時執行

注意事項:

  • Pipeline 需要搭配前面提到的 sonar-project.properties 設定檔使用

  • 確保 GitLab CI 環境變數中已設定必要的 SonarQube 相關變數(如 SONAR_TOKEN)

  • 測試報告會暫時保存一天,供 SonarQube 分析使用

  • 使用快取來優化 SonarQube Scanner 的執行效能

這樣的設定可以確保每次程式碼更新時,都能自動執行測試並進行程式碼品質分析,幫助團隊維持程式碼品質。

將結果以 GitLab Badge 呈現

當我們專案成功在 Scanner 掃描成功後, 就能在 SonarQube 網站上看到結果了.

且 SonarQube 還有個貼心的小功能, 就是能將結果以 Badge 的形式呈現. 點每個專案的Project Information 就能看到 Badges 了, 裡面有各種指標的 Bage 能選.

選擇好按下 Copy 後就能來到 GitLab 專案中, 一樣找到 Setting 頁面也有 Badge 能設定.

設定完成如下, 這樣我們的 GitLab Project 就能即時呈現 SonarQube 的 badge 了.

當然要是掃描失敗, 是該發訊息到 Slack 通知該團隊做優化或修復的動作.

More from this blog

Claude Code 監控秘錄:OpenTelemetry(OTel/OTLP)實戰指南

稟告主公:此乃司馬懿進呈之兵書,詳解如何以 OpenTelemetry 陣法,令臥龍神算之一舉一動盡在掌握,知糧草消耗、察兵器效能、辨戰報異常,使主公運籌帷幄於大帳之中。 為何需要斥候情報? 司馬懿稟告主公: 臥龍神算(Claude Code)乃當世利器,然若無斥候回報,主公便如蒙眼行軍——兵器耗損幾何、糧草消費幾許、哪路斥候出了差錯,一概不知。臣以為,此乃兵家大忌。 無情報之弊,有四: 軍

Feb 19, 202610 min read173
Claude Code 監控秘錄:OpenTelemetry(OTel/OTLP)實戰指南

工程師的 Claude Code 實戰指南:從零開始到高效開發

工程師的 Claude Code 實戰指南:從零開始到高效開發 本文整合 Anthropic 官方 Best Practices 與社群實戰 Tips,帶你由淺入深掌握 Claude Code。 什麼是 Claude Code?為什麼值得學? 如果你還在用「複製程式碼貼到 ChatGPT,再複製答案貼回去」的工作流程,Claude Code 會讓你大開眼界。 Claude Code 是 Anthropic 推出的命令列工具,它直接活在你的 terminal 裡,能夠讀懂你的整個 codeb...

Feb 18, 20265 min read76
工程師的 Claude Code 實戰指南:從零開始到高效開發

System Design Interview Ch 12 Digital Wallet

確立問題與設計範疇 角色對話內容 面試者我們應該只關注兩個數位錢包之間的餘額轉帳操作嗎?我們是否需要擔心其他功能? 面試官讓我們只關注餘額轉帳操作。 面試者該系統需要支援多少 TPS(每秒交易次數)? 面試官讓我們假設是 1,000,000 TPS (每秒 100 萬次交易)。 面試者數位錢包對正確性有嚴格的要求。我們可以假設事務保證 就足夠了嗎? 面試官聽起來不錯。 面試者我們需要證明正確性嗎? 面試官這是一個很好的問題。正確性(Correctness)通常只有在交...

Feb 2, 202610 min read191
System Design Interview Ch 12 Digital Wallet

Claude Code 利用 Event-Driven Hooks 打造自動化開發大腦

在現代 AI 輔助開發中,我們不僅需要 AI 寫程式,更需要它懂規則、記性好,並且能自動處理那些繁瑣的雜事。透過 Claude Code Hooks 機制,我們可以介入 AI 的思考與執行迴圈,實現真正的「人機協作自動化」。 一、 動機與痛點:為什麼你需要介入 AI 的生命週期? 在預設狀態下,Claude Code 雖然強大,但它是「被動」且「無狀態」的,這導致了開發者常遇到以下痛點: 記憶重置 (Session Amnesia): 痛點:每次重啟終端機,AI 就像失憶一樣。 解法:你...

Jan 24, 20266 min read480
Claude Code 利用 Event-Driven Hooks 打造自動化開發大腦
M

MicroFIRE

71 posts