Gitlab-ci结合sonarqube实现代码库java项目多分支提交的自动分析

sonarqube作为日常开发中检测代码质量、bug、漏洞、覆盖率检测等指标的工具,能够为开发人员提升代码质量,书写规范提供参考。
同时sonarqube还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用sonarqube。

这里通过增加gitlab-ci各项目pipeline中关于sonarqube的job来实现研发人员提交的各个分支的代码的自动扫描分析,并将最终结果统计展示到sonar-UI。

首先配置gitlab支持sonarqube,需要在soanrqube服务端安装gitlab相关插件,作者之前配置gitlab账号集成登录sonarqube时,已安装,具体如下:

支持sonarqube扫描代码库多分支branch也需要安装插件:

插件地址: https://github.com/mc1arke/sonarqube-community-branch-plugin/releases 注意soanrqube版本对应的插件版本,作者这里sonarqube版本为7.5,对应的branch插件版本为1.0.2

[root@form-sonar-01 plugins]# pwd
/data/sonarqube-7.5/extensions/plugins

[root@form-sonar-01 plugins]# wget  https://github.com/mc1arke/sonarqube-community-branch-plugin/releases/download/1.0.2/sonarqube-community-branch-plugin-1.0.2.jar

[root@form-sonar-01 plugins]# chown sonarqube:sonarqube sonarqube-community-branch-plugin-1.0.2.jar

[root@form-sonar-01 plugins]# su - sonarqube -c "/data/sonarqube-7.5/bin/linux-x86-64/sonar.sh restart"

.gitlab-ci.yaml文件配置soanrqube自动分析代码的相关stage及job

首先新增一个analysis stage

stages:
  - analysis
  # - test
  - build
  - build_images
  - deploy

定义在代码各分支每次commit之后触发分析的job

非主分支配置:

sonarqube_preview: 
  image: twalter/maven-docker 
  stage: analysis 
   only:
     refs:
       - branches
#    variables:
#      - $CI_COMMIT_MESSAGE =~ /.*run_sonar.*/
   before_script:
     - echo "192.168.1.168 sonarqube.heihei.com" >> /etc/hosts
   script: 
     - echo "running sonar:" 
     - cp $CI_PROJECT_DIR/bin/settings.xml ~/.m2/ 
     - | 
        mvn -batch-mode verify sonar:sonar \ 
        -Dmaven.test.skip=true \  #不执行测试用例,也不编译测试用例类
        -Dsonar.host.url=https://sonarqube.heihei.com \  #sonarqube地址
        -Dsonar.login=930a3cb9c0f67547532d884cb8335012ae749933 \  #sonar用户token
        -Dsonar.gitlab.project_id=$CI_PROJECT_PATH \   #明确gitlab项目的id,在分析结束后将结果评论在commit记录中,且sonar集成需要
        -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \   #明确gitlab项目分支本次commit的SHA,sonar集成时需要
        -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME \  #明确gitlab项目本次执行分析的分支,sonar集成时需要
        -Dsonar.gitlab.url=https://gitlab.heihei.com \  #代码库地址
        -Dsonar.gitlab.user_token='nPTbkeqsQ6Wf4kKQP5vJ' \  #该代码库项目用户的token,权限级别至少为maintainer
        -Dsonar.projectKey=$CI_PROJECT_NAME \   #定义sonar本次分析项目的key 
        -Dsonar.projectName=$CI_PROJECT_NAME \  #定义sonar本次分析项目的名称
        -Dsonar.gitlab.comment_no_issue=true -X #无论本次扫描结果有无issue都可以追加评论,默认false
        -Dsonar.branch.name=$CI_COMMIT_REF_NAME  #明确本次分析结果将归并展示与sonar-UI的哪个分支下
  tags: 
    - docker

主分支配置:

sonarqube_master:
  image: twalter/maven-docker
  stage: analysis
  when: manual
  only:
    refs:
      - master
  # variables:
  #   - $CI_COMMIT_MESSAGE =~ /.*run_sonar.*/

  before_script:
    - echo "192.168.1.168 sonarqube.heihei.com" >> /etc/hosts
  script:
    - echo "running sonar:"
    - cp $CI_PROJECT_DIR/bin/settings.xml ~/.m2/
    - |
      mvn  -batch-mode verify sonar:sonar \
      -Dmaven.test.skip=true \                           
      -Dsonar.host.url=https://sonar.heihei.com \  #sonarqube地址
      -Dsonar.login=930a3cb9c0f66587532d816cb8335012ae7299  \  
      -Dsonar.gitlab.project_id=$CI_PROJECT_PATH \                         
      -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \   
      -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME \
      -Dsonar.gitlab.url=https://gitlab.heihei.com \
      -Dsonar.gitlab.user_token='nPTbkeqsB21f4kKQP5vJ' \
      -Dsonar.gitlab.ci_merge_request_iid=$CI_MERGE_REQUEST_IID \
      -Dsonar.gitlab.merge_request_discussion=true \
      -Dsonar.projectKey=$CI_PROJECT_NAME \
      -Dsonar.projectName=$CI_PROJECT_NAME \
      -Dsonar.branch.name=$CI_COMMIT_REF_NAME \
      -Dsonar.gitlab.comment_no_issue=true -X
  tags:                                             
    - docker

项目代码setting.xml增加如下配置:

<settings>
    <pluginGroups>
        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
    </pluginGroups>
    <profiles>
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- Optional URL to server. Default value is http://localhost:9000 -->
                <sonar.host.url>
                  http://sonarqube.heihei.com
                </sonar.host.url>
            </properties>
        </profile>
     </profiles>
</settings>

 

更多扫描参数配置,详细参加Sonar Gitlab-ci Variables以及 Sonar Para

 

关于gitlab及soanrqube两个用户token的获取(最好都为项目的管理者)

sonar.gitlab.user_token

gitlab右上角用户 -> settings ->Personal Access Tokens Scopes选api

sonar.login

登陆 sonarqube网页->login with gitlab -> 右上角自己的姓->My Account -> Security -> Generate Tokens

 

关于job中使用的CI环境变量

如果有疑问,可以通过在定义的sonarqube分析job中的script字段添加echo打印这些变量的值,就非常清晰了:

以代码库地址https://gitlab.heihei.com/zero/ad/advert-service/advert-track为例:

job中关于gitlab-ci的环境变量,详细参考GitLab CI Variables

 

关于sonar指定java项目分析文件

使用-Dsonar.exclusions指明哪些自动生成代码的文件夹不需要分析

匹配规则
? 匹配单个字符 
** 匹配0个或多个文件夹 
* 匹配0个或多个字符

e.g.

排除文件夹 项目根目录下"main/java/test/adv/service/jni/*" 中所有的文件和"main/java/test/adv/service/Clibbrary/"下的所有java文件

  script:
    - echo "running sonar:"
    - cp $CI_PROJECT_DIR/bin/settings.xml ~/.m2/
    - |
      mvn  -batch-mode verify sonar:sonar \
      -Dmaven.test.skip=true \
      ... \
     -Dsonar.exclusions=$CI_PROJECT_DIR/src/main/java/test/adv/service/jni/*,$CI_PROJECT_DIR/src/main/java/test/adv/service/Clibrary/*.java
      

 

查看扫描分析结果

查看gitlab CI/CD本次代码commit动作的pipelines,可以观察到多出了一个External的stage,且整个pipelines被标为红叉,这里是因为sonarqube检测认为项目代码存在bug级别错误所导致

 

查看sonarube UI界面,可以观察到设置的master及b1.7.0分支的扫描分析报告都已上传

 

因为设置了sonar.gitlab.comment_no_issue参数为true,所以本次扫描结果被sonarqube追加了评论

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值