2月
14
sonar介绍
sonar是一款开源的代码质量检查工具,基本支持所有流行的编程语言。平时我们自己做代码review费时费力而且对审查的人要求比较高,一般是资深开发人员进行审查,有了sonar后上万行代码片刻之间就可以完成review,事无巨细的给你指出代码中存在的问题还能指导你如何进行修复。在sonar中,问题分为三种,每种按照严重程度分为A-E五个级别,三种问题分别为:
- bug,sonar能识别出非运行时bug,比如空指针没处理等。
- Vulnerabilities(漏洞),存在的安全问题
- bad smell(坏代码),不规范的代码,这个可以帮助我们改正我们代码中的一些不良习惯。
以下是sonar检测完后的报告:

可以点击查看问题列表

点击问题,可以查看具体的代码行数和解决方案

本文分为两章,第一章节介绍如何安装,第二章节介绍如何使用。
安装
本次采用docker方式进行安装,sonar官方对镜像的维护还是蛮积极的,有非常多的版本提供选择,这里可以查看所有sonar镜像版本,本次安装采用默认lastst
版本。
环境信息设置
[root] sysctl -w vm.max_map_count=262144 sysctl -w fs.file-max=65536 ulimit -n 65536 ulimit -u 4096
安装sonar
第一次启动执行以下命令
docker run -d -p 9000:9000 sonarqube
sonarqube启动后通过docker ps
找到sonarqube的id
如果是在kubernetes环境下可能会找到两个,其中一个是基础POD,一般名称会有POD标识,另外一个就是sonarqube的容器。
docker ps|grep sonarqube f56314296567 0956756d5b96 "./bin/run.sh" 9 minutes ago Up 9 minutes k8s_infra-sonarqube_infra-sonarqube-774ccd77d4-llcg5_infra_ce2f53e3-4f08-11ea-9358-00163e103021_0 d885fcda6510 rancher/pause:3.1 "/pause" 9 minutes ago Up 9 minutes k8s_POD_infra-sonarqube-774ccd77d4-llcg5_infra_ce2f53e3-4f08-11ea-9358-00163e103021_0
f56314296567
就是sonarqube的容器id,获取到容器id后,本地创建相关目录并通过docker cp
命令将相关数据从容器中复制出来。
[root] mkdir -p /data/sonar/conf mkdir -p /data/sonar/logs mkdir -p /data/sonar/data mkdir -p /data/sonar/extensions chown -R 999:999 /data/sonar/ docker cp f56314296567:/opt/sonarqube/conf /data/sonar/ docker cp f56314296567:/opt/sonarqube/extensions /data/sonar/ ll /data/sonar/conf total 24 -rw-r--r-- 1 root root 20009 Dec 9 21:11 sonar.properties -rw-r--r-- 1 root root 3217 Dec 9 21:11 wrapper.conf
之所以要执行chown -R 999:999 /data/sonar/
命令,原因是如果不设置权限在启动的时候会报以下错误
2020-02-14 09:58:16,278 main ERROR Unable to create file /opt/sonarqube/logs/es.log java.io.IOException: Permission denied at java.base/java.io.UnixFileSystem.createFileExclusively(Native Method) at java.base/java.io.File.createNewFile(Unknown Source) at org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:628) at org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:608)
重启启动sonar
docker run -d \ -p 9000:9000 \ -v /data/sonar/conf:/opt/sonarqube/conf \ -v /data/sonar/extensions:/opt/sonarqube/extensions \ -v /data/sonar/logs:/opt/sonarqube/logs \ -v /data/sonar/data:/opt/sonarqube/data \ sonarqube
启动后可以访问http://ip:9000
访问系统,初始账号是admin/admin
。
更改数据库
sonar默认是使用内嵌的H2数据库,如果没有更改数据库会在页面下方出现一个警告提示更改数据库,H2仅用于测试不适合生产环境,在7.9版本以后,sonar不再支持mysql数据库,仅支持以下数据库:
- postgresql
- Microsoft SQL Server
- Oracle
- H2
本次以oracle为例,步骤如下
- 在oracle数据库中创建一个schema,创建语句可以参考以下:
create temporary tablespace sonartmp tempfile '/u01/oracle/11.2.0.4/oradata/definesys/sonartmp.DBF' size 100 m autoextend on next 100 m maxsize 4096m extent management local; create tablespace sonar logging datafile '/u01/oracle/11.2.0.4/oradata/definesys/sonar.DBF' size 1024 m autoextend on next 100 m maxsize 4096m extent management local; create user sonar identified by sonar default tablespace sonar temporary tablespace sonartmp; grant connect ,resource,create view,create trigger to sonar;
- 上传oracle jdbc驱动到extensions/jdbc-driver/oracle/目录下,如果做了映射就是映射目录下,本例中为
/data/sonar/extensions/jdbc-driver/oracle/
注意:sonar不支持ojdbc6的驱动,驱动版本需要>=ojdbc7,可以在这里下载到所有驱动。
- 修改/data/sonar/conf/sonar.properties配置文件,将以下注释打开
sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:oracle:thin:@172.16.81.1:1521:db
在实际操作中,有些版本的sonar并不生效,如果没有生效,可以加到docker的环境变量里重新启动,启动命令如下:
docker run -d \ -e sonar.jdbc.username=sonar \ -e sonar.jdbc.password=sonar \ -e sonar.jdbc.url=jdbc:oracle:thin:@172.16.81.1:1521:db \ -p 9000:9000 \ -v /data/sonar/conf:/opt/sonarqube/conf \ -v /data/sonar/extensions:/opt/sonarqube/extensions \ -v /data/sonar/logs:/opt/sonarqube/logs \ -v /data/sonar/data:/opt/sonarqube/data \ sonarqube
汉化
登录系统,在插件管理中找到汉化包直接安装

安装成功后重启即可生效

Address: https://zhengjianfeng.cn/?p=266
no comment untill now