跳到主要内容

SonarQube安装与多分支扫描分析插件安装

1. 前言

SonarQube是一个开源的代码质量管理平台,提供了代码质量管理的各种功能,例如静态检查、代码度量、代码审查等等。

作为一个开源的开发者,对自己写的开源项目还是很有必要进行扫描一下,没有人能保证他写出没有bug 的程序,但是通过一些工具可以降低我们写bug的概率。

2. SonarQube的安装

你可以直接去SonarQube的官网查看安装文档,上面写的还是非常详细的。

链接:https://docs.sonarqube.org/latest/setup-and-upgrade/install-the-server/

2.1 安装环境

这里使用的安装环境是:centos7 + docker

使用数据库为:PostgreSQL

SonarQube所支持的数据库有:Oracle, Microsoft SQL Server,所以如果你的DB不是PostgreSQL也没关系。

2.2 创建SonarQube对应的文件夹

mkdir /dockerData/sonarqube/sonarqube_data
mkdir /dockerData/sonarqube/sonarqube_extensions
mkdir /dockerData/sonarqube/sonarqube_logs

这里创建的三个文件夹是用来放置SonarQube之后会存放的数据和插件以及日志,在SonarQube的官网安装教程中更加推荐我们使用docker volume create 的方式,这是因为 volume 存储在 Docker Host 文件系统的一个路径下,这个路径是由 Docker 来进行管理,路径默认是 /var/lib/docker/volumes/,非 Docker 的进程不能去修改这个路径下面的文件,所以说 Volumes 是持久存储数据最好的一种方式。

相关知识:Docker 数据存储

这里为了方便我们之后安装插件,所以没有采取这种方式的安装。

2.3 拉取镜像

docker run -d --name sonarqube \
-p 9000:9000 \
-e SONAR_JDBC_URL=jdbc:postgresql://ip:port/sonarqube?currentSchema=sonar_schema \
-e SONAR_JDBC_USERNAME=postgresql \
-e SONAR_JDBC_PASSWORD=password \
-v /dockerData/sonarqube/sonarqube_data:/opt/sonarqube/data \
-v /dockerData/sonarqube/sonarqube_extensions:/opt/sonarqube/extensions \
-v /dockerData/sonarqube/sonarqube_logs:/opt/sonarqube/logs \
sonarqube:9.9.0-community

在这个命令当中,我们指定了容器的启动的端口,和SonarQube连接DB的地址,可以根据你使用的DB进行调整。最后通过-v 命令挂载了服务器的目录到docker容器当中

启动完成之后,使用你的ip:端口 进行访问,应该有这样的界面。帐号名和密码都是admin,第一次登录之后便会要求你更改密码。

如果你的SonarQube启动失败,可以通过docker logs sonarqube 查看错误日志,一般情况下主要的原因有:

  • 连接DB失败:检查用户名和密码,或者防火墙
  • sonarqube写入文件没有权限:因为我们是通过挂载文件夹的形式,sonarqube会对dockerData/sonarqube/下进行写入文件,需要检查sonarqube是否有足够的权限

3. 对一个SpringBoot项目进行扫描

这里我们用一个简单的SpringBoot例子进行试试,你可以在github中找到:https://github.com/MingGH/demo-springboot-simple

或者直接使用你自己的项目也可以。

回到SonarQube,点击右上角的Create Project创建项目,一般来说,使用项目名就好

点击Set Up

SonarQube提供了多种方式进行触发扫描,这里我们选择Locally

创建一个token,并设置过期时间

因为这个项目使用的maven,所以我这里便选择了maven进行本地触发扫描。

复制生成的这一段命令,到我们本地项目目录下进行执行

执行完成之后,网页便会自动刷新,如:

如果代码中存在问题,那么在Bugs,Vulnerabilities,Security Hotspots中可以点进去查看详细的信息。

4. 安装多分支扫描分析插件

在SonarQube社区版中,是只能有一个分支被扫描的,需要通过插件的形式来扩展这部分功能

4.1 安装插件

插件地址:https://github.com/mc1arke/sonarqube-community-branch-plugin

打开插件地址,需要注意的是,不同的SonarQube版本使用的插件版本也不一样,在上面我们安装的SonarQube为9.9.0,所以下载的插件版本应该是1.14.0

其实这个插件还提供了自带插件版本的SonarQube。

下载完插件之后,上传到服务器的/dockerData/sonarqube/sonarqube_extensions/plugins 目录下,如果plugins 目录不存在可以自己手动创建,注意不要在/dockerData/sonarqube/sonarqube_extensions/download 目录下和plugins 都放置插件的jar文件,会导致SonarQube启动失败。

此时重启SonarQube应该就是可以了。

在回到项目中,可以通过增加 -Dsonar.branch.name 参数来对不同分支的代码进行扫描

mvn clean verify sonar:sonar \
-Dsonar.projectKey=projectKey \
-Dsonar.host.url=url \
-Dsonar.login=token \
-Dsonar.branch.name=develop

执行完成之后在 SonarQube对应项目的界面上就能看到,有了不同分支的切换

但是事情可能并不会那么顺利,在两次安装这个插件完成后再去使用不同分支扫描我都碰到了同一个问题:Current edition does not support branch feature

4.2 Current edition does not support branch feature问题的解决

这个问题的解决办法在github也已经有了对应的issues可以参考:https://github.com/mc1arke/sonarqube-community-branch-plugin/issues/663

他的做法是重新起一个sonar的容器,并且更新环境变量。但是并不是很想新起新的容器,感觉比较麻烦,所以我的做法是进入容器内部,直接修改配置文件,然后重启sonar。

事实证明这个方法是可行的,

进入容器

docker exec -it sonarqube /bin/bash

找到了/conf 目录下的sonar.properties文件,然后进行了修改

修改配置如下:

sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.12.0.jar=web
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.12.0.jar=ce

在修改的时候发生了一些意外,导致容器启动失败,可以通过如下命令复制文件进容器

docker cp sonar.properties sonarqube:/opt/sonarqube/conf/sonar.properties

通过如下命令从容器复制文件出来

docker cp sonarqube:/opt/sonarqube/conf ./