将sonarQube扫描结果回写到 Gitlab comment

2022/10/11

参考文章来源于SonarScanner使用Sonarqube的Gitlab插件将扫描结果以gitlab comment的形式回写到Gitlab

参考文章来源于gitlab+sonarQube集成配置

将sonarQube扫描结果回写到 Gitlab comment

1 最终效果

本次演示通过Docker部署SonarQube和Gitlab,实现代码提交gitlab后,自动执行CI流水线,调用sonar对代码进行静态检测分析, 并将检测结果同步到gitlab中。

结果演示

2 实验环境

版本号很重要! 版本号很重要!! 版本号很重要!!!

构建方式 中间件 版本号
linux sonarqube 7.6
linux Sonar GitLab Plugin 4.1.0
linux sonar-l10n-zh-plugin 1.2.6
linux sonar-scanner-cli 4.1.0.1829
linux gitlab-runner 14.10.1
构建方式 中间件 版本号
docker sonarqube 6.77
linux Sonar GitLab Plugin 3.0.2
linux sonar-l10n-zh-plugin 1.19
linux sonar-scanner-cli 2.8
linux gitlab-runner 12.9.0

3 Sonar GitLab Plugin

⚠️Only SonarQube < 7.7, because preview mode is removed⚠️

官方地址-GitHub

版本对应关系

4 SonarQube 6.77

官方地址-GitHub

5 通过docker部署SonarQube

linux系统下需要对于文件夹赋予权限

