一、SonaQube 介绍
1、SonarQube 特性
多语言的平台: 支持超过20种编程语言,包括Java、Python、C#、C/C++、JavaScript等常用语言。
自定义规则: 用户可根据不同项目自定义Quality Profile以及Quality Gates。
丰富的插件: SonarQube 拥有丰富的插件,从而拥有强大的可扩展性。
持续集成: 通过对某项目的持续扫描,可以对该项目的代码质量做长期的把控,并且预防新增代码中的不严谨和冗余。
质量门: 在扫描代码后可以通过对“质量门”的比对判定此次“构建”的结果是否通过,质量门可以由用户定义,由多维度判定是否通过。
2、在项目中一般流程为:
(1) 项目人员开发代码。
(2) 将代码推送到持久化仓库,如 Git。
(3) Jenkins 进行代码拉取,然后利用 SonarQube 扫描器进行扫描分析代码信息。
(4) 将分析结果等信息上传至 SonarQube Server 服务器进行分类处理。
(5) SonarQube 将分析结果等信息持久化到数据库,如 Mysql。
(6) 开发人员访问 SonarQube UI 界面访问,查看扫描出的结果信息进行项目优化。
Jenkins 如何与 SonarQube 集成图分析
二、Linux 环境安装 SonaQube
这里用的是 sonarqube-7.6 的版本。官网提供的版本是 sonarqube-8.2 ,官网安装链接,或自定义版本 各版本选装链接
1、安装 SonarQube 前需要先安装 Mysql 数据库
这里是使用 Yum 安装 Mysql,版本 MySQL/5.7.27
yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm -y
yum install mysql-community-server -y
yum install mysql-community-devel -y
启动数据库
systemctl enable mysqld
systemctl start mysqld
修改数据库密码,授权用户连接登录
初始化前密码在此路径下
grep 'temporary password' /var/log/mysqld.log
修改 mysql root 密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
授权用户远程登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
刷新
flush privileges;
连接数据库,创建 sonar 数据库
mysql> create database sonar;
2、下载并配置 SonaQube
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.6.zip
unzip sonarqube-7.6.zip
mv sonarqube-7.6 /usr/local/sonar
useradd sonar 创建sonar用户,必须sonar用于启动,否则报错
chown -R sonar. /usr/local/sonar 更改sonar目录及文件权限
修改sonar配置文件
vim /usr/local/sonar/conf/sonar.properties
修改的内容如下:
sonar.jdbc.username=root
sonar.jdbc.password=123456
去掉注释
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
注意:sonar默认监听9000端口,如果9000端口被占用,需要更改。这里改为9900
sonar.web.port=9900
3、启动 SonaQube
cd /opt/sonar
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 查看日志
访问 SonaQube :http://localhost:9900,默认账户: admin/admin
添加 token
三、Jenkins 安装 SonaQube 插件和环境配置
1、安装SonarQube Scanner插件
2、添加新凭证
在 Jenkins 中添加新的凭证,类型为 Secret text,Secret 就是刚创建的 token 值
添加凭证的操作可参考:Jenkins使用手册-凭证管理
3、Jenkins进行SonarQube配置
Manage Jenkins -> Configure System -> SonarQube servers
名字可以随便命名,这里命名为:jenkins,名字后续会用到
Manage Jenkins -> Global Tool Configuration
选择自动安装,再选择安装的版本即可,,名字为:sonar-scanner ,后续会用到
4、SonaQube 关闭审查结果上传到SCM功能
四、项目添加 SonaQube 代码审查
审查的步骤:
SonaQube 代码审查 ,流水线项目或者非流水线项目
常用的项目类型可参考文档:Jenkins项目常用三种构建类型风格详解
(1)在项目添加 SonaQube 代码审查:(非流水线项目)
添加构建步骤 选择Execute SonaQube Scanner:
Analysis properties 代码片段
sonar.projectKey=demo_free_style_passwd
sonar.projectName=demo_free_style_passwd
sonar.projectVersion=1.0
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.source=1.8
sonar.java.target=1.8
sonar.sourceEncoding=UTF-8
构建完成后可看到对应的代码审查结果
(2)在项目添加 SonaQube 代码审查:(流水线项目)
1、项目根目录下,创建 sonar-project.properties 文件
# 项目在 SonarQube 的唯一标识,不能重复
sonar.projectKey=web_demo_Pipeline_key
# 项目名称
sonar.projectName=web_demo_Pipeline_key
# 项目版本
sonar.projectVersion=1.0
# 项目语言,例如 Java、C#、PHP 等
# sonar.language:
# 需要扫描的项目源代码目录,点代表是扫描根下面的全部,也可以指定目录“例如:/src”
sonar.sources=.
# 编译后 test下或target下 文件目录
sonar.exclusions=**/test/**,**/target/**
sonar.java.source=1.8
sonar.java.target=1.8
# sonar.sourceEncoding: 编码方式
sonar.sourceEncoding=UTF-8
2、修改Jenkinsfile,加入SonarQube代码审查阶段
脚本的路径在根下:
脚本的命令:
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'ed3147fc-c68b-418c-a479-15dd80710051', url: 'git@github.com:arosendeng/rosen-jenkins.git']]])
}
}
stage('build projeck') {
steps {
sh label: '', script: 'mvn clean package'
}
}
stage('SonarQube Code detection') {
steps{
script {
scannerHome = tool 'sonar-scanner'
}
withSonarQubeEnv('jenkins') {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
stage('push code') {
steps {
deploy adapters: [tomcat9(credentialsId: 'b1ca6678-8339-43bb-a0da-c3935c509dc2', path: '', url: 'http://192.168.66.102:8080/')], contextPath: null, war: 'target/*.war'
}
}
}
post {
always { //构建完成后邮件通知
emailext body: '${FILE,path="src/email.html"}', subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}', to: '123456@qq.com'
}
}
}
3、到SonarQube的UI界面查看审查结果
以上就是 SonaQube 代码审查 的操作,主要针对飞流水线和流水线的操作