cxx-plugin介绍及其下载安装
这个c++插件sonar-cxx整合了一些现有的 c++ 代码检测工具,使得社区版的 sonarqube 能够支持对 c++ 代码的检测。具体支持的 c++ 代码检测工具可以通过sonar-cxx项目中README.md进行查看。本文档中涉及的 c++ 检测工具为 cppcheck。根据下方图片中表格通过 sonarqube 版本选择对应 sonar-cxx 版本,作者本地 sonarqube的版本为 7.9.1,最后选择了sonar-cxx-plugin-1.3.2.1853这个版本。将下载后的 jar 文件放在对应的extensions中并重启sonarqube 服务即可。

Sonarqube c++规则配置
sonarqube 中 c++使用的默认规则 Sonar Way中检查规则无法主动进行激活,通过github搜索获得相关解决办法。通过对默认的 Sonar Way规则进行扩展操作获得自己的 sonarway_extension规则,激活其中相关的 c++检查规则并选择需要使用此规则配置的项目即可解决 c++无生效规则的问题。相关 github 页面https://github.com/SonarOpenCommunity/sonar-cxx/wiki/Manage-Quality-Profiles
具体操作如下图一中所示,首先对默认规则 Sonar way 进行扩展,点击图中绿色箭头指向的扩展选项,创建一个基于 Sonar way 的 sonarway_extension 的扩展,创建完成后如下图二所示。


在下图三中点击激活更多规则选项,进入下图四页面中并找到刚创建完成的sonarwayextension配置并在下图五中的批量操作选项中激活 sonarwayextension中的规则配置。最后在下图六点击修改项目按钮,如下图七所示选择应用 sonarway_extension的项目





Sonarqube c++ 扫描流程
下方脚本为 c++ 项目本地提交脚本。
L5为设定 PATH 环境变量,将 sonar-scanner加入环境变量中。
L10-L12为设定c++项目提交时的 sonarqube 服务 URL 及对应项目信息。
L18-L27为cppcheck 对 c++ 项目进行检测的过程。
L29-L49为循环操作,使用 sonar-scanner 对c++项目进行扫描并使用 cppcheck 检查结果将扫描结果进行上传分析。
相关 github 页面
https://github.com/SonarOpenCommunity/sonar-cxx
https://github.com/SonarOpenCommunity/sonar-cxx/wiki/sonar.cxx.cppcheck.reportPaths
#! /bin/bash
set -exo
whoami
PATH=$PATH:/usr/local/go/bin:/usr/local/node/bin:/usr/local/sonar-scanner/bin
echo $PATH
current_path=`pwd`
export sonarqube_url="xxxxx"
export sonarqube_key="xxxxx"
export sonarqube_token="xxxxx"
echo $sonarqube_url
echo $sonarqube_key
echo $sonarqube_token
cppcheck -v -j 1 --enable=all --xml ./* 1>cppcheck_result.xml 2>&1
cppcheck_result=$?
# 0表示提交成功,跳出循环
if [ "$sonarqube_result" = "0" ]
then
echo "cppcheck 检测成功"
else
echo "cppcheck 检测失败"
exit 1
fi
for i in {1..5}
do
echo "第$i次提交测试结果"
sonar-scanner -Dsonar.projectKey=${sonarqube_key} -Dsonar.sources=${current_path} \
-Dsonar.cxx.includeDirectories=${current_path} -Dsonar.exclusions=**/zdpts_coverage.sh,**/*_result.xml,**/*.java \
-Dsonar.host.url=${sonarqube_url} -Dsonar.tests=${current_path} -Dsonar.test.inclusions=**/*_test.cpp \
-Dsonar.login=${sonarqube_token} -Dsonar.language=cxx -Dsonar.cxx.file.suffixes=.h,.cpp -Dsonar.sourceEncoding=UTF-8 \
-Dsonar.projectVersion=1.0 -Dsonar.cxx.cppcheck.reportPath=${current_path}/cppcheck_result.xml
sonarqube_result=$?
# 0表示提交成功,跳出循环
if [ "$sonarqube_result" = "0" ]
then
break
# 1表示提交失败,休眠10s等待继续提交
elif [ "$sonarqube_result" = "1" ]
then
echo "第$i次提交失败"
sleep 10s
continue
fi
done
结果上传后,可见如下图所示的结果,即表示 c++ 项目检测成功