sudo chmod -R 777 /home/codescann/sonar/sonarqube/*

启动命令

docker-compose -f docker-compose-sonarqube6.7.7.yml -p sonarqube up -d

docker-compose.yml 内容如下

# https://hub.docker.com/_/sonarqube
version: '3'

# 网桥elk -> 方便相互通讯
networks:
  sonarqube:

services:
  # postgres
  postgres:
    image: postgres:12.3
    restart: always
    container_name: sonarqube_postgres
    ports:
      - "5432:5432"
    volumes:
      - "/opt/docker/sonarqube/postgres/postgresql:/var/lib/postgresql"
      - "/opt/docker/sonarqube/postgres/data:/var/lib/postgresql/data"
      - "/etc/localtime:/etc/localtime:ro"  # 设置与宿主机时间同步
    environment:
      TZ: Asia/Shanghai
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
    networks:
      - sonarqube

  # sonarqube
  sonarqube:
    image: sonarqube:6.7.7-community
    container_name: sonarqube
    restart: unless-stopped        # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
    volumes:
      - "/opt/docker/sonarqube/data:/opt/sonarqube/data"
      - "/opt/docker/sonarqube/logs:/opt/sonarqube/logs"
      - "/opt/docker/sonarqube/conf:/opt/sonarqube/conf"
      - "/opt/docker/sonarqube/extensions/plugins:/opt/sonarqube/extensions/plugins"
      - "/etc/localtime:/etc/localtime:ro"  # 设置与宿主机时间同步
    command:
      # 内存设置
      - -Dsonar.ce.javaOpts=-Xmx2048m
      - -Dsonar.web.javaOpts=-Xmx2048m
      # 设置服务代理路径
      - -Dsonar.web.context=/
      # 此设置用于集成gitlab时,回调地址设置
      - -Dsonar.core.serverBaseURL=https://sonarqube.example.com
    environment:
      TZ: Asia/Shanghai
      SONARQUBE_JDBC_USERNAME: sonar
      SONARQUBE_JDBC_PASSWORD: sonar
      SONARQUBE_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
    ports:
      - "9005:9000"
    depends_on:
      - postgres
    networks:
      - sonarqube



启动

docker-compose up -d

访问

http://127.0.0.1:9005 (默认)用户名:admin (默认)密码:admin

访问Sonar

6 安装 Sonar GitLab Plugin

下载:sonar-gitlab-plugin.jar ,将jar包拷贝到sonarqube的extensions/plugins目录下:

重启sonar即可使插件生效。

注意:需要sonarqube启动后,再更新插件,否则插件会被覆盖

重启

7 关联GitLab

切换到Administration > Configuration > GitLab功能,

  • 设置gitlab的地址
  • 设置可以访问gitlab的用户的访问token,⚠️该用户必须拥有开发者权限

关联GitLab

  • gitlab配置方式。

关联GitLab

  • gitlab配置方式。

sonar.gitlab.max_global_issues:提交详情页中要显示多少条全局issue,默认10条

sonar.gitlab.comment_no_issue:当提交的代码中没有issue时也添加comment

sonar.gitlab.disable_inline_comments:不将issue的comment添加到具体代码的位置,只添加到整个项目issue列表中

sonar.gitlab.disable_global_comment:不显示整个项目的所有issue列表,建议开发分支打开,集合和master分支关闭

sonar.gitlab.inline_template:具体代码行issue的模板,添加后sonar在具体代码行添加的comment就会用这个代替

sonar.gitlab.global_template:全项目issue列表的模板,添加后sonar的comment就会用这个代替

sonar.gitlab.ping_user:在comment的最后@ 造成这次issue的提交人,在相应账号的gitlab的右上角会有todo提示

sonar.gitlab.unique_issue_per_inline:打开后如果一行代码有多个issue,则针对每个issue添加一个comment

sonar.gitlab.issue_filter:按级别过滤issue,比如选择MAJOR,则级别低于MAJOR的issue不会被检测并添加comment

获取User Token

新建一个gitlab用户:sonarQube,用该用户登录。

设置

创建个人访问令牌

此处的“名称”可以随便填,目的在于方便记忆。 将生成后的Token填入Sonar即可。

分配权限

将sonarQube用户添加到需要检测的项目中,分配“开发者”权限。

分配权限

8 linux安装GitLab-runner 和 sonar-scanner

⚠️推荐使用linux 安装GitLab-runner 和 sonar-scanner,如果使用docker安装会出现GitLab-runner 访问不到 sonar-scanner的情况⚠️ ⚠️需要注意gitlab-runner与gitlab的版本对应关系⚠️

gitlab-runner注册

 [root@s102 /]# gitlab-runner register
# 输入 GitLab 地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.199.109/

# 输入 GitLab Token
Please enter the gitlab-ci token for this runner:
1Lxq_f1NRfCfeNbE5WRh

# 输入 Runner 的说明
Please enter the gitlab-ci description for this runner:
可以为空

# 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci
Please enter the gitlab-ci tags for this runner (comma separated):
deploy

# 这里选择 true ,可以用于代码上传后直接执行(根据版本,也会没有次选项)
Whether to run untagged builds [true/false]:
true

# 这里选择 false,可以直接回车,默认为 false(根据版本,也会没有次选项)
Whether to lock Runner to current project [true/false]:
false

# 选择 runner 执行器,这里我们选择的是 shell
Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
shell

配置系统环境变量

#配置环境变量
vim /etc/profile

export SONAR_SCANNER_HOME=/opt/sonar-scanner
export PATH=$PATH:${SONAR_SCANNER_HOME}/bin

#刷新使其生效
source /etc/profile

点击查看官网示例

要点说明:

url:

gitlab的访问地址

registration-token

gitlab要注册新的 Runner 所需要输入后面的注册授权码。 管理员登录后,在“管理区域 > Runners”菜单即可查看或者重置token

Runner Registration Token

Runner管理

9. 开启Gitlab CI

在项目根目录添加文件:.gitlab-ci.yml


stages:
  - sonarqube_scan
  - feedback_to_gitlab
  - sendmail

# 执行 SonarQube 分析任务
sonarqube_scan_job:
  stage: sonarqube_scan
  only:
    - 分支名称
  script:
    - >-
      sonar-scanner -Dsonar.projectName=$CI_COMMIT_REF_NAME
      -Dsonar.projectKey=$CI_COMMIT_REF_NAME  
      -Dsonar.host.url=sonar访问地址
      -Dsonar.login=sonar 访问token 
      -Dsonar.sources=./
      -Dsonar.sourceEncoding=UTF-8
      -Dsonar.java.binaries=./
      -Dsonar.java.source=8
      -Dsonar.inclusions=src/包名/**
      -Dsonar.exclusions=docs/**/*,webapp/**/*,src/包名/dev/**/*,src/cert_cp/**/*,,**/*.xml
      -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA
      -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
      -Dsonar.gitlab.project_id=$CI_PROJECT_ID
  tags:
    - 分支名称
# 执行 SonarQube 分析,并将检测结果反馈至 GitLab
sonarqube_gitlab_comment:
  stage: feedback_to_gitlab
  only:
    - 分支名称
  script:
    - >-
      sonar-scanner -Dsonar.projectName=$CI_COMMIT_REF_NAME
      -Dsonar.projectKey=$CI_COMMIT_REF_NAME  
      -Dsonar.host.url=sonar访问地址
      -Dsonar.login=sonar 访问token 
      -Dsonar.sources=./
      -Dsonar.sourceEncoding=UTF-8
      -Dsonar.java.binaries=./
      -Dsonar.java.source=8
      -Dsonar.inclusions=src/包名/**
      -Dsonar.exclusions=docs/**/*,webapp/**/*,src/包名/dev/**/*,src/cert_cp/**/*,,**/*.xml
      -Dsonar.analysis.mode=preview 
      -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA
      -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
      -Dsonar.gitlab.project_id=$CI_PROJECT_ID
  tags:
    - 分支名称

sendmail_job:
  stage: sendmail
  only:
    - 分支名称
  script:
    - echo $GITLAB_USER_EMAIL
    - echo $CI_PROJECT_NAME
    - echo $CI_COMMIT_REF_NAME
    - python /home/codescann/nodocker/sonarqube_api.py $CI_PROJECT_NAME $CI_COMMIT_REF_NAME $GITLAB_USER_EMAIL
  tags:
    - 分支名称



⚠️需要注意 -Dsonar.analysis.mode=preview 配置后才能开启规则回写gitlab⚠️

提交后,在gitlab项目界面,查看流水线即可查看执行状态。

流水线


Post Directory