Skip to main content

Sonarqube

Giới thiệu

SonarQube là một công cụ mã nguồn mở được sử dụng để đánh giá và quản lý chất lượng mã nguồn trong quy trình phát triển phần mềm. Nó cung cấp các công cụ phân tích tĩnh (static analysis) để phát hiện các vấn đề liên quan đến mã nguồn như lỗi lập trình, lỗi bảo mật, vi phạm quy tắc lập trình, và sự không tuân thủ tiêu chuẩn chất lượng.

SonarQube cung cấp khả năng kiểm tra tự động mã nguồn từ nhiều ngôn ngữ lập trình phổ biến và hỗ trợ tích hợp liên tục với các công cụ CI/CD như Jenkins, GitLab và Azure DevOps. Nó cho phép đo lường và theo dõi chất lượng mã nguồn theo thời gian, cung cấp báo cáo chi tiết về các vấn đề phát hiện và đề xuất cải thiện.

SonarQube giúp đảm bảo rằng mã nguồn được viết sạch, dễ bảo trì và tuân thủ các quy tắc và tiêu chuẩn chất lượng, đồng thời giúp giảm rủi ro và tăng hiệu suất trong quy trình phát triển phần mềm.

Tích hợp sonarqube với dự án trên gitlab

Runsystem sử dụng sonarqube tại địa chỉ https://sq.runsystem.info/, sonarqube sử dụng tài khoản gitlab của RUNSYSTEM để đăng nhập. Để sử dụng sonarqube bạn cần có tài khoản gitlab để đăng nhập vào hệ thống sonarqube và làm theo những bước sau đây.

Tạo dự án trên sonarqube

Bấm nút tạo project trên sonarqube để bắt đầu tạo dự án thủ công.

Điền thông tin Project keyDisplay name. Chú ý: Quy tắc đặt tên Project key. (Project key sau này sẽ được dùng để kết nối từ Gitlab CICD tới Sonarqube)

  • <Tên chi nhánh>.<Tên bộ phận>.[Mã dự án trên jira] <Tên dự án trên jira>_Git_Branch. Ví dụ: HN.BSD.[OPS]OnePageShop_buyer_master

Cùng với Project key, Token sẽ đuợc dùng để kết nối từ Gitlab CICD tới Sonaqube. Token sẽ đuợc gắn với user của bạn, và có thể tái sử dụng cho các dự án cần tích hợp về sau mà không cần tạo token mới. Có thể lựa chọn tạo một token mới Generate a token hoặc sử dụng token cũ đã tạo trước đó bằng cách lựa chọn Use existing token. Notes: Nếu chọn Generate a token hãy nhớ lưu lại token này để sử dụng lại về sau.

Tiếp đó, hãy lưu hai thông tin bên duới (mục Execute the Scanner from your computer). Ví dụ:

sonar.projectKey=hn.tio.test
sonar.login=9951fb7b4cd8905d28760007760ac929e194d4c3

Trong đó projectKeylogin sẽ là hai thông tin sẽ dùng để sử dụng trong trong CI&CD.

Cấu hình CI&CD

Để có thể sử dụng CI&CD project phải được kích hoạt để chạy một gitlab-runner, trong trường hợp này bạn có thể cài một server gitlab-runner riêng hoặc đơn giản hơn request tài nguyên dự án thông qua G-Help Link request hoặc liên hệ ChatOps thienlv2@runsystem.net.

Để cấu hình CI&CD trên gitlab cần thực hiện 2 bước:

Cấu hình biến môi trường cho dự án trên bảng điều khiển setting gitlab

Truy cập Setting --> CICD --> Variables Sử dụng Project key, Token đã lưu bên trên đê tạo 2 biến môi trường cho gitlab repository. Ví dụ:

SONAR_PROJECT_KEY=hn.tio.test
SONAR_TOKEN=1234sdafdfsdfsd4565

Phần SONAR_PROJECT_KEY nếu có ký tự đặc biệt như ._- thì hãy chuyển tắt masked ở ô input.

Cấu hình file .gitlab-ci.yml vào root của source code

File .gitlab-ci.yml phải nằm ở root source code dự án. Nội dung tham khảo như sau:

  • Áp dụng với dự án với các dự án PHP,Node,Python... (trừ Java)
sonarqube:
only:
- master
- dev
stage: sonarqube
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [ "" ]
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
SONAR_HOST_URL: https://sq.runsystem.info
SONAR_TOKEN: "${SONAR_TOKEN}"
SONAR_SCANNER_OPTS: "-Dsonar.projectKey=${SONAR_PROJECT_KEY}"
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner -Dsonar.sources=. -Dsonar.dependencyCheck.htmlReportPath=./dependency-check-report.html -Dsonar.exclusions=**/dependency-check-report.html,**/*.java,**/*.yml -Dsonar.dependencyCheck.severity.critical=4.0
allow_failure: true
  • Áp dụng với dự án Java (Lưu ý: với project Java, cần build ra class trước khi quét)
sonarqube:
only:
- master
stage: sonarqube
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [ "" ]
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
SONAR_HOST_URL: https://sq.runsystem.info
SONAR_TOKEN: "${SONAR_TOKEN}"
SONAR_SCANNER_OPTS: "-Dsonar.projectKey=${SONAR_PROJECT_KEY}"
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner -Dsonar.sources=. -Dsonar.dependencyCheck.htmlReportPath=./dependency-check-report.html -Dsonar.exclusions=**/dependency-check-report.html,**/*.yaml,**/*.yml,**/*.sh -Dsonar.java.binaries=. -Dsonar.dependencyCheck.severity.critical=4.0
allow_failure: true

Trong đó develop, master là nhánh bạn muốn quét, nếu sử dụng nhánh khác hãy sửa/ thêm thông tin này.

Chạy quét sonarque

Sau khi đã setup xong, mỗi khi có merge request được merge vào nhánh đã cấu hình hoặc có commit trực tiếp vào nhánh đã cấu hình thì sonarqube sẽ tự động được kích hoạt.

Có thể theo dõi quá trình quét trên dashboard của gitlab và kết quả quét sẽ được đẩy lên https://sq.runsystem.info/

ý nghĩa các thông số của Sonarqube tham khảo thêm tại: https://docs.sonarqube.org/latest/user-guide/metric-definitions/