在 Gitlab CI 中調用 Sonarqube 進行代碼掃描

Gitlab 提供了基於 Code Climate 的代碼質量評估功能,這一功能是經過 dind(Docker in Docker)方式運行的,在 Kubernetes 環境中、尤爲是託管集羣中,這種方式不太合適,還好還有一個替代方案:Sonarqube,經過在 .gitlab-ci.yml 中的設置,能夠使用 Sonarqube 對代碼進行掃描,接收到 Commit 以後,Sonarqube 會生成針對提交的代碼質量提示,如圖所示:java

過程也並不複雜,簡單的部署一個 Sonarqube 服務,並在 Gitlab CI 中調用便可。git

配置 Gitlab

這個步驟很簡單,只要打開頁面 profile/personal_access_tokens,新建 Token 備用便可。github

啓動 Sonarqube

在 Kubernetes 環境中啓用一個簡單的 Sonarqube 服務器是很方便的,具體說明能夠參看官方 Docker 鏡像的說明,這裏有幾個重點:api

  1. 數據:該鏡像內置 H2 存儲,在生產環境中使用天然是不合適的,能夠經過環境變量,使用外部的 MySQL 或者 PostgreSQL 服務器。服務器

  2. 持久化:該鏡像的數據目錄爲 /opt/sonarqube/,下面的 datalogsconfextensions,都是須要接入 PVC 進行持久化存儲的。(就算只是測試,由於安裝插件須要重啓,所以也須要提供持久化支持)微信

  3. 權限:該鏡像主進程是使用 999 的組 ID 運行的,所以須要進行配置。架構

  4. 後續內容所用插件目前還沒法支持 Sonarqube 7.7,所以此處使用的是 7.6 版本。app

總結以上幾點,列出代碼中須要注意的內容:maven

apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: sonarqube
labels:
app: sonarqube
spec:
...
template:
metadata:
...
spec:
securityContext:
fsGroup: 999
containers:
- name: sonarqube
image: "sonarqube:7.6-community"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 9000
volumeMounts:
- name: sonar-ext
mountPath: /opt/sonarqube/extensions
- name: sonar-data
mountPath: /opt/sonarqube/data
- name: sonar-log
mountPath: /opt/sonarqube/logs
- name: sonar-conf
mountPath: /opt/sonarqube/conf
...

配置 Sonarqube

Sonarqube 啓動以後,使用缺省用戶名和密碼(admin/admin)登陸以後,首先安裝 Java 語言插件:gitlab

  • /account/security/ 修改密碼。

  • 前往 /admin/marketplace 安裝 SonarJava 插件。

  • 打開路徑 /admin/system,重啓服務。

接下來是手工安裝 Gitlab 插件:

  • 使用 kubectl exec -it 進入 Sonarqube 的 Pod 中。

  • 進入 /opt/sonarqube/extensions/plugins 路徑,下載插件

  • 重啓 Sonarqube。

插件安裝完成以後,/projects/create 建立新項目,選擇 java -> maven,最終會出現以下提示:


其中包含了後續步驟所須要的 Token。

配置 Gitlab 插件

  • 打開 admin/settings?category=gitlab

  • 填寫 GitLab url 以及 GitLab User Token

  • 保存。

配置項目 CI

這部分至關簡單的一行 Maven 命令,例如

stages:
- test
- scan
...
Sonar:
stage: scan
tags:
- maven
script:
- mvn --batch-mode verify sonar:sonar -Dsonar.host.url=https://sonar.microservice.xyz -Dsonar.login=cd387c80d1d40b24c1000b9982778ecef572795c -Dsonar.projectKey=sam -Dsonar.gitlab.project_id=$CI_PROJECT_ID -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME

這裏的關鍵參數:

  • sonar.host.url:Sonarqube 的地址。

  • sonar.login:Sonarqube 配置新項目時生成的 Token

  • sonar.projectKey:Sonarqube 新項目生成的 ID。

完成上述修改以後,就能夠提交你的 Java 代碼,看看 Sonarqube 在 Commit 下使用評論方式發表的代碼分析結果。

附錄

  • 插件項目地址:https://github.com/gabrie-allaigre/sonar-gitlab-plugin/

本文分享自微信公衆號 - 僞架構師(fake-architect)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索