一、前言
之前介绍过sonarqube环境的搭建,但是sonar运用是非常灵活的,可以实现CI所以本章着重讲解如何实现CI,以及在实现过程中遇到的问题
本章以Jenkins+Git+sonarqube+sonar-scanner来进行讲解
二、实现步骤
- 首先Jenkins环境必须要有,如果不知道的入门小白可参考搭建Jenkins环境的入门文章
https://blog.csdn.net/weixin_40686603/article/details/84654591
- 通过Jenkins 首页 系统管理—>插件管理—>搜索sonarqube-scanner下载安装完成并重启Jenkins
- 安装完成后sonar-scanner在服务器下的路径
/root/.jenkins/tools/hudson.plugins.sonar.SonarRunnerInstallation/sonarscanner
由于喜欢通过写脚本的方式实现,知道scanner存在位置很重要,记录一下
- 在scanner路径下找到conf目录打开sonar-scanner.properties文件,并添加下所示配置
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
#配置sonarqube服务端的连接地址及登录名密码
sonar.host.url=http://IP:9000
sonar.login=admin
sonar.password=admin
#配置sonar数据库的连接池
sonar.jdbc.username=sonar
sonar.jdbc.password=sonarpasswordsonar.jdbc.url=jdbc:mysql://IP:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
做这些配置是由于执行scanner脚本的时候,scanner会通过配置文件定义的连接池通过服务端地址发送get请求将数据写入至sonar数据库
- 然后创建项目,并进行如图所示的配置,实现git参数化配置
git parameter也是Git集成的插件,自行下载,在此不多做介绍了
6.配置shell脚本进行构建
脚本实现
#!/bin/bash
#刷新环境变量
source /etc/profile
#定义sonar-properties文件
sonarName=/data/sonar-project.properties
#定义sonar-scan路径
scanPath=/root/.jenkins/tools/hudson.plugins.sonar.SonarRunnerInstallation/sonarscanner/bin
#定义方法执行代码扫描
function excuteScript(){
cd $1 && mvn clean package
cp -r $sonarName $1
sed -i "s/sonar.projectName=/sonar.projectName=$2/g" $1/sonar-project.properties
sed -i "s/sonar.projectKey=/sonar.projectKey=$3/g" $1/sonar-project.properties
$scanPath/sonar-scanner
value=`echo $?`
if [ $value -eq 0 ];then
rm -rf $1/sonar-project.properties
fi
echo "脚本执行完成"
}
#执行方法
excuteScript $1 $2 $3
附上sonar-project.properties
#项目的key
sonar.projectKey=
#项目的名字(可以随便写,这个名字在sonar显示的)
sonar.projectName=
#项目的版本
sonar.projectVersion=1.0
#需要分析的源码的目录
sonar.sources=src/
#这是target
sonar.java.binaries=target/classes
#java语言
sonar.language=java
#编码格式
#sonar.sourceEncoding=UTF-8
7.执行构建
通过上述git parameter插件可实现git分支、tag参数化构建灵活性更高
8.构建完成后
三、实现逻辑
四、采坑须知
首先sonar-project.properties配置文件内容有几点要注意
1.sonar.projectKey的命名针对不同的项目要不同的命名否则会覆盖之前的项目,导致sonarqube客户端只是获取到一条项目的评估记录
2.sonar.projectName命名要符合项目的名称sonarqube客户端展示项目的名称通过这个命名而来的
3.sonar.java.binaries这个是我必须要着重讲的,这个不配置会报错,为什么我在脚本会运行maven对源码进行编译,是因为sonarjava高版本的必须要对源码进行编译后才能进行代码质量的扫描,否则会报错
如果向更清楚的知道scanner扫描的内容可以在运行scanner脚本后+ -X来打印更详细的日志,以及在出现报错都可以通过-X来定位具体的问题