介绍 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=.

项目构建 Console控制台查看构建日志

SonarQube查看项目代码分析结果 Jenkins构建成功后会显示 点击绿色【OK】按钮,或者点击【SonarQube】即可跳转到SonarQube Web页面查看