sonarJenkins-构建代码质量自动化分析平台

3次阅读

共计 6517 个字符,预计需要花费 17 分钟才能阅读完成。

1.Sonar 介绍

Sonar 是一个用于管理代码质量的开源工具,可以分析代码中的 bug 和漏洞以及 Code Smells,支持 20 多种编程语言的检测,如 java,c/c++,python,php 等语言,当前有超过 85000 家组织在使用 sonar。Sonar 可以与 DevOps 工具链完全整合,可以与大多数构建工具进行内置集成,与 Jenkins,TFS / VSTS,TeamCity,Bamboo 等持续整合引擎轻松集成,支持众多源代码管理配置工具,如 git,svn,cvs 等。

官方地址:https://www.sonarqube.org/

早在 2007 年,当创建第一行代码时,Sonar 的创始人就梦想有一天能够为每个开发人员提供测量其项目代码质量的能力。他的座右铭:“持续检测必须成为持续整合的主流”。

本文的目的就是安装一个 sonar,并集成到 Jenkins 中,实现代码的一个持续质量监测。

2.Sonar 安装

2.1. 安装环境介绍

注意:sonar 服务器至少需要 2G 的内存才能有效运行,而操作系统则需要 1GB 的可用内存。

  • Centos 7.2
  • 安装 JDK 1.8
  • 安装 Jenkins 2.89
  • 安装 maven 3.5.2(非必需,用于编译一些插件)
  • mysql 5.6 数据库(要求版本,不低于 5.6)

安装完 mysql 后创建 sonar 数据库和账号,方式如下:

CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

2.2.SonarQube 安装

cd /data/package/
wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.6.zip
mkdir /data/service/sonar/
unzip sonarqube-6.6.zip -d /data/service/sonar/

配置启动脚本:

[root@c7-node1 ~]# cat /etc/init.d/sonar
#!/bin/sh
#
# rc file for SonarQube
#
# chkconfig: 345 96 10
# description: SonarQube system (www.sonarsource.org)
#
### BEGIN INIT INFO
# Provides: sonar
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: SonarQube system (www.sonarsource.org)
# Description: SonarQube system (www.sonarsource.org)
### END INIT INFO
/usr/bin/sonar $*

授权启动脚本执行权限,并配置路径

chmod +x /etc/init.d/sonar
ln -s /data/service/sonar/sonarqube-6.6/bin/linux-x86-64/sonar.sh /usr/bin/sonar
chkconfig sonar on

修改配置文件

[root@c7-node1 ~]# cd /data/service/sonar/sonarqube-6.6/conf/
[root@c7-node1 conf]# cp sonar.properties{,.bak}
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

2.3.sonarQube Scanner 安装

cd /data/package/
wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.8.zip
unzip sonar-scanner-2.8.zip -d /data/service/sonar/
ln -s /data/service/sonar/sonar-scanner-2.8/bin/sonar-scanner /usr/bin/sonar-scanner

修改配置文件

[root@c7-node1 ~]# cd /data/service/sonar/sonar-scanner-2.8/conf/
[root@c7-node1 conf]# cp sonar-scanner.properties{,.bak}
[root@c7-node1 conf]# vim sonar-scanner.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8

2.4.sonarQube runner 安装

cd /data/service/
wget http://repo1.maven.org/maven2/org/codehaus/sonar/runner/sonar-runner-dist/2.4/sonar-runner-dist-2.4.zip
unzip sonar-runner-dist-2.4.zip -d /data/service/sonar/
ln -s /data/service/sonar/sonar-runner-2.4/bin/sonar-runner /usr/bin/sonar-runner

修改配置文件

[root@c7-node1 ~]# cd /data/service/sonar/sonar-runner-2.4/conf/
[root@c7-node1 conf]# cp sonar-runner.properties{,.bak}
[root@c7-node1 conf]# vim sonar-runner.properties
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.username=sonar
sonar.jdbc.password=123456

添加环境变量

[root@c7-node1 ~]# vim /etc/profile.d/sonar.sh
export SONAR_HOME=/data/service/sonar/sonarqube-6.6
export SONAR_RUNNER_HOME=/data/service/sonar/sonar-runner-2.4
export PATH=$SONAR_RUNNER_HOME/bin:$PATH
[root@c7-node1 ~]# source /etc/profile.d/sonar.sh

2.5. 启动 sonar

注意:sonar 默认不允许使用 root 用户启动,所以我们需要创建 sonar 用户,并以 sonar 用户启动

[root@c7-node1 ~]# useradd sonar
[root@c7-node1 ~]# chown -R sonar:sonar /data/service/sonar/
[root@c7-node1 ~]# su sonar
[sonar@c7-node1 root]$ /etc/init.d/sonar start

sonar 启动成功后,访问服务器的 9000 端口即可打开 sonar 的 web 界面,默认账号和密码为 admin:admin 注意:sonar 默认不允许使用 root 用户启动,所以我们需要创建 sonar 用户,并以 sonar 用户启动。

出现如下页面说明 sonar 安装成功,如果 sonar 安装失败,则根据日志报错内容进行排查即可。

3.Sonar 插件使用及汉化

Sonar 可以通过安装插件的方式来扩展自己的功能,具体信息可以访问 sonar 的插件库,里面提供了众多代码分析插件,认证授权插件,外部分析插件,语言插件,可视化/报告插件等。下面我们就通过安装 sonar 等中文插件来演示 sonar 插件的安装。

sonar 的插件库:https://docs.sonarqube.org/di…

3.1. 后台安装中文插件
登陆 sonar 后,在 Administration–>System–>Update Center–>Available 中搜索 Chinese 就可以看到中文插件包,点击 install 即可安装。但是安装时间非常慢,甚至还会失败,建议还是手动安装。

3.2. 手动安装插件

中文插件 github 地址:https://github.com/SonarQubeC…
我们把中文插件源码下载到我们本地,并且切换到相应的版本(我安装的 sonar6.6 版本,需要切换到 1.18tag),进行编译

git clone https://github.com/SonarQubeCommunity/sonar-l10n-zh.git
cd sonar-l10n-zh/
git checkout sonar-l10n-zh-plugin-1.18
mvn package
cp target/sonar-l10n-zh-plugin-1.18-SNAPSHOT.jar /data/service/sonar/sonarqube-6.6/extensions/plugins/

复制中文插件到 sonar 插件目录后,重启 sonar 生效
重启 sonar 后,访问 web 验证效果,可以看到汉化成功了

这样我们的中文插件就完成安装了,如果需要安装其它的插件,可以直接访问官方插件库进行寻找安装。

4.Sonar 分析 Python 代码小例

Sonar 安装汉化完成就可以用来实际的分析代码了,我准备了一个分析 python 代码的小例子用来演示 sonar 分析代码过程。

例:我的 python 项目是使用 3.0 版本开发,但是使用了 2.0 的语法,我们试试 sonar 能不能分析出来(sonar 内置了 python 3.0 分析插件,我们无须额外安装)。演示脚本就一个,功能为发送邮件,其中的 print 为 2.0 语法,在 3.0 环境下是无法正常运行的,我们通过分析这个脚本,来演示 sonar 的分析代码过程。

[sonar@c7-node1 ~]$ cat python_test/sendEmail.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 第三方 SMTP 服务
mail_host="xxx" #设置服务器
mail_user="xxx" #用户名
mail_pass="xxx" #口令


sender = 'bigdata_monitor@xueleyun.com'
receivers = sys.argv[1]

content=sys.argv[3]
message = MIMEText(content, 'plain', 'utf-8')

message['From'] = Header(sender, 'utf-8')
message['To'] = Header(receivers, 'utf-8')

subject = sys.argv[2]
message['Subject'] = Header(subject, 'utf-8')


try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print "邮件发送成功"
except smtplib.SMTPException:
print "Error: 无法发送邮件"

在项目根目录下创建一个配置文件 sonar-project.properties,项目如果在 sonar 中没有创建,首次分析会自动根据填入到配置文件的名称和 key 自动创建

[sonar@c7-node1 ~]$ cat python_test/sonar-project.properties
sonar.projectKey=python_test
sonar.projectName=python_test
sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=UTF-8

在项目根目录下运行下面的命令启动分析

sonar-scanner

扫描完成之后,我们再次打开 web 页面就可以看到,我们的 sonar 根据配置文件填入的内容自动创建了 python_test 的项目,并且分析出来了两个 bug

点击项目名称,可以进入到项目,查看项目的详细分析信息

点击 bugs,可以看到具体的 bug 信息,我们可以看到 bug 的信息为 python print 语句有问题

sonar 不仅可以找到 bug,而且还会告诉我们我们这样为什么错误,还会给出正确示例子;

查看 bug 具体信息:说 print 语句在 python3.0 中被删除。应该使用内置函数,并且给出了正确实例。

5.Sonar 集成 Jenkins 使用
5.1. 设置 sonar 中的令牌
用 admin 用户登陆 sonarQube,【配置】–>【权限】–>【用户】

5.2.Jenkins 安装 sonar 相关插件
安装红框中的两个插件即可

5.3.Jenkins 配置 sonar 插件

点击【系统管理】–>【系统设置】配置 Sonar 认证信息,设置完保存

点击【系统管理】–>【全局工具配置】,配置 sonar 扫描器信息

5.4.Jenkins job 中配置 sonar

为了操作方便我这里就不把刚才的代码放到 git 中进行拉取了,而且直接配置工作目录为刚才的 python_test 目录,生产环境你可以根据公司实际情况,选择是从 svn 或者 git 获取需要分析的代码

增加一个构建步骤,选择 Execute SonarQube Scanner,选择一个用于分析的 jdk,并填入 Analysis properties 为刚才手动扫描的 sonar-project.properties 配置文件即可

这样我们 Jenkins 中 sonar 的部分就配置完了,我们可以保存 job 进行构建,构建完成,可以通过构建历史,直接跳转到 sonar 到分析页面,如下图所示,并附 Jenkins job 完整内容及构建视频。

6. 后记

本文到这里就结束了,虽然 sonar 的一些内容,比如项目管理,安全,监控,邮件通知等内容文章中并没有提及,但我认为汉化后的 sonar 管理还是比较方便易操作的,这里大家可以自己登录到后台进行摸索。
还有就是 sonar+Jenkins 的这个 job 并不是很全面,缺少代码自动获取和发布的配置,但是 sonar 的配置还是正确的,你只需要把他加入到你代码获取后的第一个操作,或者编译之前的操作均可。

文章系作者原创投稿。作者:西门飞冰,一名 90 后 it 男,一直在北京工作,热爱运动,热爱冒险,热爱旅行。

正文完
 0