SonarQube 与 Jenkins 简介

SonarQub e 是一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题。同时,它提供了丰富的插件,支持多种语言的检测, 如 J ava、Python、Groovy、C、C++等几十种编程语言的检测。它主要的核心价值体现在如下几个方面:

SonarQube7.8 以上必须使用 java11, 不支持mysql

 

  1. 检查代码是否遵循编程标准:如命名规范,编写的规范等。
  2. 检查设计存在的潜在缺陷:SonarQube 通过插件 Findbugs、Checkstyle 等工具检测代码存在的缺陷。
  3. 检测代码的重复代码量:SonarQube 可 以展示项目中存在大量复制粘贴的代码。
  4. 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
  5. 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。

 

SonarQube 平台是由 4 个部分组成:

  1. SonarQube Server
  2. SonarQube Database
  3. SonarQube Plugins
  4. SonarQube Scanner

 

SonarQube 与 SonarQube-Scanner 的安装与配置

SonarQube

在 SonarQube 网,我们可以下载最新的 Sonar 安装包,本节以 Linux 系统为例,搭建 SonarQube 平台,解压到任意目录,如:unzip sonarqube5.6.zip。

SonarQube 自带了一个 H2 的数据库,当然为了获得更好的性能我们可以指定一个外部的数据库,在这里我们使用 MySQL 数据库。 先在 Mysql 数据库中建立一 个 Sonar 数据库,主要用于存放分析结果的数据,如 图 1 :

下载:

https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.8.zip

 创建sonar  MySQL 数据库

create database sonar 
grant all PRIVILEGES on sonar.* to sonar@'%' identified by '123456';
flush privileges;

 

进入解压的 SonarQueb 目录,在系统路径里面配好 path,配置如下:

#sonar profile
export      SONAR_HOME=/data/sonarqube-7.8
export      PATH=${SONAR_HOME}/bin:${PATH}

 

创建用户:

groupadd sonar
useradd -g sonar -s /sbin/nologin sonar
# 设置权限
chown sonar:sonar -R /data/sonarqube-7.8

 

修改配置文件 /data/sonarqube-7.8/conf/sonar.properties,如下:

主要修改3个参数

sonar.jdbc.username
sonar.jdbc.password
sonar.jdbc.url

...
# User credentials.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
#sonar.jdbc.username=
#sonar.jdbc.password=
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
#----- Embedded Database (default)
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092
#----- DEPRECATED
#----- MySQL >=5.6 && <8.0
# Support of MySQL is dropped in Data Center Editions and deprecated in all other editions
# Only InnoDB storage engine is supported (not myISAM).
# Only the bundled driver is supported. It can not be changed.
#sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.url=jdbc:mysql://172.16.230.84:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
...

 

启动:

# 切换到sonar用户
# su -s /bin/bash - sonar
$ cd /data/sonarqube-7.8/bin/linux-x86-64
$ ./sonar.sh console

 

其中有输出一个报错

system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

 

解决办法

 1. 修改sonar配置 /data/sonarqube-7,8/conf/sonar.properties

# Same as previous property, but allows to not repeat all other settings like -Xmx
#sonar.search.javaAdditionalOpts=
sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false  

2.修改 /data/sonarqube-7.8/conf/wrapper.conf

#********************************************************************
# Wrapper Java
#********************************************************************
wrapper.java.additional.1=-Dsonar.wrapped=true -Dbootstrap.system_call_filter=false
wrapper.java.additional.2=-Djava.awt.headless=true

3. 修改 /data/sonarqube-7.8/elasticsearch/config/elasticsearch.yml

# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

 

再次启动

$ cd /data/sonarqube-7.8/bin/linux-x86-64
$ ./sonar.sh console

 

如果没有问题的话,关闭console方式启动,使用Ctrl+c
使用后台启动

$ cd /data/sonarqube--7.8/bin/linux-x86-64
$ ./sonar.sh start

 

点击登录

Jenkins  SonarQube  部署_Jenkins

 

 Jenkins  SonarQube  部署_Jenkins_02

 

 

Jenkins  SonarQube  部署_Jenkins_03

Jenkins  SonarQube  部署_Jenkins_04

 

 

 目前只要默认是8.4.1的中文插件, 需要到github 找对应的版本 

# 拷贝到插件目录
cp sonar-l10n-zh-plugin-1.28.jar /data/sonarqube-7.8/extensions/plugins
#重启sonar
./sonar.sh restart

 

 

 

Jenkins 与 SonarQube 集成插件的安装与配置

Jenkins 是一个支持自动化框架的服务器,我们这里不做详细介绍。Jenkins 提供了相关的插件,使得 SonarQube 可以很容易地集成。登陆 jenkins,点击”系统管理”,如图 4。

图 4. Jenkins 系统管理

