一、背景介绍
目前,成熟的代码检测工具有很多,如 SpotBugs(前身为 FindBugs)、PMD、Checkstyle 等,我们可以在本地开发环境,非常便捷地利用这些工具实现代码的扫描与检测。这看上去好像很不错,但实际上,采用这种代码检测方式,我们面临着两个问题:
-
代码提交前需要手动运行检测工具
-
检测结果仅对自己可见
那么,有没有什么方案可以规避这些问题呢?答案当然是有的。
我们可以基于 GitLab 和 SonarQube 搭建自动化代码检测平台,并通过该平台实现以下功能:
-
每次提交时,自动触发 SonarQube 代码检测,产生检测报告(包含坏味道、BUG 数、覆盖率等)
-
上述检测报告,若来源于主分支提交或合并,则发送至 SonarQube,若来源于其他分支提交,则以评论形式直接反馈至 GitLab
注:如果不知道 SonarQube 是什么,可以参考 SonarQube 官方网站。
二、环境要求
本次搭建使用的操作系统为 CentOS 7
,需要安装的组件如下表所示:
组件名 | 版本号 |
---|---|
SonarQube | 6.7 |
GitLab | 11.1.4 |
GitLab-Runner | 13.0.1 |
Maven | 3.6.3 |
实际版本号需严格遵循表格中的版本号,避免出现兼容性问题。目前,笔者已知的兼容性问题有以下几点:
-
SonarQube 在 7.6 版本后不支持插件
sonar-gitlab-plugin
,若使用 7.6 之后的版本,将无法实现 SonarQube 与 GitLab 协作(除非使用付费版) -
GitLab 与 GitLab-Runner 的版本要考虑兼容性,否则会出现 GitLab-Runner 无法连接至 GitLab 的问题
三、安装与配置
本节将描述上述组件安装与配置的详细步骤。其中,安装方式主要有本地安装和基于 Docker 安装,因此在安装前需确保宿主机已经具备 Docker 和 Docker Compose 的环境。
3.1 SonarQube
3.1.1 SonarQube 安装
使用 Docker Compose 安装 SonarQube 很简单,只需以下几个步骤:
-
在任意位置创建安装目录
sonar
,如/usr/local/sonar
-
在安装目录下创建
docker-compose.yml
文件,文件内容如下:
version: '2.1'
services:
# 使用 PostgreSQL 作为 SonarQube 的持久化方案
# 注:由于 SonarQube 7.9 及之后的版本不支持 MySQL,因此 MySQL 不作为考虑对象
postgres:
image: postgres:12
container_name: sonarqube_postgres
privileged: true
ports:
- "5432:5432"
networks:
- sonarnet
restart: always
# 将 PostgreSQL 数据文件存放至宿主机
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
POSTGRES_DB: sonar
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
sonarqube:
image: sonarqube:6.7
container_name: sonarqube
privileged: true
ports:
- "9000:9000"
restart: always
networks:
- sonarnet
depends_on:
- postgres
# 将 SonarQube 日志文件、数据文件、配置文件、扩展插件存放至宿主机
volumes:
- ./data:/opt/sonarqube/data
- ./extensions:/opt/sonarqube/extensions
- ./logs:/opt/sonarqube/logs
- ./conf:/opt/sonarqube/conf
# 配置 SonarQube 的数据源,本例为 PostgreSQL
environment:
SONARQUBE_JDBC_USERNAME: sonar
SONARQUBE_JDBC_PASSWORD: sonar
SONARQUBE_JDBC_URL: jdbc:postgresql://postgres:5432/sonar?useUnicode=true&characterEncoding=utf8
# 由于 SonarQube 内部会启动 ElasticSearch,因此需要此配置
ulimits:
nproc: 65535
nofile:
soft: 65536
hard: