安全防护,静态扫描工具sonarqube介绍
安全防护,静态扫描工具sonarqube介绍
一:SonarQube介绍
#官网文档
#https://docs.sonarqube.org/latest/#staying-connected
https://docs.sonarqube.org/latest/setup-and-upgrade/install-the-server/
二:概念
异味 Code smell (maintainability domain)
异味太多了,我也没有消除太多了异味,一个项目异味一般都是好几k,所以消除起来一两个异味对基数没有什么影响,并且异味太多,消除一部分后,并没有感受到那种异味数量巨减的感觉,导致消除异味的积极性不是很高。并且有的异味是真的不好消除,有时候打开一个文件,几千行代码一片都是标异味。直接就放弃了。
代码异味:一种编程术语,指的是代码中的某些特征可能导致潜在的问题,通常需要进行重构以提高代码质量
三:SonarQube架构
1,不遵守代码标准(checkstyle)
2,潜在缺陷(空指针)
3,糟糕的复杂度(难以理解)
4,重复(通用的方法需要归纳封装)
5,糟糕的注释
7,糟糕的设计(耦合度检查)
需要用到的软件有:SonarQube,Sonar-scanner。
SonarQube为代码检查的server,并提供可视化界面;
Sonar-scanner为client。用于收集检查数据并且发送到server中。
也就是传统的C/S关系:
四:与gitlab集成扫描
配置gitlab api
集成gitlab:
通过git-runner执行脚本gitlab-ci.yml。当任意同事代码提交时直接触发gitlab-ci.yml。
gitlab-ci.yml触发sonarQube代码检查脚本比如:进入项目文件夹 ——> 执行指令:sonar-scanner
五:与jenkins集成
集成Jenkins:
在jenkins服务器上安装客户端Sonar-Scanner并配置好环境变量。
当jenkins自动部署项目完成之后触发逻辑:进入项目文件夹 ——> 执行指令:sonar-scanner
进入 Jenkins ,系统管理——> 系统配置 ——> 找到 Sonar ——> 追加配置——> 添加凭据
注:Secret 在SonarQube里面 “生成令牌”
六:安装部署
#ubuntu 2204
1.docker-compose 组件部署
创建网络
docker network create sonarnet
docker network ls
2.下载镜像
docker pull postgres:12
docker pull sonarqube:community
3.创建目录
mkdir -p /data/sonarqube/{conf,data,logs,extensions}
mkdir -p /data/postgres/{postgresql,data}
chmod -R 777 /data/sonarqube
4.编写配置文件
conf/sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar123
sonar.jdbc.url=jdbc:postgresql://postgres:5432/sonar
5.中文汉化补丁
下载:
https://github.com/xuhuisheng/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-10.0/sonar-l10n-zh-plugin-10.0.jar
上传到:extensions/plugins/
6.配置docker-compose.yaml
#如果文件名称不一样 docker-compose -f sonar-docker-compose.yml up -d
docker-compose.yml
version: '3'
services:
postgres:
image: postgres:12
restart: always
container_name: postgres
ports:
- 5432:5432
volumes:
- /data/postgres/postgresql/:/var/lib/postgresql
- /data/postgres/data/:/var/lib/postgresql/data
environment:
TZ: Asia/Shanghai
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar123
POSTGRES_DB: sonar
networks:
- sonarnet
sonar:
image: sonarqube:community
restart: always
container_name: sonar
depends_on:
- postgres
volumes:
- /data/sonarqube/extensions:/opt/sonarqube/extensions
- /data/sonarqube/logs:/opt/sonarqube/logs
- /data/sonarqube/data:/opt/sonarqube/data
- /data/sonarqube/conf:/opt/sonarqube/conf
ports:
- 9000:9000
environment:
SONARQUBE_JDBC_USERNAME: sonar
SONARQUBE_JDBC_PASSWORD: sonar123
SONARQUBE_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
networks:
- sonarnet
networks:
sonarnet:
driver: bridge
7.启动服务
docker-compose up -d
#停止
docker-compose down
#重启
docker-compose restart sonar
8.默认访问账号密码
http://192.168.10.14:9000/
admin
admin
9.修改web服务配置
方法1:
Web服务默认的端口号是9000
sonar.web.port=9003
方法2:部署nginx
配置域名
七:Sonar-scanner客户端
sonar-scanner提供本地的代码扫描,客户端可以安装在与服务端相同的服务器,也可以装在不同的服务器(也可以安装在开发人员本地电脑)
1.下载
使用浏览器打开刚刚安装好的SonarQube Web UI,新建project时根据指引,可以找到对应OS的sonar-scanner客户端下载地址以及使用命令
https://docs.sonarqube.org/10.0/analyzing-source-code/scanners/sonarscanner/
#scanner client
集成Jenkins:
在jenkins服务器上安装客户端Sonar-Scanner并配置好环境变量。
当jenkins自动部署项目完成之后触发逻辑:进入项目文件夹 ——> 执行指令:sonar-scanner
集成gitlab:
通过git-runner执行脚本gitlab-ci.yml。当任意同事代码提交时直接触发gitlab-ci.yml。
gitlab-ci.yml触发sonarQube代码检查脚本比如:进入项目文件夹 ——> 执行指令:sonar-scanner
#执行 SonarQube 分析非常简单
sonar-scanner
-Dsonar.projectKey=go-gateway
-Dsonar.sources=.
-Dsonar.host.url=http://192.168.10.14:9000
-Dsonar.token=sqp_8aad21f2cdc5c5985c634f05a1120e001ccce35a
2.二进制方式
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.8.0.2856-linux.zip
unzip sonar-scanner-cli-4.8.0.2856-linux.zip
cd sonar-scanner-4.8.0.2856-linux/conf
vi sonar-scanner.properties
# 打开下面两项配置
sonar.host.url=http://localhost:9000 # 因为是在本地,不用修改了
sonar.sourceEncoding=UTF-8
# 并添加两行,写上登录SonarQube Web UI的账号密码
sonar.login=youraccount
sonar.password=yourpassword
3.配置环境变量
修改环境变量(下面的步骤使用root账号操作)
vi /etc/profile
在最下面添加一行并保存
export PATH="$PATH:/data/sonar-client/sonar-scanner-4.8.0.2856-linux/bin"
使配置生效
source /etc/profile
环境变量设置成功,可以在服务器的任何地方执行sonar-scanner命令了
sonar-scanner -v
4.代码扫描
a.从gitlab仓库拉取代码到服务器(实际使用中,按测试要求拉取对应tag的代码)
#git clone -b dev https://mengsy:Meng%40@gitlab.meta.com/backend/cpp-world.git
git clone -b dev https://mengsy:Meng%40@gitlab.meta.com/backend/go-gateway.git
b.添加扫描配置文件sonar-project.properties
进入项目代码的工程目录,在根目录下面新建一个配置文件sonar-project.properties
sonar-project.properties
# cd go-gateway/
# touch sonar-project.properties
# 写入如下的内容
# must be unique in a given SonarQube instance
sonar.projectKey=go-gateway
# --- optional properties ---
# defaults to project key
sonar.projectName=go-gateway # 修改成实际项目名称
# defaults to 'not provided'
sonar.projectVersion=dev-1.0 # 修改成代码实际的版本号
# Path is relative to the sonar-project.properties file. Defaults to .
sonar.sources=.
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
c.执行扫描
sonar-scanner
#ERROR: Error when running: 'node -v'. Is Node.js available during analysis?
d.查看结果
http://192.168.10.14:9000/projects