sonar搭建及使用

版权声明:本文为博主原创文章,如需转载请注明出处 https://blog.csdn.net/linghuanxu/article/details/88937825

概述

由于要对公司团队的代码进行质量分析,决定先用sonar扫一遍,查出面上的问题,再详细深究。所以,这里记录的就是如何搭建sonar及进行代码扫描的操作。

下载

这种东西还是观望下载靠谱https://www.sonarqube.org/ 下载了6.7.4的,这是目前的稳定版,公司用嘛,还是稳定版靠谱。

准备工作

在官网上的requirements中看到的东西,列到下面,附加如何操作。

jdk版本

仅支持1.8的,1.7和1.9都不可以。

数据库支持

因为我这里之用mysql,我就只写mysql了。仅支持5.6和5.7版本的。

浏览器支持

基本来说是,ie需要用11,别的都是最新的,opera没有测试

linux

不可以使用root账号运行

useradd sonar
  应该是不需要登录的,我们就不设置用户名密码了。

vm.max_map_count需要大于等于262144

这个参数的意思是一个进程最多可用于的内存映射区(memory map areas),大部分程序使用数量不会超过1000,默认值65536。
  sysctl -w vm.max_map_count=262144 即可修改成功,但是,重启后将会被置回。想要永久修改的话,在/etc/sysctl.conf文件最后添加一行vm.max_map_count=262144。但是要重启后才生效。不过既然当前的已经修改了,那就无所谓了。所以,两个一起改,妥妥哒。

fs.file-max需要大于等于65536

file-max是设置 系统所有进程一共可以打开的文件数量 。
  sysctl -w fs.file-max=65536 这是临时设置。
  /etc/sysctl.conf中加入fs.file-max = 65536 重启生效,永久有效。

用户运行SonarQube可以打开最少65536个文件描述符,最大打开线程数大于2048

临时生效的命令如下:

ulimit -n 65536
ulimit -u 2048

永久生效是在文件/etc/security/limits.conf中添加如下代码:

*   soft   nofile   65536
*   hard   nofile   65536
*   soft   nproc    2048
*   soft   nproc    2048

安装

首先下载,解压文件,我这里是解压到了/opt目录。然后我们主要是配置conf文件夹下的sonar.properties文件。

数据库配置

这里就是配置数据库的用户名、密码及数据库连接,如下:

sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://172.16.2.239:3306/sonar-235?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

web服务器配置

这里主要是配置可以访问的ip、端口以及根路径:

sonar.web.host=0.0.0.0
sonar.web.context=/
sonar.web.port=9000

启动

然后就是,将整个sonar的文件夹的权限赋给sonar,然后在bin文件夹里找到对应的系统,执行

sh start.sh start

嗯,没错,然后就报错了。我在logs文件夹的es.log文件中看到如下错误:

2018.06.01 17:24:43 WARN  es[][o.e.b.JNANatives] unable to install syscall filter:
java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
        at org.elasticsearch.bootstrap.SystemCallFilter.linuxImpl(SystemCallFilter.java:364) ~[elasticsearch-5.6.3.jar:5.6.3]
        at org.elasticsearch.bootstrap.SystemCallFilter.init(SystemCallFilter.java:639) ~[elasticsearch-5.6.3.jar:5.6.3]
        at org.elasticsearch.bootstrap.JNANatives.tryInstallSystemCallFilter(JNANatives.java:258) [elasticsearch-5.6.3.jar:5.6.3]
        at org.elasticsearch.bootstrap.Natives.tryInstallSystemCallFilter(Natives.java:113) [elasticsearch-5.6.3.jar:5.6.3]
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:111) [elasticsearch-5.6.3.jar:5.6.3]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:195) [elasticsearch-5.6.3.jar:5.6.3]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) [elasticsearch-5.6.3.jar:5.6.3]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) [elasticsearch-5.6.3.jar:5.6.3]

查了一下,在官网的requirement里面其实是有写的。默认的Elasticsearch是使用了seccomp filter的。而我用的centos6是没有这个功能的。可以在sonar.properties文件中通过配置sonar.search.javaAdditionalOpts属性,如下:

sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false

官网还给出了如何查看是否支持该功能的方法,执行如下命令:

grep SECCOMP /boot/config-$(uname -r)

如果看到下面的内容,就是可以的:

CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP_FILTER=y
CONFIG_SECCOMP=y

再启动,就可以访问了http://{ipaddress}:9000 默认的用户名密码是:admin/admin

分析项目

进入平台之后会直接提示你开始自己的分析。第一步就是新建一个token,会让你输入token的名字。然后会给你一个token的密文,这个是用来表示你有权限使用平台进行分析用的,下一步就是选择你项目的类型,然后就会给你提交分析的命令了。我的命令如下:

mvn sonar:sonar -Dsonar.host.url=http://172.16.2.235:9000 -Dsonar.login=35e8b75e5cd966097e691cfee461eb19ed78eefa

嗯,没错,我们又报错了。maven的报错信息还是比较长的,主要如下:

Failed to upload report - 500: An error has occurred

这样看来是上传报告的时候报错了,也就是分析完成了。去服务器上看看有没有相应的报错日志,在web.log中发现如下报错:

Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (6291276 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
        at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3678)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2509)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
        at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
        at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
        at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
        at org.sonar.db.ce.CeTaskInputDao.insert(CeTaskInputDao.java:53)
        ... 45 common frames omitted

好像是说mysql中查询的包过大了,还真是什么懒都偷不得,在官网的安装文档中有看到相关的配置。在mysql配置文件中添加如下配置:

innodb_buffer_pool_size=2GB
query_cache_size =15MB
max_allowed_packet=100MB

然后,最关键的一步来啦,重启sonar。嗯,就是这样,在提交分析就成功了。

猜你喜欢

转载自blog.csdn.net/linghuanxu/article/details/88937825
今日推荐