部署:
1.先为sonar创建mysql数据库
mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY '***';
mysql> FLUSH PRIVILEGES;
2.启动sonarqube服务
#docker run -d --name sonar --restart=always -p 9000:9000 -p 9092:9092 \
-e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=**** \
-e SONARQUBE_JDBC_URL=jdbc:mysql://10.103.27.177:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance\
-v /server/sonarqube:/opt/sonarqube sonarqube
3.访问:
IP:9000
4.在maven项目中使用
mvn sonar:sonar \
-Dsonar.host.url=IP:9000 \
-Dsonar.login=b5b3cd724171df9d6fb2efb3f9c5e2d4724789f6
配置:
1.代理
如果本地计算机访问外网需要代理,sonar更新插件也需要配置代理,配置方法如下:
进入sonar安装目录/conf目录,打开sonar.properties配置文件,找到update center的配置,配置如下
# UPDATE CENTER
# Update Center requires an internet connection to request http://update.sonarsource.org
# It is enabled by default.将这一项设置成true
sonar.updatecenter.activate=true
# HTTP proxy (default none)配置代理ip地址和端口
http.proxyHost=172.30.XX.XX
http.proxyPort=8080
# NT domain name if NTLM proxy is used
#http.auth.ntlm.domain=
# SOCKS proxy (default none)
#socksProxyHost=
#socksProxyPort=
# proxy authentication. The 2 following properties are used for HTTP and SOCKS proxies.配置登录计算机的用户名和密码
http.proxyUser=test
http.proxyPassword=test
2.与ldap集成
修改/opt/sonar/config/sonar.propertie文件,添加如下:
# LDAP configuration
# General Configuration
sonar.security.realm=LDAP
sonar.security.savePassword=true
ldap.url=ldap://IP:389
ldap.bindDn=cn=admin,dc=example,dc=org
ldap.bindPassword=****
# User Configuration
ldap.user.baseDn=ou=People,dc=example,dc=org
#ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
ldap.user.request=(&(objectClass=inetOrgPerson)(cn={login})) //注意这里要看自己的ldap中是用的uid还是cn
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail
# Group Configuration
#ldap.group.baseDn=ou=Groups,dc=sonarsource,dc=com
ldap.group.request=(&(objectClass=groupOfNames)(member={dn}))
ldap.group.idAttribute=cn
#sonar.log.level=DEBUG //生产使用的时候注释掉以免影响性能
参考:https://docs.sonarqube.org/display/PLUG/LDAP+Plugin
3.使用
.设置规则
在系统菜单----质量配置中选择适合自己公司的规则或新创建一套规则(也可以通过拷贝已有的规则)
.设置质量门,如图
意思是当有阻断问题的大于0个则报错,当覆盖率小于80%则报错
分析周期开始时,如果只添加或修改很少代码,就很难达到期望的代码覆盖或重复级别。为了避免质量阈失效,如果工作量不大时,只有新代码超过20行时,才会计算新代码重复读和覆盖率的质量阈条件。
其中指标参数说明:
参考:http://www.genshuixue.com/i-cxy/p/15635675
4.与jenkins的pipeline集成
首先需要在jenkins的系统管理中配置sonar server
pipeline {
agent { label 'ci' }
stages {
stage('CheckCode') {
steps {
git branch: '******', credentialsId: '212d9ef0-c9c2-4bec-bc2f-6cb7065ee4b2', url: 'git@***.git'
}
}
stage('静态检查') {
steps {
echo "starting codeAnalyze with SonarQube......"
//sonar:sonar.QualityGate should pass
withSonarQubeEnv('SonarQube') {
//固定使用项目根目录${basedir}下的pom.xml进行代码检查
withMaven(jdk: 'jdk1.8', maven: 'mvn') {
sh "mvn -f pom.xml -U clean compile sonar:sonar -Dsonar.branch=$BRANCH
"
}
}
script {
timeout(100) {
//利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
}
}
}
}
}
}
post {
failure {
emailext body: '${JELLY_SCRIPT,template="static-analysis"}', recipientProviders: [[$class: 'DevelopersRecipientProvider']], subject: '构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - Failure!'
}
success {
emailext body: '${JELLY_SCRIPT,template="static-analysis"}', recipientProviders: [[$class: 'DevelopersRecipientProvider']], subject: '构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - Success!'
}
aborted {
emailext body: '${JELLY_SCRIPT,template="static-analysis"}', recipientProviders: [[$class: 'DevelopersRecipientProvider']], subject: '构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - Aborted!'
}
}
}
5.针对某个分支扫描分析,增量分析,增量报告
mvn -f pom.xml -U clean compile sonar:sonar
-Dsonar.analysis.mode=preview -Dsonar.issuesReport.console.enable=true
-Dsonar.branch=$BRANCH_HOME //经验证可以实现对分支的扫描分析,结果展示以另外的项目体现在sonar中。
-Dsonar.analysis.mode=preview //在sonar6.7.1+pipelen中分析正常,也确实是增量分析,但验证质量时报错。。。。
其实也可以通过设置质量门“新增阻碍问题”来实现针对增量代码是否引入了新的阻碍问题,缺点就是也是全量分析(有点小耗时)
参考:http://blog.csdn.net/aixiaoyang168/article/details/77749552
6.配置使用中遇到的问题
i.
原因:因为做了通过nginx转发,根据提示是数据太大,ng默认文件上传大小支持1M;
解决:
。打开nginx配置文件 nginx.conf, 路径一般是:/etc/nginx/nginx.conf;
。在http{}段中加入 client_max_body_size20m; 20m为允许最大上传的大小(大小可自定义)。
。保存后重启nginx,问题解决。
ii.构建完报错
java.lang.IllegalStateException: Unable to parse response fromhttp://sonar.abc.cn//api/ce/task?id=AWEiaX0J_bmqEf43r92X:
解决:修改jenkins系统配置中sonar配置,url为http://sonar.abc.cn 注意不要加/
iii.Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (22790518 > 16777216). You can change this value on the server by setting the max_allowed_packet’ variable.
解决:
show variables like '%max_allowed_packet%';
更改mysql 的max_allowed_packet参数,设置 max_allowed_packet = 64M ,然后重启mysql
[mysqld]
max_allowed_packet=32M
https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html
注意:有些报错是可以通过查看/opt/sonarqube/logs/web.log可以看到的