安装Sonar
安装Docker环境
# 安装docker,docker 要求操作系统必须为64位,且centos内核版本为3.1及以上 $ uname -r 3.10.0-1062.el7.x86_6 # 保证yum包是最新,使用root执行,更新到最新 $ yum update # 列出可安装的docker包 $ yum list docker-ce --showduplicates | sort -r # 1.指定版本安装 $ yum list docker-ce.x86_64 --showduplicates | sort -r # 2.安装最新版 $ yum install docker-ce -y # 查看当前版本 $ docker version # 不能连接到`Docker daemon`异常 装完后使用docker命令后会提示异常 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? # 需要重启下docker $ service docker restart # 配置开机启动 $ systemctl enable docker
配置docker源,不配置下载较慢
找到
/etc/docker
目录下的daemon.json
文件进行编辑,输入如下内容{ "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"] }
如果没有该文件,可自行创建,也可以直接使用如下命令
tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"] } EOF
- 重启
docker
安装Postgres(SonarQube7.9以上版本已不再支持mysql)
$ docker pull postgres # 根据镜像创建容器,并命名mypostgres $ docker run --name mypostgres -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 postgres # 进入容器 $ docker exec -it mypostgres psql -U postgres -d postgres # 创建数据库,注意只需要执行语句create database sonar; postgres=# create database sonar; # 设置sonar用户名和密码 sonar postgres postgres=# create user sonar; postgres=# alter user sonar with password 'postgres'; # 给sonar授权 postgres=# alter role sonar createdb; postgres=# alter role sonar superuser; postgres=# alter role sonar createrole; # 更改sonar数据库拥有者(这一步是必须的,否则会sonarqube会连接失败) postgres=# alter database sonar owner to sonar; # 查看数据库 postgres=# \l # 查看用户 postgres=# \du exit # 重启数据库 $ systemctl start postgresql-11
安装SonarQube
点击下载sonar压缩包,下载
Community
版本# 请求root权限 $ su - # 创建目录并下载sonar压缩包 $ mkdir -p /opt/sonar $ cd /opt/sonar $ wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.0.43852.zip
解压sonar,并设置权限
# 安装zip命令 $ yum install unzip # 解压 $ unzip sonarqube-8.9.0.43852.zip # 创建sonar用户,必须sonar用于启动,否则报错 $ mv sonarqube-8.9.0.43852 sonarqube $ useradd sonar # 更改sonar目录及文件权限 $ chown -R sonar. /opt/sonar
更改sonar配置文件
$ su sonar $ vim /opt/sonar/sonarqube/conf/sonar.properties 内容如下: sonar.jdbc.username=sonar sonar.jdbc.password=postgres sonar.jdbc.url=jdbc:postgresql://47.92.230.43:5432/sonar
注意:sonar默认监听9000端口,如果9000端口被占用,需要更改。
下载JDK11
链接: https://pan.baidu.com/s/1LbqYzeC0xO1My9hS8rTHtw 提取码: 7hbw $ tar -zxvf jdk-11_linux-x64_bin.tar.gz $ cd jdk-11/bin $ pwd /opt/sonar/jdk-11/bin # 拿到上述jdk11的路径,配置到sonar中 # 修改sonarqube/conf/wrapper.conf中的java配置 vim /opt/sonar/sonarqube/conf/wrapper.conf 将 wrapper.java.command=java 改为 wrapper.java.command=/opt/sonar/jdk-11/bin/java # 修改环境变量,添加ES_HOME vim /etc/profile export ES_JAVA_HOME=/opt/sonar/jdk-11 source /etc/profile
启动sonar
$ cd /opt/sonar/sonarqube $ su sonar ./bin/linux-x86-64/sonar.sh start 启动 $ su sonar ./bin/linux-x86-64/sonar.sh status 查看状态 $ su sonar ./bin/linux-x86-64/sonar.sh stop 停止 $ tail -f logs/sonar.logs 查看日志 # 启动后报错 warning: no-jdk distributions that do not bundle a JDK are deprecated and will be removed in a future release Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch. bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] bootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] ERROR: Elasticsearch did not exit normally - check the logs at /opt/sonar/sonarqube/logs/sonarqube.log 2021.05.17 16:33:07 WARN app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 78 2021.05.17 16:33:07 INFO app[][o.s.a.SchedulerImpl] Process[es] is stopped 2021.05.17 16:33:07 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped 1. 编辑如下文件,加入如下内容 $ vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 2. 编辑如下文件,加入如下内容 vim /etc/sysctl.conf vm.max_map_count=655360 3. 执行如下命令,并退出当前用户重新登录 sysctl -p # 启动后继续报错 [es]: 143 2021.05.17 16:47:16 INFO app[][o.s.a.SchedulerImpl] Process[web] is stopped 2021.05.17 16:47:16 WARN app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 143 2021.05.17 16:47:16 INFO app[][o.s.a.SchedulerImpl] Process[es] is stopped 2021.05.17 16:47:16 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped # 查看下web.log日志,发现9000端口被占用 $ tail -222f /opt/sonar/sonarqube/logs/web.log # 查看端口占用程序 $ netstat -anp |grep 9000 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 9343/php-fpm: maste # kill掉这该死的进程后再次启动 $ kill -9 9343
浏览器访问
访问器防火墙开放9000的端口,阿里云服务器则在安全组配置即可
$ firewall-cmd --zone=public --add-port=9000/tcp --permanent $ firewall-cmd --reload
启动过程有点漫长,机器差的5分钟后访问该地址:http://192.168.2.195:9000/
- 创建sonar账号
默认账户:admin/admin
这里我改成admin123,token要记下来后面要使用
- 汉化
搜索插件Chinese Pack,安装后会提示重启服务!
- 获取token(后续会使用到)
f3a3e01c0eb286b110152a32f6766ddea4a66d72
jenkins集成sonar
- 安装SonarQube Scanner插件
- 添加SonarQube凭证
- Jenkins进行SonarQube配置
系统管理->系统配置->SonarQube servers
系统管理->全局工具配置->SonarQube Scanner
- SonaQube关闭审查结果上传到SCM功能
实现代码审查
在项目添加SonaQube代码审查配置文件
- 在Java代码中
src/main/resources
目录下新增sonar-project.properties
文件 sonar-project.properties
内容如下# must be unique in a given SonarQube instance sonar.projectKey=it235-sonar sonar.projectName=it235-sonar sonar.projectVersion=1.0 # modules #sonar.modules=order,goods sonar.sources=src/main/java sonar.tests=src/test/java sonar.version=1.0 sonar.language=java sonar.java.binaries=target/classes sonar.exclusions=**/test/**,**/target/** sonar.java.source=1.8 sonar.java.target=1.8 sonar.sourceEncoding=UTF-8
- 在jenkins的job中配置sonar执行器
配置好后,推送到远程仓库,构建打包,查看控制台日志是否有如下输出
- 在Java代码中
- 到SonarQube的UI界面查看审查结果
目前没有发现异常信息和Bug
- 改造代码,让其充满Bug后再次构建查看sonar报告
再次构建后查看sonar报告结果
总结
到这里,我们把sonarqube
给集成到了jenkins,非常强的检测工具,还有很多功能待大家去完善