使用gitlab runner进行CI(三):使用sonarqube做c++的静态检查
前两次我们讲了如何配置gitlab runner(坑挖了挺久,因为是挺久前弄的,后来交给其他人维护了···)。本节主要讲gitlab-ci的一些基本概念,并通过配置使用sonarqube进行静态检查来进行实践。
1. gitlab-ci.yml的配置
gitlab ci通过项目内的.gitlab-ci.yml进行配置。语言是YAML。
1.1 几个基本概念
pipeline: 流水线,也就是整个CI检查的过程
job: 工作项,可以取任意名字,可以建立任意个工作项,工作项是流水线的一个过程。
stage: 每个工作项可以属于一个stage,类似于分组
script: script是工作项中执行具体检查的shell 命令
before_script: 所有工作项执行前会执行的命令,一般用于配置环境。
example:
before_script:
##设置环境变量
- export PATH=$PATH
## 定义有哪些stages
stages:
- analysis
- build
- test
- deploy
##job名称
cppcheck:
stage: analysis
##具体命令
script:
- source ~/.bashrc
- echo hello_ci
tags:
## 执行此项job的runner,设置见本系列第二节
- cppcheck
1.2 使用CI进行代码检查demo
1.建立一个测试项目,并为其设置runner(参考 使用gitlab runner 进行CI(二):gitlab runner的安装与配置)
2.创建.gitlab-ci.yml文件,并将上文example内容拷贝至该文件
3.提交修改
此时,在项目的CI/CD-》Pipelines页面(或Job),我们就可以看到pipeline的运行情况:
其中Status指示是否成功,点击Stages可进入相应Stage运行的详细情况:
可以看到是依次执行了before_script和job中的script命令。并最终成功了。
2. Sonarqube安装和配置
SonarQube是一种自动代码审查工具,用于检测代码中的静态错误,漏洞以及代码异常(如命名规范、代码重复等)。支持C++、Java、Python等多种语言,能够方便的和git、Jenkins、Gitlab-runner等集成,可以方便的作为代码PR前的前置条件。

