使用gitlab runner进行CI(三):使用sonarqube做c++的静态检查

摘要:
本节主要介绍gitlab ci的一些基本概念,并通过配置和使用sonarqube进行静态检查来实践它。示例:before_Script:##设置环境变量-exportPATH=$PATH##定义阶段:-analysis build test deploy##job name cppcheck:stage:analysis##特定命令脚本:-source~/。bashrc echo hello_Citags:##有关此作业的运行程序,请参阅本系列的第二部分-cpcheck1.2。使用CI进行代码检查demo1。创建一个测试项目,并为其设置运行程序。创建.gitlab-ci.yml文件,并将上述示例内容复制到该文件中。3.提交修改。此时,在项目的CI/CD-˃Pipelines页面上,我们可以看到管道的运行状态:status表示是否成功,单击Stages以输入相应阶段操作的详细信息:您可以看到之前在脚本和作业中的turn_Script命令中执行。

目录

前两次我们讲了如何配置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的运行情况:
image
其中Status指示是否成功,点击Stages可进入相应Stage运行的详细情况:
image
可以看到是依次执行了before_script和job中的script命令。并最终成功了。

2. Sonarqube安装和配置

SonarQube是一种自动代码审查工具,用于检测代码中的静态错误,漏洞以及代码异常(如命名规范、代码重复等)。支持C++、Java、Python等多种语言,能够方便的和git、Jenkins、Gitlab-runner等集成,可以方便的作为代码PR前的前置条件。
image

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
image

2.5 gitlab插件安装

7.6版本的需要安装gitlab插件来和gitlab联动,直接在2.4中的页面安装即可:
image

2.6 创建项目

image
image
最终得到:
image
主要是为了获得这个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后,我们就可以看到:
image
点击stage可以看到sonarqube的打印:
image
登陆sonarqube的web界面,可以看到详细的报告:
image

4. 进阶配置

4.1 规则配置

完整的规则很多,不一定每一条都适用于我们的项目,我们可以禁用和启用一些规则来形成适合自己的规则:
image

4.2 阈值设置

阈值是用来判定静态检查是否失败的设置,比如重复度。
image

4.3 设置自动将扫描结果以评论形式写到gitlab

一个比较有用的功能是,扫描完成后,以评论形式发送到gitlab的Merge request, 有助于帮助进行Code review。
首先我们可以创建一个专门用于发送这类消息的gitlab账号,这样以免和我们自己发的评论弄混。当然这个账号需要有这个项目的评论权限。
在创建好账号后,通过该账号创建Access Token:
image
注意保存好这个token
登陆sonarqube页面,设置gitlab:
image
经过这样得设置,我们再触发这个静态检查,就能看到结果以评论的形式展现了,发起者就是我们上面建立的账号:
image
image

结语

通过sonarqube和gitlab联动,可以自动的帮我们完成一些静态检查,规避常见的漏洞,也能减少代码重复率。

免责声明:文章转载自《使用gitlab runner进行CI(三):使用sonarqube做c++的静态检查》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇枚举和宏的区别Mac终端命令收集下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java通过jdbc连接数据库并更新数据(包括java.util.Date类型数据的更新)

一、步骤 1.获取Date实例,并通过getTime()方法获得毫秒数; 2.将获取的毫秒数存储到数据库中,注意存储类型为nvarchar(20); 3.读取数据库的毫秒数,作为Date构造方法的参数创建实例,有需要再转换时间格式。 二、代码示例 packagecom.yh.dao; importjava.sql.Connection; importja...

数据源与数据库连接池

什么是数据源? JDBC2.0提供了javax.sql.DataSource接口,它负责建立与数据库的连接,当在应用程序中访问数据库时,不必编写连接数据库的代码,直接引用DataSource获取数据库的连接对象即可。用于获取操作数据的Connection对象。 什么是数据库连接池? 数据库连接池的思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一...

gitlab忘记密码找回

在gitlab登录窗口,如果密码忘记了登录不进入,可以先尝试点击登录框下方的Forgot your password来通过邮箱的方式找回,如果邮箱不可以使用了,则看下面的强制找回方法 如图所示,需要输入当初设置的邮箱帐号,这一步前提是邮箱可以正常使用的情况下才可以使用的方法 通过xshell连接到gitlab安装的服务器上,然后输入su -...

jdbcTemplate 获取数据表结构

jdbcTemplate 操作方法  Java代码   /**  *1.方法一:  */   String sql = "select * from "+ tableName;   //RowCountCallbackHandler rcch = new RowCountCallbackHandler();   //this.jdbcTemplate...

ci框架 查询构造器类

$this->db->get() 该方法执行 SELECT 语句并返回查询结果,可以得到一个表的所有数据: $query = $this->db->get('mytable'); // Produces: SELECT * FROM mytable 第二和第三个参数用于设置 LIMIT 子句: $query = $this-&...

GitLabPipeline语法

流水线语法检测 GitLab CI的每个实例都有一个称为Lint的嵌入式调试工具,该工具可以验证.gitlab-ci.yml文件的内容. 流水线参数列表 Keyword Description script 运行的Shell命令或脚本。 image 使用docker映像. services 使用docker服务映像. before_s...