SonarQube trong CI/CD: Kiến trúc, Luồng hoạt động và Quality Gate
Mục tiêu của bài viết là giúp team nhìn rõ toàn bộ vòng đời kiểm soát code quality: từ lúc developer push code cho đến khi pipeline quyết định deploy hay dừng dựa trên Quality Gate.
1. Tổng quan kiến trúc SonarQube
+----------------+
| Developer |
| VSCode/IntelliJ|
+-------+--------+
|
Commit / Push Code
|
v
+----------------+
| Git Repository |
| GitHub/GitLab |
+-------+--------+
|
Trigger CI/CD Pipeline
|
v
+------------------------------------+
| Jenkins / GitHub Actions / GitLab |
+----------------+-------------------+
|
Build & Unit Test
|
Generate Coverage Report
(JaCoCo, LCOV, etc.)
|
v
Sonar Scanner Execute
|
sonar-project.properties
sonar.host.url
sonar.login/token
|
v
+----------------------+
| SonarQube |
|----------------------|
| Rule Engine |
| Code Smells |
| Bugs |
| Vulnerabilities |
| Coverage |
| Duplicated Code |
| Quality Gate |
+----------+-----------+
|
Store Analysis Result
|
v
+---------------+
| PostgreSQL DB |
+---------------+
|
v
SonarQube Dashboard
|
+---------------+----------------+
| |
v v
Developers Tech Lead / Manager
2. Luồng hoạt động end-to-end
Developer
|
| Commit Code
v
Git Repository
|
| Trigger Pipeline
v
CI/CD
|
+--> Build
|
+--> Unit Test
|
+--> Generate Coverage
|
+--> Run Sonar Scanner
|
v
SonarQube Server
|
Analyze Source Code
|
Compare with Rules
|
Generate Report
|
Evaluate Quality Gate
|
+--------+---------+
| |
| PASS | FAIL
| |
v v
Deploy Continue Stop Pipeline
Điểm quan trọng:
- SonarQube không build ứng dụng thay CI; nó dùng output từ build/test/coverage để phân tích sâu hơn.
- Quality Gate là cơ chế ra quyết định để bảo vệ production khỏi mã nguồn chất lượng kém.
3. Thành phần chính và vai trò
Developer
Lập trình viên viết code và commit lên repository.
Ví dụ code đơn giản:
function add(a, b) {
return a + b;
}
Git Repository
Nơi lưu source code và kích hoạt pipeline khi có thay đổi.
Ví dụ:
- GitHub
- GitLab
- Bitbucket
CI/CD
Các nền tảng thường dùng:
- Jenkins
- GitHub Actions
- Azure DevOps
- GitLab CI
Pipeline điển hình:
Checkout
↓
Install Dependencies
↓
Build
↓
Run Unit Test
↓
Generate Coverage
↓
Run Sonar Scanner
↓
Deploy
Sonar Scanner
Thành phần gửi source code và report lên SonarQube.
Ví dụ lệnh:
sonar-scanner
mvn sonar:sonar
./gradlew sonarqube
Scanner thường gửi:
- Source Code
- Coverage Report
- Test Report
- Branch metadata
- Commit information
SonarQube Server
Đây là “bộ não” phân tích chất lượng mã nguồn.
Bugs
Ví dụ rủi ro null:
if (name.equals(null))
Có thể gây NullPointerException.
Vulnerabilities
Ví dụ SQL Injection:
String sql = "SELECT * FROM User WHERE id=" + id;
Code Smells
Ví dụ hàm quá nhiều nhánh lồng nhau:
public void process() {
if (...) {
...
} else if (...) {
...
} else if (...) {
...
} else if (...) {
...
}
}
Duplicated Code
Ví dụ logic trùng lặp nhiều nơi:
calculateTax();
...
calculateTax();
Coverage
SonarQube đọc dữ liệu từ:
- JaCoCo
- LCOV
- Cobertura
Ví dụ:
Coverage = 82%
Maintainability
Đánh giá:
- Độ dễ đọc
- Độ dễ sửa
- Complexity
Reliability
Đánh giá theo nhóm lỗi Bugs và mức độ ổn định.
Security
Đánh giá theo nhóm lỗ hổng Vulnerabilities.
Database
SonarQube lưu kết quả vào PostgreSQL.
Ví dụ dữ liệu lưu trữ:
Project
History
Issues
Users
Rules
Quality Gate
Dashboard
Dashboard cung cấp số liệu để developer và quản lý theo dõi.
Project
Coverage
78%
Duplications
2.1%
Bugs
5
Vulnerabilities
1
Code Smells
92
Bạn có thể click vào từng issue để xem chính xác file, line và rule bị vi phạm.
4. Quality Gate (trung tâm kiểm soát chất lượng)
Ví dụ điều kiện gate:
Coverage > 80%
AND
Bugs = 0
AND
Critical Vulnerabilities = 0
AND
Duplicated < 3%
Nếu không đạt:
Quality Gate = FAILED
Pipeline có thể dừng ở bước kiểm soát chất lượng để ngăn deploy.
Diagram Quality Gate
SonarQube Analysis
|
|
+------------+-------------+
| |
Coverage >=80% ? Bugs == 0 ?
| |
+------------+-------------+
|
Vulnerabilities == 0 ?
|
Duplication <3% ?
|
+-------+-------+
| |
PASS FAIL
| |
v v
Continue CI Stop Deployment
5. Ví dụ thực tế với Angular
Angular Project
src/
app/
components/
services/
...
↓
npm test -- --code-coverage
↓
coverage/lcov.info
↓
sonar-scanner
↓
SonarQube
↓
Dashboard
SonarQube sẽ đọc file sau để tính coverage:
coverage/lcov.info
6. Quy trình đầy đủ trong doanh nghiệp
Developer
|
Write Feature Code
|
v
Local Unit Test
|
v
Commit / Push Git
|
v
GitHub / GitLab Repo
|
v
CI/CD Pipeline Trigger
|
+----------+-----------+
| |
| Build Application |
| |
+----------+-----------+
|
Run Unit Tests
|
v
Generate Coverage Report
|
v
Sonar Scanner
|
v
+-----------------------+
| SonarQube Server |
|-----------------------|
| Static Code Analysis |
| Bugs |
| Code Smells |
| Vulnerabilities |
| Coverage |
| Duplications |
| Maintainability |
| Reliability |
+-----------+-----------+
|
Save into Database
|
Evaluate Quality Gate
|
+------------+------------+
| |
| PASS | FAIL
| |
v v
Continue Deploy Stop Pipeline
|
v
Production
7. Tóm tắt vai trò từng thành phần
| Thành phần | Vai trò |
|---|---|
| Developer | Viết và commit code. |
| Git Repository | Lưu trữ mã nguồn và kích hoạt pipeline khi có thay đổi. |
| CI/CD | Build, chạy test, tạo báo cáo coverage và gọi Sonar Scanner. |
| Sonar Scanner | Thu thập mã nguồn và báo cáo (coverage, test) rồi gửi lên SonarQube. |
| SonarQube Server | Phân tích chất lượng mã: Bugs, Vulnerabilities, Code Smells, Duplications, Coverage và áp dụng Quality Gate. |
| PostgreSQL | Lưu lịch sử phân tích, cấu hình, quy tắc và kết quả. |
| Dashboard | Hiển thị báo cáo chi tiết để Developer, Tech Lead và Manager theo dõi và xử lý vấn đề. |
| Quality Gate | Đưa ra quyết định PASS/FAIL; nếu không đạt, pipeline có thể dừng và không cho phép triển khai. |
Ví dụ pipeline Angular điển hình
- Developer push code lên Git.
- CI chạy
npm install. - Build ứng dụng bằng
ng build. - Chạy
ng test --code-coverageđể tạocoverage/lcov.info. - Chạy
sonar-scanner. - SonarQube phân tích:
- Code Smells
- Bugs
- Vulnerabilities
- Coverage
- Duplicated Code
- Nếu Quality Gate = PASS, pipeline tiếp tục deploy; nếu FAIL, pipeline dừng để team khắc phục trước khi triển khai.
Kết luận
SonarQube không chỉ là công cụ “báo lỗi”, mà là một quality control layer trong DevOps. Khi kết hợp đúng với CI/CD và Quality Gate, team sẽ:
- Phát hiện lỗi sớm trước production
- Chuẩn hóa chất lượng code giữa nhiều developer
- Giảm technical debt theo thời gian
- Tăng độ tin cậy khi release
Nếu bạn đang xây dựng quy trình engineering bài bản, hãy xem SonarQube là một checkpoint bắt buộc trong pipeline — giống như test và build.