2.1 Sonarqube安装
PS: 安装平台为Ubuntu
为了能使用后面需要用到的C++扫描插件,我们安装7.6版本(这个插件现在支持更高版本的了,还没试过):
https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.6.zip
解压即可,假设我们解压的路径为~/sonarqube。
2.2 数据库配置
我这边暂时使用mysql,不过sonarqube最新的版本已经放弃了mysql的支持,可以使用其他的数据库。
sudo apt update #更新软件源
sudo apt install mysql-server #安装mysql
修改sonarqube的配置(~/sonarqube/conf/sonar.properties):
其中jdbc.username和jdbc.password都是我们自己的mysql用户名和密码
# User credentials.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username=root
sonar.jdbc.password=123456
#----- Embedded Database (default)
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092
#----- DEPRECATED
#----- MySQL >=5.6 && <8.0
# Support of MySQL is dropped in Data Center Editions and deprecated in all other editions
# Only InnoDB storage engine is supported (not myISAM).
# Only the bundled driver is supported. It can not be changed.
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?user=root&password=123456&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
2.3 sonar-scanner安装
sonar-scanner是在没有指定scanner时的默认scanner.
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.2.0.1873-linux.zip
下载解压即可
2.4 sonar-cxx插件安装
sonar-cxx是开源的静态检测C++的插件,
根据 https://github.com/SonarOpenCommunity/sonar-cxx/wiki/Compatibility-Matrix版本对应关系,下载https://github.com/SonarOpenCommunity/sonar-cxx/releases对应的插件版本到~/sonarqube/extensions/plugins下即可
2.4 启动
cd ~/sonarqube/bin/linux-x86-64
./sonar.sh
启动后登陆 http://ip:9000可验证是否启动成功,默认密码是admin/admin
2.5 gitlab插件安装
7.6版本的需要安装gitlab插件来和gitlab联动,直接在2.4中的页面安装即可:
2.6 创建项目
最终得到:
主要是为了获得这个login的token。
3. Gitlab-CI配置
在我们要进行检查的项目下,创建.gitlab-ci.yaml:
其他项目替换projectKey,和login的token即可
before_script:
##设置环境变量
- export PATH=$PATH
## 定义有哪些stages
stages:
- analysis
- build
- test
- deploy
sonarcheck:
except:
- schedules
### 指定只在PR、master和创建tag的时候运行
only:
- merge_requests
- master
- tags
stage: analysis
script:
- source ~/.bashrc
- export PATH=/home/uniubi/software/sonar-scanner-4.6.0.2311-linux/bin:$PATH ### sonar-scanner的路径
- sonar-scanner -Dsonar.projectKey=demo -Dsonar.sources=. -Dsonar.host.url=http://XXX:9000 -Dsonar.login=b7db4dc570ab507c272557c2d0cec6487dbcc8a9 -Dsonar.gitlab.commit_sha=$CI_BUILD_REF -Dsonar.gitlab.ref_name=$CI_BUILD_REF_NAME -Dsonar.gitlab.project_id=$CI_PROJECT_PATH -Dsonar.language=c++ -Dsonar.sourceEncoding=UTF-8 -Dsonar.gitlab.max_blocker_issues_gate=-1 -Dsonar.gitlab.max_critical_issues_gate=-1 -Dsonar.gitlab.query_max_retry=50 -Dsonar.gitlab.query_wait=1000
###允许失败,可根据自己项目需要设置
allow_failure: true
###对应gitlab-runner的tags
tags:
- cppcheck
在发起PR后,我们就可以看到:
点击stage可以看到sonarqube的打印:
登陆sonarqube的web界面,可以看到详细的报告:
4. 进阶配置
4.1 规则配置
完整的规则很多,不一定每一条都适用于我们的项目,我们可以禁用和启用一些规则来形成适合自己的规则:
4.2 阈值设置
阈值是用来判定静态检查是否失败的设置,比如重复度。
4.3 设置自动将扫描结果以评论形式写到gitlab
一个比较有用的功能是,扫描完成后,以评论形式发送到gitlab的Merge request, 有助于帮助进行Code review。
首先我们可以创建一个专门用于发送这类消息的gitlab账号,这样以免和我们自己发的评论弄混。当然这个账号需要有这个项目的评论权限。
在创建好账号后,通过该账号创建Access Token:
注意保存好这个token
登陆sonarqube页面,设置gitlab:
经过这样得设置,我们再触发这个静态检查,就能看到结果以评论的形式展现了,发起者就是我们上面建立的账号:
结语
通过sonarqube和gitlab联动,可以自动的帮我们完成一些静态检查,规避常见的漏洞,也能减少代码重复率。
使用gitlab runner进行CI(三):使用sonarqube做c++的静态检查的更多相关文章
- 使用gitlab runner 进行CI(二):gitlab runner的安装与配置
参考 https://docs.gitlab.com/runner/install/index.html,可以选择与gitlab相同的版本. gitlab runner可以通过安装binary包或do ...
- 使用gitlab runner 进行CI(四):使用Gitlab Page托管项目文档
目录 1.什么是Gitlab Pages 2.开启Gitlab Pages 3.基本过程 4.托管markdown文档 4.1 安装sphinx等依赖 4.2 配置项目的sphinx配置 4.3 编写 ...
- Gitlab Runner实现CI/CD自动化部署asp.net core应用
环境说明 一台git服务器(192.168.169.7),安装gitlab,docker. 一台web服务器(192.168.169.6),安装git,gitlab runner,docker,dot ...
- Gitlab CI持续集成 - GitLab Runner 安装与注册
GitLab Runner安装 需要添加gitlab官方库: # For Debian/Ubuntu/Mint curl -L https://packages.gitlab.com/install/ ...
- docker-Gitlab、GitLab Runner安装
以下操作均在CentOs下操作 1.Gitlab install ① 启动gitlab docker run --detach \ --hostname 115.30.149.35 \ --publi ...
- GitLab Runner部署(kubernetes环境)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Gitlab Runner的分布式缓存实战
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Gitlab + Gitlab runner + Window powershell
需求说明 根据领导要求,要把python 项目移到Gitlab 进行管理,并利用Gitlab CI/CD 进行自动化测试,打包,部署.(听起来很简单吧) 比较头大,完全没有经验,python 也是刚上 ...
- 在gitlab上setup CI
安装gitlab runner docker pull gitlab/gitlab-runner 启动gitlab runner docker run -d --name gitlab-runner ...
随机推荐
- uwp 的锁屏功能
[UWP开发]自定义锁屏&桌面壁纸 mtobeiyf关注 2015.11.01 00:16:55字数 394阅读 1,249 调用通用的API来设置桌面壁纸,可以实现很多有趣的功能.在Wind ...
- Mybatis轻松入门(仅要求会用看着一个就够了,略过源码分析部分即可)
文章目录 ==一.概念== 二.快速入门 1.开发步骤 2.环境搭建 2.1.导入Mybatis的坐标和其他坐标 2.2.创建User表 2.3.编写实体 2.4.编写UserMapper配置文件 2 ...
- mzy git学习,初识git(一)
GIT学习 git工作区.暂存区.本地库.远程库 工作区:实际上我们工作的地方,进行写代码或者文件的地方. 暂存区:我们执行了git add 操作之后,就会被提交到暂存区. 本地库:其实最后我们需要执 ...
- 使用dom4工具:增删改xml文件(七)
package dom4j_write; import java.io.File; import java.io.FileOutputStream; import org.dom4j.Attribut ...
- 战胜了所有对手,却输给了时代。MVVM--jQuery永远的痛。
前言 第二次浏览器战争中,随着以 Firefox 和 Opera 为首的 W3C 阵营与 IE 对抗程度的加剧,浏览器碎片化问题越来越严重,不同的浏览器执行不同的标准,对于开发人员来说这是一个恶梦.为 ...
- ROS catkin_make error Could not find a package configuration file provided by "actionlib_msgs"
在使用ROS catkin_make编译的时候,出现类似如下错误 CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cma ...
- JavaScript——数组——数组长度
JavaScript--数组--数组长度 JavaScript中的数组长度是可变的,可用赋值运算符改变数组大小,如果改变之后的数组的长度比原数组大,则新数组会在末尾补充相应数量的空位,空位上的数组元素 ...
- 二、安装部署指定的docker版本
1.部署指定的docker版本 1.移除源有版本的docker [root@localhost ~]# yum remove docker docker-common docker-selinux d ...
- vue 双向绑定(v-model 双向绑定、.sync 双向绑定、.sync 传对象)
1. v-model实现自定义组件双向绑定 v-model其实是个语法糖,如果没按照相应的规范定义组件,直接写v-model是不会生效的.再说一遍,类似于v-on:click可以简写成@click,v ...
- HCNP Routing&Switching之IS-IS邻居建立、LSDB同步、拓扑计算和路由形成
前文我们了解了IS-IS的报文结构和类型相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15260670.html:今天我们来聊一聊IS-IS建立邻居. ...