# 代码质量检测
# SonarQube平台概述
SonarQube平台是一个强大的代码质量管理平台,专为提升软件质量和安全性而设计,支持如下代码质量管理工作:
- 编码规范:
- 内置规则:SonarQube 包含了针对多种编程语言的编码规范检查,如java、html、javascript、python等。
- 自定义规则:允许用户根据团队需求定制和添加自己的编码规则。
- 静态代码分析:
- 自动分析:SonarQube 可以集成到构建工具中,如Maven、Gradle、Jenkins等自动运行代码分析。
- 问题报告:生成详细的代码质量问题报告,包括bug、漏洞、代码异味等。
- 安全编码:
- 安全漏洞检测:内置OWASP开放式Web应⽤程序安全项⽬规则,检测常见的安全漏洞。
- 漏洞分类:按照严重性级别标记问题,便于优先级排序。
- 复杂度分析:
- 复杂度度量:评估代码的复杂性,如复杂度和方法行数等。
- 代码冗余:检测重复代码,鼓励代码重用和简化。
- 持续集成/质量门禁:
- 集成到CI流程:与Jenkins、GitLab等CI工具集成,确保每次构建都进行质量检查。
- 质量门禁:与GitLab等版本管理工具集成,实现只有达到标准的代码才能提交,阻止不符合要求的代码合并。
- 版本控制集成:
- 历史分析:跟踪代码质量随时间的变化,识别长期未解决的问题。
- 代码库分析:分析整个代码库,而不仅仅是最近的变更。
- 报告与仪表盘:
- 可视化报告:提供丰富的图表和仪表盘,展示项目整体质量状态。
- 高管报告:为管理层提供简洁的视图,展示代码质量和安全性的关键指标。
通过SonarQube,开发团队可以系统地进行代码质量管理,实现从编码到部署的全过程监控和改进。
官网地址:https://www.sonarqube.org/ (opens new window)
版本说明
SonarQube除了开源的社区版之外,还有开发者版、企业版和数据中心版等不同的发行版本,以满足不同类型的客户需求。社区版可以免费使用,其他版本为商业付费版本,本文档以社区版为准编写。
社区版就是通常大家所说的开源版本的SonarQube,通过其核心的代码质量和安全问题的扫描能力,以及质量门禁的功能,成为了目前代码静态扫描事实上的标准。
- 支持15种编程语言: Java、go、C#、CSS、HTML、JSP等。
- 支持5种IDE: Eclipse、IntelliJ、Visual Studio、WebStorm等。
- 支持60+的插件:通过插件机制可以集成不同的测试工具,代码分析工具,以及持续集成工具。
- 支持SonarLint: 可以在开发过程中实时检测代码中的错误,插件支持离线模式不用与SonarQube链接。
- 支持质量门禁: 设置质量阈值,只有达到标准的代码才能通过,可以阻止不符合要求的代码合并。
其他版本相对社区版添加了小众语言、增强了分析报告、提供了高级的容错机制和扩展性等,具体收费和功能特性请查看SonarQube官网产品定价 (opens new window)说明。
# 使用指南
SonarQube作为一个全面的代码质量管理工具,有完备的用户和权限管理系统,可以将不同项目分配给不同管理人员,实现管理权限的层层下放。
这里简明扼要的说明项目如何配置和使用SonarQube,更全面的使用帮助请参考SonarQube官方帮助文档 (opens new window)。
基础平台SonarQube服务地址:http://114.251.235.6:8900/ (opens new window)
步骤一:新建项目
新的产品或项目接入SonarQube需要产品主管向Sonar管理员(联系基础平台)提交三项申请信息:
- 项目信息,可以批量申请开通;
- 项目需要绑定的次级管理员账号,如果没有开通过填写申请信息开通;
- 开发账号申请信息,如果需要新增开发账号填写申请信息开通。
Sonar管理员按提交信息完成新建项目、新建用户、项目权限分配,产品主管可以通过次级管理员账号登录SonarQube平台管理项目,如项目权限分配、质量配置修改、质量阈修改等。
注意:
基础平台SonarQube已经与基础平台GitLab账号打通,可以用基础平台GitLab账号直接登录SonarQube平台,不用向Sonar管理员申请新建用户。
一套SonarQube服务可以集成配置不同GitLab上的项目,但只能打通一个GitLab服务的账号,如果需要定向打通GitLab账号需要自建SonarQube服务,请参考SonarQube官方帮助文档 (opens new window)。
步骤二:配置扫描仪
产品主管根据项目使用的编程语言,查看是否存在对应语言的质量配置。例如,Java项目需要Java质量配置;JavaScript项目需要JavaScript质量配置。如果没有对应语言质量配置联系Sonar管理员安装对应插件。社区版已经提供了常见语言的插件,已经覆盖了主流前后端开发语言。
产品主管按项目具体情况自行配置扫描仪。SonarQube的扫描仪SonarScanner
支持Maven、Jenkins、Gradle、.NET等常用构建工具。详细的安装配置方法请参考官方帮助文档-分析源代码 (opens new window)。
步骤三:查看分析结果
产品主管使用配置的扫描仪分析代码并上传结果到SonarQube服务器,登录平台查看分析结果,包括代码质量、bug、漏洞、代码异味等,按项目实际情况和问题优先级安排代码质量优化工作。更详尽的质量指标说明请参考官方用户指南 (opens new window)。
步骤四:配置SonarLint插件
开发人员在项目添加到SonarQube平台后,需要在开发工具中配置SonarLint插件,编写代码时利用SonarLint插件进行本地代码分析,及时发现并修复bug和代码异味,以避免在分析阶段产生过多问题。
步骤五:项目质量配置(可选)
基础平台已经基于代码规范定制了java语言默认质量配置,其他语言质量配置使用默认Sonar way
配置。如果项目需要定制质量配置可以通过两种方式实现:
产品主管如果需要定制项目质量配置,需要向Sonar管理员申请创建新的质量配置,在Sonar管理员完成创建授权后,产品主管可以登录系统修改项目质量配置,完成修改后使用项目配置功能切换项目使用的质量配置。
步骤六:质量门禁配置(可选):
产品主管可以联系GIT管理员按质量门禁配置小节说明对项目添加质量门禁,确保每次代码提交后都进行质量检查,对于质量不合格的代码提交予以拒绝,保障项目达到代码质量阈要求。如果现有质量阈不满足要求,需要为项目定制质量阈,需要向Sonar管理员申请创建新质量阈,完成创建后可以通过项目配置修改项目质量阈。
# 新建项目
SonarQube项目由Sonar管理员创建,有两个创建入口:手工创建、配置创建。
手工创建
手工创建:在 项目 界面,执行新增项目
-> 手工
。
配置创建
配置创建:在 配置界面
,选择左侧 项目
-> 管理
标签,执行右侧 创建项目
。
项目令牌设置
项目创建完成后,选择需要执行代码审查分析的项目,设置令牌信息。
# 项目配置
Sonar管理员在完成项目创建后,会将项目管理权限授权给产品主管,如果没有对应项目的管理权限请向Sonar管理员申请项目配置权限。
项目权限分配
通过项目配置
->权限
进入权限配置页面,可以将当前项目的不同权限分配给指定的用户、群组。具体权限说明查看项目权限管理小节。
质量配置修改
通过项目配置
->质量配置
进入质量配置页面,可以切换当前项目的质量配置。
质量阈修改
通过项目配置
->质量阈
进入质量阈页面,可以修改当前项目的质量阈。
# 项目质量配置
质量配置简介
SonarQube对源代码执行规则以生成问题,一组规则的集合为一套质量配置。
规则有四种类型:
- 代码异味(可维护领域)
- 错误(可靠性领域)
- 漏洞(安全域)
- 安全热点(安全域)
安全热点和漏洞之间的主要区别在于在决定是否修复之前需要进行审查:
- 安全热点,可以突出显示安全敏感的一段代码,但可能不会影响整体应用程序安全性。由开发人员审查代码以确定是否需要修复;
- 漏洞一但发现需要立即修复,是影响应用程序安全性的问题。
基础平台规范
SonarQube项目默认使用内置的Sonar way
配置进行代码分析审查,如果不满足项目需求可以定制质量配置。
HOS基础开发平台已经定制sonar-pmd-p3c
做为java语言默认质量配置,可以覆盖帮助文档中命名规范和注释规范标准。
项目如果有定制规则需求,需要向Sonar管理员申请基于现有sonar-pnd-p3c
质量配置复制创建
新的质量配置进行修改。
注1:HOS基础开发平台根据实际需求,基于sonar-pmd-p3c
质量配置定制了java-hos-app
质量配置用于基础平台项目。其他项目也可以申请基于java-hos-app
质量配置复制创建
新质量配置进行修改。
注2:质量配置继承来的规则可以修改严重类型,但不可以挂起关闭,如果定制质量配置需要关闭规则,只能复制指定质量配置后再修改。
默认质量配置
java语言的默认质量配置为基于HOS基础平台代码规范定制的sonar-pmd-p3c
,其他语言质量配置为内置Sonar way
配置。
新建质量配置
Sonar管理员可以通过复现创建
或直接创建
两种方式创建质量配置,并将配置授权给指定用户配置修改。
点击授权给更多用户
按钮,可以将质量配置授权给指定用户。
修改质量配置
Sonar管理员和被授权的用户可以在质量配置界面点击更多激活规则
按钮进入规则配置界面。
规则配置界面可以可以批量执行规则的激活、挂起操作。
单个规则界面可以对规则进行激活、挂起、修改严重性类型。
修改关联项目
在质量配置界面可以执行“修改项目”,批量修改关联的项目:
注:只有用户有项目配置权限的项目才会显示在关联列表。
# 配置扫描仪
SonarQube扫描仪支持常见构建工具,这里以maven命令、maven插件、jenkins插件三种形式为例说明如何配置扫描仪。更多插件安装配置方法请参考官方帮助文档-分析源代码 (opens new window)。
扫描仪可以自动进行代码分析,并将分析结果推送到SonarQube服务器,可以在SonarQube服务器查看分析结果,扫描仪分析代码不影响项目构建和部署流程。
注意事项
使用SonarQube执行项目代码审查时,可以使用账号、密码。如果想强化安全,不想在执行代码扫描时使用真实SonarQube用户的密码,可以使用用户令牌来代替用户登录。这样可以通过避免把分析用户的密码在网络传输,从而提升安全性。
# maven命令
在应用程序maven项目根目录中执行如下命令:
mvn sonar:sonar -Dsonar.projectKey=hos-sonar-project -Dsonar.host.url=http://127.0.0.1:9000 -Dsonar.login=dcc44f4ec86b8f11a61e4d2ea340aab3a10011e4
执行过程中,如果提示 Not authorized. Please check the properties sonar.login and sonar.password 错误,可以尝试使用用户名、密码,命令如下:
mvn sonar:sonar -Dsonar.projectKey=hos-sonar-project -Dsonar.host.url=http://127.0.0.1:9000 -Dsonar.login=admin -Dsonar.pasword=admin
- sonar.projectKey:SonarQube上的项目标识
- sonar.host.url:sonarqube服务器地址
- sonar.login:用户令牌(使用令牌就不用用户密码参数了)
- sonar.login:用户名
- sonar.password:用户密码
# maven插件集成
- 在maven的setting.xml 文件里加上如下配置:
<settings>
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.login>admin</sonar.login>
<sonar.password>admin</sonar.password>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://127.0.0.1:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
- sonar.host.url:SonarQube服务器地址
- sonar.login:用户名
- sonar.password:用户密码
- 在应用程序项目的pom.xml 文件里加上
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.7.0.1746</version>
</plugin>
</plugins>
</build>
这里以IDEA开发工具为例,在应用程序maven插件里,选择sonar,双击执行,即执行此应用程序的代码审查分析。
# jenkins插件集成
Jenkins集成SonarQube,可以实现在拉取代码后,自动进行代码分析,并将分析结果推送到SonarQube服务器,可以在SonarQube服务器查看分析结果,分析结果不影响Jenkins构建和部署流程。
以下是插件安装配置步骤,jenkins相关配置这里不再赘述。
1. Jenkins安装插件
在Jenkins上安装SonarQube Scanner for Jenkins插件:
2. 获取SonarQube令牌
进入我的账号
-安全
,输入任意名称,生成令牌:
拷贝并保存生成的令牌,令牌只显示一次。
3. 配置Jenkins的SonarQube信息
4. 配置SonarQube Scanner
在系统管理-全局工具配置中,配置自动安装Scanner(我们使用的SonarQube8.9版本,所以这里选择Scanner4.6,支持JDK8)
5. Jenkins任务配置
在Jenkins任务中,Build Steps步骤中增加Execute SonarQube Scanner,输入以下信息:
# 查看分析结果
使用扫描仪执行代码审查分析后,会将结果上传到SonarQube服务器上。
在SonarQube上会展示对应项目的分析结果,选择项目可以看到项目的具体分析结果。
项目质量查看
产品主管或技术经理需要关注整体项目质量、bug数量、安全漏洞、安全热点等,根据项目具体情况制定质量提升计划。
项目问题查看
- 开发人员需要根据作者找到属于自己的问题,根据问题类型、严重程度等按优先级修改问题。
- 产品主管需要关注各类问题和漏洞优先级,推进问题的修复。
可以点击为何是问题?
链接打开问题说明,了解问题产生的原因和修改方法。
# 配置SonarLint插件
以开发工具IDEA为例,安装SonarLint插件,可以在本地实时执行项目代码的审查,此分析结果不会上传到SonarQube服务器。
# 插件安装
打开IDEA设置,定位到Plugins,搜索sonarlint,并安装。
# 配置服务端地址
SonarLint可以独立使用,服务器端不是必须配置;如果需要管理和同步自定义的规则时需要绑定SonarQube服务。
- 打开IDEA的设置,添加安装的SonarQube控制
- 勾选Automatically trigger analysis,会对当前文件自动自行代码审查
- SonarQube服务器链接可以使用用户密码,或者用户令牌
- 应用程序项目与SonarQube服务器上项目关联绑定
# 更新规则
业务应用程序关联的SonarQube上的项目,代码分析规则修改后,本地业务应用程序需要更新规则。
# 代码审查
插件安装完成后,即可执行代码审查。
- 自动代码审查,在IDEA
设置
->Tools
->SonarQube
勾选Automatically trigger analysis
; - 在java类上,鼠标放在对应需要检查的代码处,会自动显示SonarLint的规则。
- 手动执行:选择需要执行分析的代码文件,
右键
->SonarLint
->Analyze with SonarLint
- 对整个项目执行审查,选择需要执行分析的项目,
右键
->SonarLint
->Analyze with SonarLint
- 代码审查分析完成后,在SonarLint视图窗口里的Report标签里,查看分析结果
# 质量门禁配置
质量门禁可以实现代码提交时的质量检查,质量检查不通过会提示开发人员修改,禁止提交代码。
质量门禁可以按项目定制,需要开启质量门禁的项目请联系GIT管理员添加相关配置。
# 安装配置
1. 安装SonarScanner
SonarScanner是代码扫描器,提供代码扫描命令供Gitlab调用,所以需要安装在Gitlab服务器上,以下是安装SonarScanner流程。
根据SonarQube版本下载对应的SonarScanner,例如SonarQube8.9版本的SonarScanner下载地址:
https://docs.sonarsource.com/sonarqube/8.9/analyzing-source-code/scanners/sonarscanner/
解压后将其拷贝到Gitlab服务器上任意目录,例如:
# 解压
unzip sonar-scanner-cli-4.6.2.2472-linux.zip
# 给文件夹重命名
mv sonar-scanner-4.6.2.2472-linux sonar-scanner
修改配置文件:conf/sonar-scanner.properties
#Configure here general information about the environment,uch as SonarQube server connection details for example
#No information about specific project should appear here
#----- Default SonarQube server
#sonar.host.url=http://localhost:9000
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
2. 获取Gitlab项目相对路径
用root账号登录Gitlab,进入管理中心-项目,进入要配置的项目中,复制项目的相对路径:
3. Hooks脚本配置
进入Gitlab服务器中的安装目录,找到仓库数据保存目录,例如:/var/opt/gitlab/git-data/repositories
,然后进入上一步找到的项目相对路径,然后可以看到hooks目录:
进入hooks目录,里边保存了一些模板脚本。
在hooks目录中创建我们需要使用的脚本目录和脚本文件:
# 创建 custom_hooks 文件夹
mkdir custom_hooks
# 进入 custom_hooks 文件夹
cd custom_hooks
# 创建 pre-receive 文件
touch pre-receive
# 修改 pre-receive 文件
vim pre-receive
脚本内容如下(根据实际情况修改sonar相关信息):
#!/bin/bash
#根据实际情况修改以下三项内容:Sonar-Scanner的安装目录、SonarQube服务端访问地址、SonarQube的账号Token
SONAR_SCANNER_PATH=/usr/local/sonar-scanner
SONAR_URL=http://你的sonarqubeIP:端口
SONAR_TOKEN=Sonar中你的项目Token
echo "开始代码扫描..."
GIT_VERSION=`git version`
echo "git版本是:$GIT_VERSION"
# 获取当前路径
BASE_PATH=`pwd`
echo "当前路径是:$BASE_PATH"
ACCOUNT=`whoami`
echo "当前账户是:$ACCOUNT"
# 从标准输入流读入参数
read normalInput
ARR=($normalInput)
OLD_REVISION=${ARR[0]}
CURRENT_REVISION=${ARR[1]}
BRANCH=${ARR[2]}
echo "旧修订ID:$OLD_REVISION"
echo "新修订ID:$CURRENT_REVISION"
echo "当前项目:$GL_PROJECT_PATH"
PROJECT_NAME=$(echo $GL_PROJECT_PATH | awk 'BEGIN{FS="/"}{print $NF}')
echo "项目名称:$PROJECT_NAME"
echo "当前分支:$BRANCH"
BRANCH_NAME=$(echo $BRANCH | awk 'BEGIN{FS="/"}{print $NF}')
echo "分支名称:$BRANCH_NAME"
export SONAR_SCANNER=$SONAR_SCANNER_PATH
PATH=$SONAR_SCANNER/bin:$PATH
export PATH
if [ $BRANCH_NAME = "develop" ]; then
# 过滤出当前提交中的 java 文件
FILES=`git diff --name-only $OLD_REVISION $CURRENT_REVISION | grep -e "\.java$"`
if [ -n "$FILES" ]; then
SONARDIR=$BASE_PATH/"sonar"
mkdir -p "${SONARDIR}"
TEMPDIR=$BASE_PATH/"tmp"
for FILE in ${FILES}; do
# 创建目录并舍弃输出
mkdir -p "${TEMPDIR}/`dirname ${FILE}`" >/dev/null
# 创建文件
git show $CURRENT_REVISION:$FILE > ${TEMPDIR}/${FILE}
done;
echo "进入临时文件夹"
cd $TEMPDIR
pwd
SONAR_USER_HOME=$SONARDIR sonar-scanner -Dsonar.language=java -Dsonar.projectKey=$PROJECT_NAME -Dsonar.host.url=$SONAR_URL -Dsonar.login=$SONAR_TOKEN -Dsonar.branch.name=$BRANCH_NAME -Dsonar.projectVersion=1.0 -Dsonar.java.binaries=./ -Dsonar.scm.disabled=true
sleep 5s
rt=$(curl -u '${SONAR_TOKEN}:' ${SONAR_URL}/api/qualitygates/project_status?projectKey="$PROJECT_NAME"\&branch="$BRANCH_NAME" | awk -F ":" '{print $3}' | awk -F "," '{print $1}')
echo "代码检测结果$rt"
echo "删除临时文件夹"
rm -rf $TEMPDIR
if [ $rt = "\"ERROR\"" ];then
echo "代码检测失败,拒绝提交"
exit 1
elif [ $rt = "\"OK\"" ];then
echo "代码检测成功,进入仓库"
exit 0
fi
fi
fi
然后修改文件权限:
chmod 777 pre-receive
# 验证
质量阈是一系列对项目指标进行度量的条件。项目必须达到所有条件才能算整体上通过了质量阈。例如,配置质量阈为新增Bugs大于10、新代码可靠率低于评级A、新代码可维护率低于评级B为不合格,那分析完成后若指标符合这些标准,则代码质量将被认为是不合格的。
SonarQube Server 处理分析报告时,根据质量配置中的代码规则进行匹配,从而生成具体的指标数据,然后根据质量阈中的阈值判断出项目的代码质量是否合格。
可以用如下方法验证项目质量门禁是否配置成功:
新建test质量阈,增加一个针对所有代码阻断问题大于0的质量条件,表示代码检测中只要出现一个以上阻断问题代码检测就不通过。
对配置质量门禁的GIT项目,修改质量阈为test。
在项目里写几个不符合规则的代码问题,如1/0
,然后 commit 到本地仓库,push到远程仓库的时候会提示“提交被拒绝”。
在 git Console 标签页,会看到我们 SHELL 脚本写的日志。
在 sonarqube 对应分支,能看到检测失败和报错内容,错误就是我们提交的代码错误。
验证完成后需要改回项目质量阈。
# 管理员使用指南
Sonar管理员的主要工作是创建用户、群组(类似角色概念)、分配全局权限、新建项目、分配项目权限。
用户和群组的创建非常简单,这里不再赘述,主要介绍全局权限管理和项目权限分配。
# 全局权限管理
SonarQube的全局权限说明:
- 系统管理员:能执行所有管理功能,比如:全局配置和默认仪表盘的定制;
- 管理员:能管理所有质量阈和质量配置;
- 执行分析:用户是否有权限执行代码分析操作,并可以将分析结果推送至SonarQube服务器;
- 置备项目:可以在第一次分析项目之前初始化项目的结构。
全局权限属于Sonar管理员
,不应该分配给项目管理员,全局配置的修改可能导致所有项目配置错误。
# 项目权限管理
项目权限说明:
- 浏览:只能查看项目问题和确认问题;
- 查看源码:可以查看项目源码;
- 问题管理员:对问题设置误判、不会修复等,可以修改问题严重级别;
- 管理安全热点:驳回,清理,接受,重开"安全热点";
- 管理员:项目配置权限;
- 执行分析:用户是否有权限执行代码分析操作,并可以将分析结果推送至SonarQube服务器。
Sonar管理员
可以将项目所有权限授权给产品主管做为次级管理员,次级管理员再将项目的浏览权限授权给开发岗、测试岗、安全岗等需要解决问题的人员。
# 新建和添加规则指南
SonarQube提供两种扩展方式,XPath扩展或Java方式扩展,有的语言支持XPath ,有的只能支持Java扩展,比如Java的语言只支持Java方式的扩展。
这里以Java方式扩展为例讲解开发和添加一个规则的步骤。更详尽的帮助请参阅“Sonar添加规则指南(官方) (opens new window)”。
使用 Java 添加编码规则
Java方式扩展自定义规则开发,实际上是对Sonar的官方JAR包里面的方法进行重写,然后添加自己定义的规则。
用Java编写质量规则的过程:
- 创建一个 SonarQube 插件;
- 对要为其编写编码规则的语言插件的 API 进行依赖;
- 根据需要创建任意数量的自定义规则;
- 生成 SonarQube 插件(jar 文件);
- 将此 jar 文件放在
<sonarqubeHome>/extensions/plugins
目录中; - 重新启动 SonarQube 服务器。
Java语言规则编写请参考官方指南:Writing Custom Java Rules 101 (opens new window)。
添加扩展的规则
以添加阿里的P3C规则为例,假设已经添加规则jar包并完成SonarQube的重启。
进入代码规则
界面,查看仓库中是否有PMD仓库,规则中搜索p3c,如果有对应规则被查询到,说明jar包添加成功。
如果没有可以修改的质量配置,在质量配置
界面中点击创建
新建质量配置,名称叫做ali-p3c(名称随意)。
点击需要添加规则的质量配置,如新建的ali-p3c,进入质量配置管理界面,点击更多激活规则
进入规则管理界面,搜索所有p3c规则,批量修改
选激活ali-p3c规则
。
如有调整项目质量配置需求,请参照项目配置小节调整项目质量配置。