介绍
SonarQube 是一开源的代码分析平台,用来持续分析和评测代码质量,支持检测N多种语音,Java、JS、C、C++等。通过SonarQube可检测项目中潜在的Bug、漏洞、代码规范、重复代码、缺乏单元测试的代码等问题,提供UI界面查看和管理。
架构:
SonarQube 构成:
- SonarQube Server
主要3个进程:
Web server提供UI
Search server是基于Elasticsearch搜索服务
Compute Engine Server 计算引擎服务,进行代码分析并保存到SonarQube 数据库 - SonarQube Database
存储SonarQube 实例配置信息,项目、视图等快照 - SonarQube Scanners
分析项目代码 - SonarQube Plugins
SonarQube 插件管理
环境
JDK8(安装略)
Mysql5.6(安装、创建库和新建用户等略)
SonarQube Server 7.2,如用最新版,JDK要求11,各种坑
Sonar-scanner 3.0
Jenkins2.15以上,版本低,集成SonarQube servers时各种坑
部署SonarQube server
1).下载SonarQube ,下载社区版,地址: https://www.sonarqube.org/downloads/
2).安装SonarQube
下载好,解压至/usr/local目录:/usr/local/sonarqube-7.2.1/bin/linux-x86-64
3).配置修改
修改SonarQube的MySQL连接信息。
由于默认SonarQube web端口为9000, elasticsearch端口9001,安装SonarQube服务器这两个端口已用,所以更改默认端口。
修改conf/sonar.properties文件,调整如下信息
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=sonar_user
sonar.jdbc.password=p@ssword1
sonar.sorceEncoding=UTF-8
sonar.web.port=9005
sonar.search.port=9006
4).SonarQube汉化
下载SonarQube汉化插件,链接:https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.10 将插件拷贝到项目sonarqube-7.2.1目录./extensions/plugins下,重启sonar服务生效。
5).启动SonarQube服务
进入安装目录:/usr/local/sonarqube-7.2.1/bin/linux-x86-64
注意:更改/usr/local/sonarqube-7.2.1目录所属用户,因目录下的elasticsearch服务不能用root启动。
cd /usr/local/sonarqube-7.2.1/bin/linux-x86-64
sh sonar.sh start
## 启动log查看
--> Wrapper Started as Daemon
Launching a JVM...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
2019.07.16 18:38:14 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /usr/local/sonarqube-7.2.1/temp
2019.07.16 18:38:14 INFO app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9006
2019.07.16 18:38:15 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [/usr/local/sonarqube-7.2.1/elasticsearch]: /usr/local/sonarqube-7.2.1/elasticsearch/bin/elasticsearch -Epath.conf=/usr/local/sonarqube-7.2.1/temp/conf/es
2019.07.16 18:38:15 INFO app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running
2019.07.16 18:38:15 INFO app[][o.e.p.PluginsService] no modules loaded
2019.07.16 18:38:15 INFO app[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
2019.07.16 18:38:21 INFO app[][o.s.a.SchedulerImpl] Process[es] is up
2019.07.16 18:38:21 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='web', ipcIndex=2, logFilenamePrefix=web]] from [/usr/local/sonarqube-7.2.1]: /usr/java/jd
k1.8.0_25/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/usr/local/sonarqube-7.2.1/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -c
p ./lib/common/*:/usr/local/sonarqube-7.2.1/lib/jdbc/mysql/mysql-connector-java-5.1.46.jar org.sonar.server.app.WebServer /usr/local/sonarqube-7.2.1/temp/sq-process2544415
354422955674properties
2019.07.16 18:38:51 INFO app[][o.s.a.SchedulerImpl] Process[web] is up
2019.07.16 18:38:51 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='ce', ipcIndex=3, logFilenamePrefix=ce]] from [/usr/local/sonarqube-7.2.1]: /usr/java/jdk1
.8.0_25/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/usr/local/sonarqube-7.2.1/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -cp
./lib/common/*:/usr/local/sonarqube-7.2.1/lib/jdbc/mysql/mysql-connector-java-5.1.46.jar org.sonar.ce.app.CeServer /usr/local/sonarqube-7.2.1/temp/sq-process63974425157314
53678properties
2019.07.16 18:38:55 INFO app[][o.s.a.SchedulerImpl] Process[ce] is up
2019.07.16 18:38:55 INFO app[][o.s.a.SchedulerImpl] SonarQube is up
6).Web访问SonarQube
这里web前端配置Nginx访问,Nginx配置:
# HTTPS server
server {
listen 443;
server_name sonar.abc.com;
#root /home/git/gitlab/public;
access_log /data/logs/sonar-nginx_access-ssl.log;
error_log /data/logs/sonar-nginx_error-ssl.log;
client_max_body_size 128m;
ssl on;
ssl_certificate /data/certs/alaxiaoyou.com.chain.crt;
ssl_certificate_key /data/certs/alaxiaoyou.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:9005;
}
}
访问https://sonar.alaxiaoyou.com/,输入默认用户名密码:admin/admin,密码可更改。首次登录进去后记录好Token,后面Jenkins配置会用到。
部署SonarQube Scanners
下载地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
将SonarQube Scanner包安装到Jenkins所在服务器,接下来Jenkins上配置需用Scanner安装目录。
[root@alxy-zabbix-srv sonar-scanner-3.0.3.778-linux]# ll
total 16
drwxr-xr-x 2 jenkins jenkins 4096 May 12 2017 bin
drwxr-xr-x 2 jenkins jenkins 4096 Jul 19 14:54 conf
drwxr-xr-x 4 jenkins jenkins 4096 Jul 18 18:54 jre
drwxr-xr-x 2 jenkins jenkins 4096 Jul 18 18:54 lib
Jenkins集成SonarQube
1). Jenkins 与 SonarQube 集成插件安装
Jenkins -> 系统管理 -> 管理插件,选择安装SonarQube Scanner for Jenkins
2). Jenkins -> 系统管理 -> 系统设置,配置SonarQube Server信息
上面Name随便填写,一般按SonarQube版本来命名,方便识别。Server Url可配置成SonarQube的ip+9005端口或域名。SonarQube在5.3版本后,不在通过用户和密码方式登录,通过配置token的方式,Jenkins将构建结果通过URL和token发送给SonarQube 。上面的Token信息,可在安装后首次登录SonarQube Server时获得。或者在SonarQube web查看,如下:
3). Jenkins -> 系统管理 -> 全局工具配置,配置SonarQube Server和Maven
4). 创建Jenkins项目,在项目构建过程加入SonarScanner进行代码分析
新建一个Jenkins项目,选择构建一个maven项目,项目是java编写的。
配置Git代码仓库,并选择分支。
在【Build Environment】标签选择勾中“Prepare SonarQube environment”
在【Build】标签配置
在Post Steps增加构建步骤”Execute SonarQube Scanner“
Task to run:输入scan命令,分析代码。
Path to project properties:是可选择的,可指定一个sonar-project.properites文件,如果不指定则使用项目默认的properites文件。
Analysis properties:是输入一些配置参数传递给SonarQube,这参数优先级高于sonar-project.properites文件,所以这配置的参数可替代sonar-project.properites文件。sonar-project.properites文件可直接在项目根目录中创建sonar-project.properites文件。
Additional arguments:可输入附加参数,-X指进入SonarQube Scanner的Debug模式。
附上Java开发语言Analysis properties参数:
#Sonar项目标识,在SonarQube实例下必须唯一
sonar.projectKey=b2b-root-qa
#在SonarQube Web显示的项目名称
sonar.projectName=sonarScan-b2b-root-qa
#项目版本
sonar.projectVersion=1.1.0
#语言
sonar.language=java
#代码文件编码
sonar.sourceEncoding=UTF-8
#指定分析项目代码,指定java源文件和class
sonar.sources=${WORKSPACE}/b2b-app/src/main/java
sonar.java.binaries=${WORKSPACE}/b2b-app/target/classes
sonar.sources=${WORKSPACE}/b2b-admin/src/main/java
sonar.java.binaries=${WORKSPACE}/b2b-admin/target/classes
#排除不参与代码分析的文件或目录
sonar.exclusions=.git/**/*
配置文件sonar-project.properites示例:
#required metadata
#projectKey项目的唯一标识,不能重复
sonar.projectKey=ProjectName
sonar.projectName=ProjectName
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.modules=java-module,javascript-module,html-module,php-module
# Java module
java-module.sonar.projectName=Java Module
java-module.sonar.language=java
java-module.sonar.sources=.
java-module.sonar.projectBaseDir=src
sonar.binaries=classes
# JavaScript module
javascript-module.sonar.projectName=JavaScript Module
javascript-module.sonar.language=js
javascript-module.sonar.sources=js
javascript-module.sonar.projectBaseDir=webRoot
# Html module
html-module.sonar.projectName=Html Module
html-module.sonar.language=web
html-module.sonar.sources=pages
html-module.sonar.projectBaseDir=webRoot
# Php module
php-module.sonar.projectName=Php Module
php-module.sonar.projectVersion=1.1
php-module.sonar.sourceEncoding=UTF-8
php-module.sonar.language=php
php-module.sonar.sources=.
SonarQube查看项目代码分析结果
Jenkins构建成功后会显示
点击绿色【OK】按钮,或者点击【SonarQube】即可跳转到SonarQube Web页面查看