将sonarQube扫描结果回写到 Gitlab comment
参考文章来源于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⚠️
4 SonarQube 6.77
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
6 安装 Sonar GitLab Plugin
下载:sonar-gitlab-plugin.jar ,将jar包拷贝到sonarqube的extensions/plugins目录下:
重启sonar即可使插件生效。
注意:需要sonarqube启动后,再更新插件,否则插件会被覆盖
7 关联GitLab
切换到Administration > Configuration > GitLab功能,
- 设置gitlab的地址
- 设置可以访问gitlab的用户的访问token,⚠️该用户必须拥有开发者权限。
- 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
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项目界面,查看流水线即可查看执行状态。