分享程式代碼相關筆記
目前文章總數:172 篇
最後更新:2025年 03月 22日
官網SonarQube維護程式品質的伺服器,官方資訊:
Your code is a business asset. Achieve the highest value from your code by reaching a state of Clean Code with SonarQube Server.
簡單說:SonarQube 是開源的程式碼質量管理平台,它可以持續分析和測量程式碼的技術品質,從 Bug、代碼氣味(Code Smells)到安全漏洞都能夠進行自動化檢測。
對於開發者,可以先選擇免費方案,以下列出可用功能,基本上一個小型團隊是很夠用
1. 可掃描 1 個私人專案 50,000 行程式碼 |
2. 無限掃描共用項目 (開源專案,EX: Github 上 Public) |
3. 支援 30 種程式語言 |
4. 最多 5 位用戶共用 |
5. 問題檢測與靜態應用安全測試 (SAST) |
6. 主分支與 Pull Request 的分析 (程式碼,可以針對主分支,以及 Action 再 Pull Request) |
7. 支援與 DevOps 工具(如 GitHub、GitLab、Bitbucket)集成,無縫融入 CI/CD 工作流程。 |
官網SonarQube 文件(Database 需求頁)資訊,有限制安裝需求:
以下是最低限制:
1. 記憶體 4GB |
2. 64Bit 系統,2 核心 |
3. 至少 30GB 硬碟空間 |
4. 最多 5 位用戶共用 |
5. 需安裝資料庫,支援 PostgreSQL、Microsoft SQL server、Oracle |
因為效能上的考量 SonarQube 最新版已經不支援 Mysql,但在 DockerCompose 整合下,DB 的安裝已經不會花太多時間。
先進入 Ubuntu 主機上,新建以下 DockerCompose.yml 檔案,內容如下:
以下有將宿主機 Port 設定為 9100 (預設是 9000)
並且安裝 postgres 資料庫,這是免費的 Database ,開出的 Port 為 5432
version: "3"
services:
sonarqube:
image: sonarqube:latest
container_name: sonarqube
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
ports:
- "9100:9000"
networks:
- sonarnet
ulimits:
nproc: 131072
nofile:
soft: 65536
hard: 131072
db:
image: postgres:12
container_name: sonarqube_db
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
ports:
- "5432:5432"
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
networks:
- sonarnet
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
networks:
sonarnet:
driver: bridge
進入以下目錄,開啟檔案 :
※這是在編輯 Linux 系統的核心參數配置檔案
/etc/sysctl.conf
將以下設定貼上
vm.max_map_count=262144
fs.file-max=131072
vm.max_map_count=262144 | 這是虛擬記憶體的配置,如果這個值太小,SonarQube 可能會出現 “mmap failed” 錯誤 |
fs.file-max=131072 | 這是系統允許開啟的檔案描述符的最大數量,131072 代表系統可以同時開啟約 13 萬個檔案 |
輸入以下指令讓 sysctl.conf 的配置重啟生效:
sudo sysctl -p
輸入以下指令讓 sysctl.conf 的配置重啟生效:
sudo sysctl -p
進入以下目錄 cd /louisTemp/sonarqube
並且輸入安裝指令:
sudo docker-compose up -d
可以在 Portainer 或者輸入以下指令檢查容器:
docker ps -a
可以看到 SonarQube 與 Database 都已容器化啟動
DockerCompose.yml 中有建立資料庫的帳號密碼,可以參考 .yml 檔案,嘗試連線
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
可以看到預設的資料表都會自動建立
依照自己主機的位置,可以輸入對應的 IP + Port 號進入管理介面
http://192.168.51.28:9100/
預設帳號密碼都是以下:
帳號: admin |
密碼: admin |
然後系統會強制更新密碼
這邊範例說明,因此選擇新建本地專案
專案名稱、Key、分支名稱
※如果是整合 CICD ,main 分支位置很重要,需要正確
選擇設定的地方,可以先選擇 Use the golbal setting,繼續下一步
接著選擇 Locally
選擇 Generate 產生 Token
產生出 Token 後,可以接著 Continue
選擇 .Net ,如果是自己的團隊專案,可以再依照需要設定
通常這 4 個指令只會在 CI 上配置,因為我們要模擬開發者自己本機,所以要從自己的作業系統執行這 4 項指令
範例檔案:MinIO WebSite 範例先進入其目錄
專案可能沒有 GUID ,如果沒有就需要自行添加。
<PropertyGroup>
<ProjectGuid>{Your-GUID-Here}</ProjectGuid>
</PropertyGroup>
進入 Windows CMD ,將 Step 10 的第 1 步驟指令 Copy
這會將 SonarQube 的 Asp.net Core 的掃描安裝
進入 Windows CMD ,將 Step 10 的第 2 步驟指令 Copy
這會掃描指定的專案代碼,一定要在 .csporj 或 .sln 的路徑下
進入 Windows CMD ,將 Step 10 的第 3 步驟指令 Copy
第 3 是建置代碼
第 4 完成後如下,會將結果送出到 SonarQube 的遠端機器上
進入 Windows CMD ,將 Step 10 的第 3 步驟指令 Copy
第 3 是建置代碼
第 4 完成後如下,會將結果送出到 SonarQube 的遠端機器上
在回到 WebUI 上,可以發現掃描的結果,有 1 個可靠性品質評分為 E ,有 11 個可維護性品質評分為A
打開 SonarQube 的左側項目,會出現每一筆幫您分析的結果
以第 1 筆為例,我的代碼 _teachers 這個變數應改為 Readonly
點擊進去,還會有更詳細的代碼位置校正
我們將 ReadOnly 補上修正
private readonly List<TeacherModel> _teachers = new List<TeacherModel>();
原因:
這種設計的好處是:
確保物件初始化後,重要的字段引用不會被改變
減少程式的不可預測性
使代碼意圖更清晰:這個字段的引用一旦設定就不應改變
有助於實現不可變性(immutability)原則
總之這就像是在說:”這個容器一旦建立好,就只能改變裡面的東西,而不能換成另一個容器”。
這就比較嚴重了,在 Dispose 釋放資源的地方,要避免遞回 recursion
正規的做法如下
1. 檢查是否已經釋放 |
2. 避免在 Dispose 中遞迴調用自己 |
3. 要有適當的釋放邏輯(bool 實現) |
public class MyClass : IDisposable
{
private bool _disposed = false; // 追蹤是否已經釋放
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// 釋放受控資源(managed resources)
// 例如:關閉檔案、釋放其他 IDisposable 物件等
}
// 釋放非受控資源(unmanaged resources)
// 設置大型欄位為 null
_disposed = true;
}
}
}
調整並簽入後,在依序執行 SonarQube 的掃瞄步驟 (開發者本機,執行 Windows CMD):
1. 掃描(將單元測試覆蓋率關閉)
dotnet sonarscanner begin /k:"TestDotnetCoreProject" /d:sonar.host.url="http://192.168.51.28:9100" /d:sonar.token="sqp_b40f5b8096fb8cdb39c40da8f3634e96fcab6b8b" /d:sonar.scanner.scanAll=false /d:sonar.scm.disabled=true /d:sonar.coverage.exclusions="**/*" /d:sonar.coverage.enabled=false
2. 建置代碼
dotnet build
3. 上傳
dotnet sonarscanner end /d:sonar.token="sqp_b40f5b8096fb8cdb39c40da8f3634e96fcab6b8b"
可以得到所有項目的評分都為 A 的好成果 (可維護性評分影響較低,基本上維護性還需要依賴團隊規範)