SonarQube

简介

SonarQube是开源的代码质量管理系统,用于检测代码中的错误、漏洞和代码规范。SonarQube可以与jenkins、gitlib集成,以便在项目拉取后进行连续的代码检查。

SonarQube的小型实例至少需要4GB内存,大型实例需要16GB内存。

Sonar的工作原理

Sonar是一个Web系统,展现静态代码扫描的结果,结果是可以自定义。而真正实现代码扫描的是Sonar Scanner这个工具,另外同时支持多种语言的原理是它的扩展性,通过插件实现的,也就是Java Jar架包,可以在Sonar平台上在线安装或者离线安装。

SonarQube组成

在这里插入图片描述
SonarQube由服务器、数据库、扫描仪和插件4部分组成
一、服务器
a. 一个web服务器给开发人员,管理员去配置浏览的质量和SonarQube实例
b.基于Elasticsearch搜索服务器从UI向后搜索
c.负责处理代码分析报告计算引擎服务器,并将其保存在数据库SonarQube
二、数据库
a.SonarQube实例的配置(安全,插件设置等)
b.SonarQube的项目以及视图快照的质量
三、扫描仪
通过SonarQube Scanner工具扫描代码
在Project的根目录下执行,还需要在Project下进行SonarQube配置,其中指定了工程的相关信息,还指定了SonarQube Server的地址,SonarQube Scanner分析完毕之后,会将结果上报到该Server。
四、插件
安装在服务端的插件,例如语言包、SCM、认证、治理等等

SonarQube安装部署

一、SonarQube是基于java开发的,需要安装jdk1.8以上
二、SonarQube依赖mysql,需至少安装5.6版本以上
1、启动mysql数据库,
2、配置数据库密码
3、创建sonar数据库 create database sonar default character set utf8;

4、show database;
三、安装git
四、安装wget
五、安装SonarQube
sonar必须由普通用户启动,不能在root账户上运行
六、修改sonarqube连接数据库的信息
sonar.jdbc.username=root
sonar.jdbc.password=ols.cc
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar>useUnicode=true&characset=utf8
七、启动sonar
su - sonar -c “/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start”

八、页面可以访问sonarqube
1、登录,使用admin 密码默认是admin
2、生成token令牌,方便jenkins,gitlib访问sonar,类似于钉钉的token
操作:头像->Myaccount->security
在这里插入图片描述

SonarQube开启权限验证

打开配置-》权限-》开启强制用户验证
配置后任何人扫描代码 必须使用token

SonarQube安装汉化插件

SonarQube安装代码检查插件

默认安装了C,JAVA,PHP,PYTHON,JS等的质量分析工具;可根据项目自行安装html, css go相关的插件

sonar.properties

sonar服务配置文件
配置文件路径:SONARQUBE_HOME/conf/sonar.properties

sonar-scanner.properties

是sonar-scanner的配置文件,是全局配置文件

sonar-project.properties

是sonar的项目配置文件,放在项目的根目录下。
sonar的配置项可以在.properties中指定,也可以在sonar-scanner的命令行中指定

sonar-project.properties配置项

sonar.projectVersion 可设置为当前时间
sonar.source 要扫描的代码目录,java项目扫描src目录
sonar.sourceEncoding UTF-8
sonar.java.libraries findbugs扫描的是编译后的代码,需要先编译后扫描,需要指定编译后文件的目录;java打包后的文件在target/classes目录下;
sonar.java.source =1.8 默认是java1.6
sonar.exclusions 过滤不需要扫描的配置,必须先配置source和libraries,否则配置无效
sonar.projectBaseDir 指定项目的根目录,指定后 sonar.java.libraries和sonar.java.source 可使用相对路径
sonar.projectName sonar页面显示
sonar.language 可以不指定,扫描时会根据文件名后缀扫描匹配;指定语言会扫描固定的语言,指定语言不存在也不报错。
sonar.modules 指定项目结构的 参考https://blog.csdn.net/wahaha13168/article/details/86690037

手动扫描PHP代码

sonar-scanner是客户端工具,需下载安装。
安装完进入项目目录下就可以扫描本地的php代码
在这里插入图片描述

手动扫描Html代码

sonar-scanner是客户端工具,需下载安装
安装完进入项目目录下就可以扫描本地的php代码
在这里插入图片描述
扫描完 在项目列表中可以查看扫描结果

手动扫描java代码

java项目可以用maven扫描,也可以用sonar-scanner扫描
在这里插入图片描述

sonar页面功能介绍

一、项目菜单,也是首页、主页
二、问题:是与自己相关的所有项目的问题

三、代码规则:各种代码扫描规则

四、质量配置:不同语言的规则配置,可以新建规则上传规则
在这里插入图片描述
五、质量阀
可新建或者创建一个新的质量阀