Jenkins  SonarQube  部署_Jenkins_05

点击管理插件。

Jenkins 管理插件

Jenkins  SonarQube  部署_Jenkins_06

在可选插件中搜索”SonarQube”并安装它,如图 5。

图 5. Jenkins 安装 SonarQube 
Jenkins  SonarQube  部署_Jenkins_07

插件配置,登录 sonarqube 服务器

http://172.16.230.84:9000   点击右侧账号图标-->我的账号-->安全

输入 jenkins,点击生成。

 

Jenkins  SonarQube  部署_Jenkins_08

 

 Jenkins  SonarQube  部署_Jenkins_09

 

 

Jenkins  SonarQube  部署_Jenkins_10

 

 

 注意:这个输入框的字符串,可以随意。这里表示给jenkins使用的!切记要保存好!

 

创建jenkins token

点击 jenkins -->凭据 --> 系统 --> 全局凭据--> 添加凭据

Jenkins  SonarQube  部署_Jenkins_11

 

 

输入在sonarqube中生成的token

Jenkins  SonarQube  部署_Jenkins_12

 

 

配置 SonarQube Server

进入 Jenkins 系统管理 – 系统设置,配置 SonarQube Server 信息

由于 SonarQube 在本机运行,直接就是 http://localhost:9000

Jenkins  SonarQube  部署_Jenkins_13

 

 

 进入 Jenkins 系统管理 - Global Tool Configuration,配置 SonarQube Scanner

1. 下载安装

wget   https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.4.0.2170.zip

unzip  sonar-scanner-cli-4.4.0.2170.zip

mv  sonar-scanner-cli-4.4.0.2170   /data/

 

 

输入安装路径

Jenkins  SonarQube  部署_Jenkins_14

 

 

 

四、项目配置

java

使用构建后步骤进行代码分析需要使用 Maven 对代码进行编译,所以需要有 Maven 的配置文件,例如 pom.xml。

为新建的 Jenkins 项目配置构建后操作步骤,在构建后步骤配置窗口中需要填入 Maven 的构建配置 xml 文件

Jenkins  SonarQube  部署_Jenkins_15

 

 

配置构建后操作步骤

Jenkins  SonarQube  部署_Jenkins_16
sonar.projectKey=$JOB_NAME
sonar.projectName=$JOB_NAME
sonar.language=java
sonar.login=admin
sonar.password=admin
sonar.java.binaries=$WORKSPACE/smr-platform-service/smr-biz/target/classes
Jenkins  SonarQube  部署_Jenkins_16

 

Jenkins  SonarQube  部署_Jenkins_18

 

 

 注意:sonar.java.binaries 表示java的源码路径

 

参数解释:

Task to run 输入框中输入 scan,即分析代码;

Path to project properties:可选择的输入框,可以指定一个 sonar-project.properties 文件,如果不指定则使用项目默认的 properties 文件;

Analysis properties:输入一些配置参数传递给 SonarQube,这里的参数优先级高于 sonar-project.properties 文件里面的参数,所以可以在这里来配置所有的参数以替代 sonar-project.properties 文件

注:SonarQube Scanner配置可以直接在项目根目录中创建一个文件sonar-project.properties,然后使用Path to project properties中指定属性文件,或者直接在Analysis Properties中配置

Additional arguments:可以输入一些附加的参数,示例中的-X指进入 SonarQube Scanner 的 Debug 模式,输出更多的日志信息

 

查看分析结果

Jenkins  SonarQube  部署_Jenkins_19

 

 

登录到SonarQube,查看结果

Jenkins  SonarQube  部署_Jenkins_20

 

python

sonar.projectKey=$JOB_NAME
sonar.projectName=$JOB_NAME
sonar.language=python
sonar.login=admin
sonar.password=admin

 

Jenkins  SonarQube  部署_Jenkins_21

 

vue

Jenkins  SonarQube  部署_Jenkins_16
#projectKey项目的唯一标识,不能重复
sonar.projectKey=$JOB_NAME
sonar.projectName=$JOB_NAME
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.modules=javascript-module
sonar.login=admin
sonar.password=admin

# JavaScript module
javascript-module.sonar.projectName=JavaScript Module
javascript-module.sonar.language=js
javascript-module.sonar.sources=.
javascript-module.sonar.projectBaseDir=src
Jenkins  SonarQube  部署_Jenkins_16

 

Jenkins  SonarQube  部署_Jenkins_24

 

 报错处理办法: /data/sonarqube-7.8/temp/ 权限问题, chown -R  sonar.sonar   /data/sonarqube-7.8/temp/ *

Jenkins  SonarQube  部署_Jenkins_25

 

 

 

参考资源 

https://www.ibm.com/developerworks/cn/devops/1612_qusm_jenkins/index.html