文章

Jenkins+Sonarqube+cppcheck 搭建

Jenkins+Sonarqube+cppcheck 搭建

本文主要介绍 Jenkins+Sonarqube+cppcheck 怎么搭建一个静态检测和展示网址。

Jenkins+Sonarqube+cppcheck 搭建

1. 环境

  • CentOS7
  • JDK11
  • sonarqube7.8
  • postgresql13

2. 数据库

2.1. 安装

RPM 包名作用
postgresql13-13.12-1PGDG.rhel7.x86_64.rpm客户端工具,例如 psql
postgresql13-server-13.12-1PGDG.rhel7.x86_64.rpm数据库服务器(核心服务)
postgresql13-libs-13.12-1PGDG.rhel7.x86_64.rpmPostgreSQL 公共库,供客户端/服务端使用
postgresql13-contrib-13.12-1PGDG.rhel7.x86_64.rpm可选的额外模块(如 uuid-ossp、pg_stat_statements 等)
1
2
3
4
5
6
7
8
9
10
# 安装 postgresql
sudo yum install ./postgresql13-*.rpm
# 初始化数据库
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
# 启用服务
sudo systemctl enable postgresql-13
# 启动服务
sudo systemctl start postgresql-13
# 查看服务状态
sudo systemctl status postgresql-13

2.2. 配置

1
2
3
4
5
6
7
8
9
10
11
# 登录
psql -U postgres -h 127.0.0.1 -p 5432
# 创建用户 CREATE DATABASE [username]
CREATE DATABASE sonar;
# 设置密码 ALTER USER [username] WITH PASSWORD '[password]';
ALTER USER sonar WITH PASSWORD 'sonar';
# 创建数据库 CREATE DATABASE [database_name];
# 目前创建是属于 postgres,可以退出,用新用户登录再创建;或者创建后转移拥有者
CREATE DATABASE sonar;
# 转移仓库拥有者 ALTER DATABASE [database_name] OWNER TO [username];
ALTER DATABASE sonar OWNER TO sonar;
命令含义
\q退出
\l展示数据库列表
\du展示角色列表

3. Java

在环境变量中添加 java 相关配置即可。打开文件 vim /etc/profile

1
2
3
4
5
# Java
export JAVA_HOME=/usr/java/jdk-11.0.0.1
export JRE_HOME=$JAVA_HOME/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH

4. sonarqube

1
2
# 解压
unzip sonarqube-7.8.zip -d /opt/

4.1. 参数配置

打开文件 vim /opt/sonarqube-7.8/conf/sonar.properties,写入以下配置

1
2
3
4
5
6
# 连接数据库,上述设置 postgresql 用户名,密码,仓库名
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://127.0.0.1:5432/sonar
# web 堆栈大小
sonar.web.javaOpts=-Xmx2G -Xms1G -XX:+HeapDumpOnOutOfMemoryError

4.2. 启动

1
2
3
4
# 启动
/opt/sonarqube-7.8/bin/linux-x86-64/sonar.sh start
# 重启
/opt/sonarqube-7.8/bin/linux-x86-64/sonar.sh restart
sonarqube 必须以普通用户启动

4.3. 访问

启动成功,就可以访问 http://[ip]:9000 进行登录,默认账号是 admin,密码是 admin

4.4. 使用

4.4.1. 插件安装

因为是使用 C/C++ 开发,所以下载以下插件(C插件可以不要,可能会和C++包含文件规则冲突)

  • sonar-l10n-zh-plugin-1.28.jar
  • sonar-c-plugin-1.3.3.2051.jar
  • sonar-cxx-plugin-1.3.3.2051.jar

将以上插件拷贝到 /opt/sonarqube-7.8/extensions/plugins 重启即可。

4.4.2. token配置

因为 Jenkins 推荐使用 token,所以在 sonarqube 中创建一个 tokencc33f44ce902f906e4dc278c916f10d66afd9237 就是后面需要填写的数据

5. Jenkins

5.1. 插件管理

manage plugins 中搜索 SonarQube Scanner 并下载安装重启

5.2. Sonar配置

Configure System 中对 SonarQube servers 进行配置。

如果多个工程需要使用,可以在全局凭据中添加对应的配置,Secret 就是上述的 token,这样在其他地方使用这个凭据即可;或则在需要使用的地方添加上述的 token

5.3. 项目配置

在一个代码检查的工程中,添加 Execute SonarQube Scanner,配置对应的 jdksonarqube 分析参数。

1
2
3
4
5
6
7
8
9
10
11
# 项目标识
sonar.projectKey=xxx-CppCheck
sonar.projectName=xxx-CppCheck
sonar.projectVersion=1.1.4.1030
# 语言
sonar.language=c++
# 包含目录
sonar.sources=./src,./test
# 特定配置
sonar.sourceEncoding=UTF-8
sonar.inclusions=**/*.h,**/*.hpp,**/*.c,**/*.cpp

所有配置完成,运行 Jenkins 工程,成功即可在 sonarqube 中查看检测报告

6. CppCheck

6.1. 什么时候使用

在使用 sonarqube 因为项目可能比较大,依赖的头文件比较多,导致 sonarqube 自带的文件分析并不能正确解析,手动添加头文件路径又比较多,所以采用 cppcheck + cmake 方式,能够自动查找对应的头文件。

6.2. 使用

系统安装 cppcheck

6.2.1. Jenkins项目配置

构建时添加 CMAKE_EXPORT_COMPILE_COMMANDS=ON 生成 compile_commands.json 构建文件,cppcheck 可以利用该文件查找依赖的头文件。

1
2
3
4
5
6
# cmake
cmake -B"build_amd64" -G"Unix Makefiles" -D"CMAKE_EXPORT_COMPILE_COMMANDS=ON"
# 如果不依赖中间生成文件,可以不编译(Qt moc 等是中间文件需要编译,不然查找不到)
cmake --build "build_amd64" -j 4
# cppcheck
cppcheck --enable=all --project=build_amd64/compile_commands.json -i thirdPart --xml --xml-version=2 2> cppcheck_result.xml

然后需要把 sonarqube scan 配置关闭检测,直接调用外部报告 cppcheck_result.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
# 项目标识
sonar.projectKey=SCCM-Develop-CppCheck
sonar.projectName=SCCM-Develop-CppCheck
sonar.projectVersion=1.1.4.1030
# 语言
sonar.language=c++
# 包含目录
sonar.sources=./src,./test
# 特定配置
sonar.sourceEncoding=UTF-8
sonar.inclusions=**/*.h,**/*.hpp,**/*.c,**/*.cpp
# 关闭分析,使用外部报告
sonar.cxx.enabled=false

6.2.2. sonarqube配置

在配置里面 C++Code analysisCppcheck report(s) 添加使用 cppcheck_result.xml

最后执行 Jenkins 工程也可以展示代码检测报告。

参考

[1] Jenkins 集成 SonarQube Scanner - 废物大师兄 - 博客园

本文由作者按照 CC BY 4.0 进行授权