六、配置
在这里插入图片描述

sonarqube配置LDAP认证

一、安装sonarldap插件。
1、下载插件前,要先确定所使用的sonar版本对插件的支持情况
2、在线安装:在sonar管理控台,配置–应用市场–插件–搜索LDAP,直接点安装按钮,进行;
3、离线安装:自己下载LDAP Plugin 插件sonar-ldap-plugin-2.2.0.608.jar,将下载的插件放到 SONARQUBE_HOME/extensions/plugins 目录下,重启sonarqube即可加载;

二、LDAP配置
1、配置文件路径:SONARQUBE_HOME/conf/sonar.properties
2、需要先找公司系统部的人申请一个LDAP的账号,得到以下信息,进行修改
#LDAP settings
#admin
sonar.security.realm=LDAP
ldap.url=ldap://ldao.com.com:389
ldap.bindDn=uid=jenkins,cn=xxxx,DC=xxxxx
ldap.bindPassword=xxxxxxx

#users
ldap.user.baseDn=cn=users, DC=xxxxxx
ldap.user.request=(&(objectClass=inetOrgPerson)(uid={login}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mai

三、重启sonarqube
四、使用域账户登录sonar控台(输入邮箱的用户名,不带邮箱后缀)

sonarqube集成

一、本地分析
开发人员在IDE上安装插件SonarLint分析
二、远程分析
开发人员将代码提交到gitlib中,CI服务触发自动构建,执行代码扫描;分析报告发给sonar服务器处理;分析结果存储在数据库中,开发人员通过web页面审核、评论和改正问题。
远程分析包括n种方法
1、sonarqube、gitlib集成扫描
2、sonarqube、gitlib、jenkins集成扫描

IDE 上集成 SonarLint 插件检测

sonarqube、gitlib集成扫描

前置:安装SonarQube、sonar-gitlab-plugin、GitLab和gitlab-runner

一、sonarqube下载安装sonar-gitlab-plugin-4.0.0.jar插件
方式1:可以直接下载 sonar-gitlab-plugin-2.1.0 该插件,放到 <sonarqube_install_dir>/extensions/plugins 目录,重启 SonarQube 即可。

方式2:admin 登录 SonarQube,点击 配置 —> 系统 —> 更新中心 —> Available —> Search,输入 GitLab,在列表中点击 install 安装,安装完毕后重启 SonarQube 即可。
二、配置 GitLab 通用账户sonarQube
在 GitLab 上注册一个通用账号:sonarQube,作为对接 SonarQube 的统一账户
三、获取GitLab 通用账户sonarQube的Token:
使用sonarQube 登录gitlab,点击 setting —> Account —> Private Token,获取的 User Token 为下边插件配置使用。同时还需要将 SonarQube 加到项目成员或项目所属项目组成员里面去,这样才能有权限 comment 和添加注释行。
在这里插入图片描述
四、配置 sonar-gitlab-plugin 插件
admin 登录 SonarQube,点击 配置 —> 通用配置 —> GitLab —> Reporting —> 设置 GitLab User Token 以及 GitLab url。
注意:GitLab url 为配置的 GitLab 服务地址(本机 GitLab 地址:http://10.236.65.148),GitLab User Token 为 GitLab 上用户的 Token(这里使用上边统一账户 sonarQube Token),其他配置默认即可。
在这里插入图片描述
五、配置 gitlab-runner
1、gitlib安装gitlab-runner
2、配置.gitlab-ci.yml

sonar_preview:
  stage: test
  script:
    - ci/sonar_preview.sh
  except:
    - master
  tags:
    - hwy

3、新建sonar_preview.sh

#!/bin/bash
mvn --batch-mode sonar:sonar \
    -Dsonar.host.url=http://10.236.65.36:9000 \
    -Dsonar.login=wanyang3 \
    -Dsonar.password=****** \
    -Dsonar.issuesReport.html.enable=true \
    -Dsonar.analysis.mode=preview \
    -Dsonar.preview.excludePlugins=issueassign,scmstats
 
if [ $? -eq 0 ]; then
    echo "sonarqube code-analyze over."
fi

六、提交代码自动扫描,展示扫描结果

sonarqube、gitlib、jenkins集成扫描(实战)

一、sonar权限配置,保证RD只能看到与自己项目的代码
1、新建项目组,与gitlab的组对应
2、设置组成员权限 可浏览和阅读源码
3、项目中配置组权限和用户权限
实现结果:
1、好课所有人登录后 看不到好课的项目,需申请权限才可看项目和源码。
2、除好课的项目如果配置了所有人都可浏览,好课组的人能看到该项目

二、PMD、findbugs和sonar规则配置
1、sonar应用市场安装PMD插件
2、离线安装findbugs插件(sonar上findbugs插件版本太高,安装报错)
3、新建gsxph质量配置,集成sonar、findbugs、pmd规则
4、项目质量配置java代码选择 gsxph

三、jenkins集成sonar、PMD、findbugs规则进行代码扫描

1、jenkins配置
1)安装gitlib、 sonar scanner、Generic Webhook Trigger插件
2)新建job ph_sonar 并进行配置;
a. 丢弃构建->保持构建最大的个数是20
b. 源码管理->git->Repository URL: $ssh_url -> Credentials(运维配置,选择root项)->指定分支:不填
c. 触发构建->Generic Webhook Trigger->Post content parameters->Variable:progjct_name-> Expression: $.project.name->JSONPath->Variable:ssh_url-> Expression: $.project.git_ssh_url->JSONPath→Token:***
d.构建环境→选择 Delete workspace before build starts
e. 执行shell

 #!/bin/bash
cd ${WORKSPACE}
group=$(echo ${ssh_url} | grep -oP '(?<=git@git.baijiahulian.com:).*(?=/)')
if [ $group == "gsxpt-support" ];then  //如果是java项目执行下面的命令
mvn clean compile
sonar-scanner -X -Dsonar.projectKey=${project_name} -Dsonar.projectName=${project_name} -Dsonar.host.url=https://sonarqube.***.com -Dsonar.login=*** -Dsonar.sources=. -Dsonar.java.source=1.8 -Dsonar.java.binaries=target/classes 
-Dsonar.sourceEncoding=UTF-8
else
sonar-scanner -X -Dsonar.projectKey=${project_name} -Dsonar.projectName=${project_name} -Dsonar.host.url=https://sonarqube.***.com -Dsonar.login=*** -Dsonar.sources=src/main/java
fi

二、gitlib配置
方案一:
在每个工程下加webhooks->URL:https://ci.com/generic-webhook-trigger/invoke?token=***->选择Push events

方案二:
配置systemhooks,并修改post receive脚本,是支持部门项目组扫描,而不影响其他部门使用。

sonarqube区分显示不同分支的代码扫描结果

1、开源版本sonarqube-server,同一个代码仓库无法区分不同分支,从而实现按代码的不同分支显示对应分支的扫描结果。所有分支的扫描结果,全部显示为master。添加sonar.branch选项只是增加了项目标识
在这里插入图片描述
2、可以下载开源插件使支持分支功能,下载地址:https://github.com/mc1arke/sonarqube-community-branch-plugin
下载插件放置到 S O N A R H O M E / e x t e n s i o n s / p l u g i n s 目 录 下 , 重 启 s o a n r q u b e − s e r v e r 。 扫 描 时 , 在 项 目 的 s o n a r − p r o j e c t . p r o p e r t i e s 文 件 里 面 , 增 加 s o n a r . b r a n c h . n a m e = {SONAR_HOME}/extensions/plugins目录下,重启soanrqube-server。扫描时,在项目的sonar-project.properties文件里面,增加sonar.branch.name= SONARHOME/extensions/pluginssoanrqubeserversonarproject.propertiessonar.branch.name={GIT_BRANCH}配置即可。
效果如图所示:
在这里插入图片描述

遇到问题:
1、新项目直接配置sonar.branch.name扫描分支失败。
解决方法:
[1] 就是配置webhooks的时候点击test;
[2]在sonar上新建项目;
[3]先不加sonar.branch.name
2、maven多机目录项目,在每个目录下扫描会只上传最后一次扫描的结果
正确方法应该配置指定modules
sonar.modules=app,business
business.sonar.modules=config
business.config.sonar.modules=config-api

sonarqube集成go test单元测试覆盖率

go test -v ./… -coverprofile=cover.out
sonar.go.coverage.reportPaths=cover.out

sonarqube集成golangci-link静态代码扫描结果

参考:https://www.infoq.cn/article/TBLtJ8a6PQ3X1uQIWlXo
方案一:sonar自带的sonar-go插件已支持golangci-link规则,(需将sonarqube升级到7.9+以上版本)
方案二:sonar版本需升级到7.9以上才能将golangci-lint扫描结果推送给sonar平台。
golangci-lint run --out-format checkstyle ./… > report.xml
sonar.go.golangci-lint.reportPaths=report.xml

sonar-scanner扫描java单模块项目,使用sonar自带的规则

1、先编译 mvn clean compile
2、配置项
#项目名,如果项目名不存在会自动创建该项目
sonar.projectName=my_project
#项目唯一标识
sonar.projectKey=my_project
#源码路径,设置为当前目录
sonar.sources=.
#SonarQube 访问地址,根据实际情况填写
sonar.host.url=http://192.168.10.227:9000
#token,在 SonarQube 中创建的 token
sonar.login=c4765957e5ada82ebe21a7c2e1f56afbff4059d3
#语言类型
sonar.language=java
#二进制文件目录,就是 .class 文件的目录,只有部分项目需要该配置
sonar.java.binaries=collector/target/classes
#源代码编码格式
sonar.sourceEncoding=UTF-8

sonar-scanner扫描maven多模块项目,使用sonar自带的规则

1、先编译 mvn clean compile
2、配置项
sonar.modules=moduleOne,moduleTwo //指定模块
moduleOne.sonar.modules=oneSub1,oneSub2
moduleTwo.sonar.modules=twoSub1,twoSub2
sonar.sources=src/main/java // 自动会找到每个模块下的src位置
sonar.java.binaries=target/classes //自动会找到每个模块下的target位置

sonarqube集成jacoco单元测试覆盖率(java单模块项目)

1、java项目pom.xml中配置org.jacoco plugin
2、项目根目录下执行mvn test 单元测试
3、执行mvn jacoco:report,生成jacoco.xml文件
3、指定sonar.coverage.jacoco.xmlReportPaths =./target/site/jacoco/jacoco.xml

遇到问题:单元测试覆盖率没有数据,原因:没有生成jacoco.xml,需执行mvn jacoco:report生成报表

sonarqube集成jacoco单元测试覆盖率(maven多模块项目)

一、配置项目父目录下的pom.xml,使合并多个jacoco.exec到一个文件中
配置信息

 <modules>
        <module>app</module>
        <module>inf</module>
        <module>core</module>
        <module>event</module>
        <module>student</module>
        <module>achievement</module>
        <module>subclazz</module>
        <module>statistic</module>
    </modules>
<properties>
    <!-- Sonar -->
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    # ${project.basedir}是项目根目录 /var/usr/local/workspace,要么写死;要么在机器上指定环境变量
 <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.language>java</sonar.language>
</properties> 
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.0.201210061924</version>
    <configuration>
        <destFile>${sonar.jacoco.reportPath}</destFile>
        <append>true</append>
    </configuration>
    <executions>
        <execution>
            <id>agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
    </executions>
</plugin>

二、生成报表 mvn jacoco:report,
三、指定sonar.coverage.jacoco.xmlReportPaths =./target/site/jacoco/jacoco.xml

sonar扫描java项目遇到问题

问题一:
##org.sonar.java.se.ExplodedGraphWalker$MaximumStepsReachedException: reached limit of 16000 steps for method exportOrder#159 in class OrderCronController
调试信息 不需要关注
参考:https://stackoverflow.com/questions/34065727/error-could-not-complete-symbolic-execution-reached-limit-of-10000-steps

问题二:
ERROR: Error during SonarQube Scanner execution
Failed to upload report - An error has occurred. Please contact your administrator
参考:https://blog.csdn.net/qq_33912215/article/details/88711526

问题三:
进到项目的每个目录下扫描代码,但是扫描完后sonar只记录了最后一次扫描的结果,sonar平台上也只有最后一次扫描的目录文件
解决方法一,新建 sonar-project.properties 添加要扫描的modules
sonar.modules=app,business,
business.sonar.modules=config
business.config.sonar.modules=config-api
解决方法二,遍历目录下文件,找到有src的目录,并拼接命令

sonar扫描增量代码

一、抓取增量代码
[root@of-bj-babyabc-test02 ~]# cat /apps/gitlab-runner/bin/ci-changes
#!/usr/bin/env bash
set -x
record="$(mktemp --suffix=-ci-changes)"
old_ref=“origin/master”
new_ref=“HEAD”
if [[ $(git rev-parse $old_ref) == $(git rev-parse $new_ref) ]]; then
# on master branch now
COMMAND=‘git diff-tree --no-commit-id --name-only --diff-filter=ACMRTUXB -m -r HEAD’
else
COMMAND=“git diff --name-only --diff-filter=ACMRTUXB $old_ref $new_ref”
fi
C O M M A N D ∣ g r e p − v ′ v e n d o r / ∥ t e s t s / ′ > " COMMAND | grep -v 'vendor/\|tests/' > " COMMANDgrepvvendor/tests/>"record"
echo “$record”
二、sonar扫描,配置扫描范围选项

sonar接入tslint和eslint

参考:https://docs.sonarqube.org/latest/analysis/external-issues/
执行现有的代码扫描规则,并生成tslint和eslint的扫描报告(json格式),将报告上传到sonarqube平台
sonar.eslint.reportPaths=es报告.json
sonar.typescript.tslint.reportPaths=ts报告.json

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值