使用 SonarQube 进行代码扫描
Gitlab 提供了基于 Code Climate
的代码质量评估功能,这一功能是通过 dind(Docker in Docker)方式运行的,在 Kubernetes 环境中、尤其是托管集群中,这种方式不太合适,还好还有一个替代方案:Sonarqube,通过在 .gitlab-ci.yml
中的设置,可以使用 Sonarqube 对代码进行扫描,接收到 Commit 之后,Sonarqube 会生成针对提交的代码质量提示,如图所示:
过程也并不复杂,简单的部署一个 SonarQube 服务,并在 Gitlab CI 中调用即可。
配置 Gitlab
这个步骤很简单,只要打开页面 profile/personal_access_tokens
,新建 Token 备用即可。
启动 Sonarqube
在 Kubernetes 环境中启用一个简单的 Sonarqube 服务器是很方便的,具体说明可以参看官方 Docker 镜像的说明,这里有几个重点:
数据:该镜像内置 H2 存储,在生产环境中使用自然是不合适的,可以通过环境变量,使用外部的 MySQL 或者 PostgreSQL 服务器。
持久化:该镜像的数据目录为
/opt/sonarqube/
,下面的data
、logs
、conf
和extensions
,都是需要接入 PVC 进行持久化存储的。(就算只是测试,因为安装插件需要重启,因此也需要提供持久化支持)权限:该镜像主进程是使用 999 的组 ID 运行的,因此需要进行配置。
后续内容所用插件目前还无法支持 SonarQube 7.7,因此此处使用的是 7.6 版本。
总结以上几点,列出代码中需要注意的内容:
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 语言插件:
在
/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 下使用评论方式发表的代码分析结果。