在 Gitlab CI 中调用 Sonarqube 进行代码扫描

原创
2019/06/06 23:35
阅读数 1.2K

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 镜像的说明,这里有几个重点:

  1. 数据:该镜像内置 H2 存储,在生产环境中使用自然是不合适的,可以通过环境变量,使用外部的 MySQL 或者 PostgreSQL 服务器。

  2. 持久化:该镜像的数据目录为 /opt/sonarqube/,下面的 datalogsconfextensions,都是需要接入 PVC 进行持久化存储的。(就算只是测试,因为安装插件需要重启,因此也需要提供持久化支持)

  3. 权限:该镜像主进程是使用 999 的组 ID 运行的,因此需要进行配置。

  4. 后续内容所用插件目前还无法支持 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 下使用评论方式发表的代码分析结果。

附录

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

本文分享自微信公众号 - 伪架构师(fake-architect)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部