• 使用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的运行情况:
    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联动,可以自动的帮我们完成一些静态检查,规避常见的漏洞,也能减少代码重复率。

    本文来自博客园,作者:haoliuhust,转载请注明原文链接:https://www.cnblogs.com/haoliuhust/p/15370650.html

  • 相关阅读:
    什么是用户画像——从零开始搭建实时用户画像(一)
    一站式Kafka平台解决方案——KafkaCenter
    Druid 0.17入门(4)—— 数据查询方式大全
    流媒体与实时计算,Netflix公司Druid应用实践
    解读银行卡支付背后的原理
    求求你了,不要再自己实现这些逻辑了,开源工具类不香吗?
    编程坑太多,Map 集合怎么也有这么多坑?一不小心又踩了好几个!
    设计数据库 ER 图太麻烦?不妨试试这两款工具,自动生成数据库 ER 图!!!
    一口气带你踩完五个 List 的大坑,真的是处处坑啊!
    轻轻一扫,立刻扣款,付款码背后的原理你不想知道吗?|原创
  • 原文地址:https://www.cnblogs.com/haoliuhust/p/15370650.html
Copyright © 2020-2023  润新知