参考链接: https://blog.youkuaiyun.com/cyfblog/article/details/97535868
SonarQube简介
- SonarQube是一个开源的平台,以执行与代码的静态分析,自动审查,可以检测在25+的编程语言如Java、C#、JavaScript、TypeScript、C/C++、COBOL等的代码缺陷和安全漏洞。
Sonar检测维度
Sonar可以从七个维度进行代码质量检测,我们可以根据不同维度的严重性然后根据我们的经验做出相应的代码优化。
- 代码规范
Sonar可以通过PMD、CheckStyle、Findbugs等代码规则检测工具来检测我们代码是否符合代码规范; - 潜在的缺陷
Sonar可以通过PMD、CheckStyle、Findbugs等代码规则检测工具来检测我们代码是否有代码缺陷(比如空指针是否有判断、IO流是否有关闭等); - 糟糕的复杂度分布
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试 - 重复代码
程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示源码中重复严重的地方 - 注释的检测
没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷 - 单元测试
sonar可以很方便地统计并展示单元测试覆盖率 - 糟糕的设计
通过sonar可以找出循环,展示包与包、类与类之间相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。
docker搭建Sonar server:
使用postgresql数据库
- 搭建postgresql
docker run -d -p 5432:5432 --name postgresql --restart=always -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar postgres
- 重新构建sonar镜像,下载汉化包
FROM sonarqube
ADD sonar-l10n-zh-plugin-8.6.jar /opt/sonarqube/extensions/plugins/
启动Sonar server
docker run -d -p 9000:9000 --name sonar --link postgresql:postgresql --restart=always -e SONARQUBE_JDBC_URL=jdbc:postgresql://postgresql:5432/sonar -e SONAR_JDBC_USERNAME=sonar -e SONAR_JDBC_PASSWORD=sonar sonarqube:zh_CN
-
sonar.jdbc.username=sonar #数据库配置,Name&&Passwd
-
sonar.jdbc.password=sonar
-
解决报错
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
- 解決方法:
sudo vim /etc/sysctl.conf
#追加内容:
vm.max_map_count=655360
#执行:
sysctl -p
> vm.max_map_count = 655360
连接SonarQube
http://192.168.10.186:9000
登录:
USER:admin
Passwd:admin
首次登陆修改密码:××××××
sonarqube使用:
项目测试
[root@CentOS-7-Docker ~]# ls
tests-project-java
从Docker镜像运行SonarScanner
#新建vim myproject.sh文件
vim myproject.sh
#!/bin/sh
#要使用SonarScanner Docker映像进行扫描,请使用以下命令:
docker run -d \
--rm \
-e SONAR_HOST_URL=http://192.168.10.186:9000 \
-e SONAR_LOGIN="a319b5f7f2143901a6db2c835dd5acbdde5dfc62" \
-v /root/tests-project-java:/usr/src \
sonarsource/sonar-scanner-cli \
-Dsonar.projectKey=myproject \
-Dsonar.sources=src \
-Dsonar.language=java \
-Dsonar.java.binaries=.
[root@CentOS-7-Docker ~]# ls
tests-project-java myproject.sh
- 指令说明
- docker 指令:
-v /root/tests-project-java:/usr/src
#将项目目录映射到插件动作路径以进行检测
--e SONAR_HOST_URL
#指定sonarqube地址
-e SONAR_LOGIN
#指定为用户生成的令牌
- scanner指令:
sonarsource/sonar-scanner-cli
#运行SonarScanner插件的镜像
-Dsonar.projectKey
#指定项目的Key 检测完成后可以以Key作为检测完成的项目的名称(必须指定且唯一)
-Dsonar.sources
#指定需要分析的源码的目录,多个目录用英文逗号隔开
-Dsonar.sourceEncoding=UTF-8
#源代码的编码。默认为默认系统编码
检测完成
docker compose参考:
version: '3'
services:
db:
image: postgres:12
container_name: postgresql
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- "./postgresql:/var/lib/postgresql"
ports:
- "5432:5432"
sonarqube:
image: sonarqube:8-community
container_name: sonarqube
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- "./sonarqube/data:/opt/sonarqube/data"
- "./sonarqube/extensions:/opt/sonarqube/extensions"
- "./sonarqube/logs:/opt/sonarqube/logs"
- "./sonarqube/temp:/opt/sonarqube/temp"
ports:
- "9000:9000"
- 安装汉化插件
gitlab-runner配置
- 新建一个runner用来运行.gitlab-ci.yml
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://192.168.10.186 #gitlab地址
Please enter the gitlab-ci token for this runner:
XYJzuykzsBCtKTxpF6KQ #项目runner令牌
Please enter the gitlab-ci description for this runner:
[9160067e9705]:sonar-scanner #runner描述
Please enter the gitlab-ci tags for this runner (comma separated):
sonar-200 #标签
Registering runner... succeeded runner=XYJzuykz
Please enter the executor: docker-ssh+machine, kubernetes, shell, virtualbox, docker+machine, parallels, ssh, custom, docker, docker-ssh:
docker #指定用来执行的命令
Please enter the default Docker image (e.g. ruby:2.6):
sonarsource/sonar-scanner-cli #指定可执行的镜像
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
- .gitlab-ci.yml
stages:
- sonar
- build
- deploy
cache:
paths:
- node_modules/
variables:
PORT: "7090"
PREPRED_DOMAIN: "twww"
PRED_DOMAIN: "dwww"
PROD_DOMAIN: "www"
KUBECONFIG: /etc/deploy/config
LAN_REPO: registry-vpc.cn-beijing.aliyuncs.com
WAN_REPO: registry.cn-beijing.aliyuncs.com
DEV_REPO: qianjia_dev
PRED_REPO: qianjia_pred
PROD_REPO: qianjia_prod
SONAR_HOST_URL: "http://192.168.10.186:9000"
#代码检测
sonar_check_job:
image: registry.cn-beijing.aliyuncs.com/qianjia2018/qianjia_public/sonar-scanner:4.5
stage: sonar
before_script:
- CONTAINER_NAME=`echo $CI_PROJECT_NAME | tr 'A-Z' 'a-z'| tr '_' '-'`
script:
- sonar-scanner -Dsonar.login=admin -Dsonar.password=admin -Dsonar.projectName=$CONTAINER_NAME -Dsonar.projectKey=$CONTAINER_NAME -Dsonar.projectVersion=1.0 -Dsonar.sources=. -Dsonar.language=js -Dsonar.java.binaries=.
allow_failure: true
tags:
- sonar-scanner
only:
- dev
#项目构建
build_push_image_dev_job:
image: registry-vpc.cn-beijing.aliyuncs.com/qianjia2018/qianjia_public:mvn-docker-kube
stage: build
before_script:
- docker login --username=$USERNAME --password=$PASSWORD registry-vpc.cn-beijing.aliyuncs.com
- CONTAINER_NAME=`echo $CI_PROJECT_NAME | tr 'A-Z' 'a-z'| tr '_' '-'`
- TAG=`expr substr $CI_COMMIT_SHA 1 8`
script:
- docker build -t $LAN_REPO/$DEV_REPO/$CONTAINER_NAME:$TAG -f Dockerfile-dev .
- docker push $LAN_REPO/$DEV_REPO/$CONTAINER_NAME:$TAG
tags:
- k8s
only:
- dev
when: on_success
#项目部署
deploy_to_dev_job:
stage: deploy
before_script:
- CONTAINER_NAME=`echo $CI_PROJECT_NAME | tr 'A-Z' 'a-z'| tr '_' '-'`
- TAG=`expr substr $CI_COMMIT_SHA 1 8`
script:
- bash ~/.local/bin/f200.sh $CONTAINER_NAME $PORT 80 $WAN_REPO/$DEV_REPO/$CONTAINER_NAME:$TAG guojia 192.168.10.200
tags:
- ssh-deploy
only:
- dev
when: on_success
- 代码检测脚本说明:
-Dsonar.host.url=http://192.168.10.186:9000 #sonar 要用的 ip 和端口
-Dsonar.sourceEncoding=UTF-8 #源代码编码
-Dsonar.login=admin #登录用户名及密码
-Dsonar.password=admin
-Dsonar.projectKey= #指定项目的Key 检测完成后可以以Key作为检测完成的项目的名称(必须指定且唯一)
-Dsonar.sources #指定需要分析的源码的文件位置,多个目录用英文逗号隔开
-Dsonar.language=js #语言
-Dsonar.projectVersion=1.0 #项目版本
-Dsonar.java.binaries=. #target