主题
Jenkins&Sonarqube代码质量平台
一、SonarQube 简介
SonarQube是一个开源的代码质量管理平台,用于持续评估和分析代码质量。它可以检测代码中的错误、漏洞和代码异味,并提供详细的报告和指标,帮助开发团队提高代码质量。
SonarQube支持多种编程语言,支持25种以上的常见编程语言,如java、pyhton、go、c、JavaScript等。并提供了丰富的插件生态系统,可以根据项目需求进行扩展。
主要功能包括:
- 代码质量分析
- 安全漏洞检测
- 代码覆盖率统计
- 代码重复度检测
- 技术债务管理
- 持续集成支持
1.1 SonarQube平台安装配置
1.1.1 组件与服务组成
SonarQube平台由以下几个主要组件组成:
SonarQube服务器:核心组件,提供Web界面、API接口和配置管理功能。
数据库:存储SonarQube的配置和分析结果。支持PostgreSQL、MySQL、Oracle和Microsoft SQL Server等数据库。
SonarQube Scanner:执行代码分析的客户端工具,可以集成到构建工具或CI/CD流水线中。
Web服务器:提供Web界面访问,默认使用内嵌的Jetty服务器。
Elasticsearch:用于存储和搜索代码分析结果,提供高效的查询性能。
1.1.2 安装配置(基于Docker部署SonaQube)
使用Docker Compose是部署SonarQube最简单的方式之一。以下是详细的部署步骤:
前置条件:
- 安装Docker和Docker Compose
- 确保主机满足SonarQube的系统要求:
- 至少4GB内存
系统参数调整(Linux系统)【⚠️ 不设置会导致内置的ES 启动失败) 】:
bash
# 编辑系统配置文件
vim /etc/sysctl.conf
# 添加以下内容
vm.max_map_count=262144
# 应用更改
sysctl -p
创建Docker Compose文件:
创建docker-compose.yml
文件,内容如下:
yaml
services:
sonarqube:
image: docker.cnb.cool/srebro/docker-images-chrom/sonarqube:25.4.0.105899-community ##使用CNB镜像加速
#image: sonarqube:25.4.0-community
hostname: sonarqube
container_name: sonarqube
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- /home/application/sonarqube/sonarqube_extensions:/opt/sonarqube/extensions # 插件扩展持久化
- /home/application/sonarqube/sonarqube_logs:/opt/sonarqube/logs # 日志持久化
- /home/application/sonarqube/sonarqube_data:/opt/sonarqube/data # 数据持久化
ports:
- "9000:9000"
db:
image: docker.cnb.cool/srebro/docker-images-chrom/postgres:17 ##使用CNB镜像加速
#image: postgres:17
hostname: postgresql
container_name: postgresql
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
volumes:
- /home/application/sonarqube/pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
创建目录结构并授权:
bash
mkdir -p /home/application/sonarqube/{sonarqube_extensions,sonarqube_logs,sonarqube_data,pgdata}
chmod -Rf 777 /home/application/sonarqube/
启动SonarQube:
bash
docker-compose up -d
验证安装:
访问http://your-server-ip:9000
,默认管理员账号和密码为:
- 用户名:admin
- 密码:admin
首次登录后,系统会要求修改默认密码。
WARNING
注意事项:
- SonarQube首次启动可能需要几分钟时间
- 如果遇到问题,可以查看容器日志:
docker logs sonarqube
1.1.3 SonarQube安装中文插件
SonarQube默认界面为英文,可以通过安装中文插件来支持中文界面:
下载中文语言包插件:
- 访问SonarQube的插件市场:
Administration > Marketplace
- 搜索"Chinese Pack"
- 点击"Install"安装插件
- 访问SonarQube的插件市场:
手动安装中文插件:
从SonarQube插件页面下载指定版本的中文语言包jar文件
将jar文件放置到SonarQube的插件目录:
/home/application/sonarqube/sonarqube_extensions/plugins/
重启SonarQube容器:
docker restart sonarqube
1.1.4 SonarQube配置认证令牌
- 访问右上角:
我的账户 > 安全
- 输入
令牌名称
- 选择
选择令牌类型 > 全局分析令牌
- 输入
过期时间 > 永不过期
- 复制生成的令牌,保存到安全的地方
1.2 SonarScanner使用方法
SonarScanner是SonarQube的客户端工具,用于执行代码分析并将结果上传到SonarQube服务器。根据项目类型和构建工具,选择使用不同的SonarScanner。
1.2.1 使用二进制方式运行SonarScanner CLI
安装步骤:
- 从SonarQube下载页面下载适合你操作系统的SonarScanner压缩包
- 解压到指定目录
bash
unzip -xvf sonar-scanner-cli-7.1.0.4889-linux-x64.zip -d /home/application/
mv /home/application/sonar-scanner-7.1.0.4889-linux-x64 /home/application/sonar-scanner
- 将SonarScanner的bin目录添加到PATH环境变量
bash
cat >> /etc/profile << 'EOF'
#sonar-scan
export SONAR_SCANNER_HOME=/home/application/sonar-scanner
export PATH=$SONAR_SCANNER_HOME/bin:$PATH
EOF
# 使配置生效
source /etc/profile
- 测试生效
bash
sonar-scanner -v
17:32:02.816 INFO Scanner configuration file: /home/application/sonar-scanner/conf/sonar-scanner.properties
17:32:02.819 INFO Project root configuration file: NONE
17:32:02.834 INFO SonarScanner CLI 7.1.0.4889
17:32:02.835 INFO Java 17.0.13 Eclipse Adoptium (64-bit)
17:32:02.836 INFO Linux 5.10.0-209.0.0.117.oe2203sp3.x86_64 amd64
WARNING
默认安装的sonarscanner是使用自带的jdk, 如果想使用系统默认的jdk版本,可以修改scanner可执行程序的配置。
bash
vim /home/application/sonar-scanner/bin/sonar-scanner
### 编辑约第42行, true改成false
42 use_embedded_jre=false
43 if [ "$use_embedded_jre" = true ]; then
44 export JAVA_HOME="$sonar_scanner_home/jre"
45 fi
### 验证
sonar-scanner -v
17:32:02.816 INFO Scanner configuration file: /home/application/sonar-scanner/conf/sonar-scanner.properties
17:32:02.819 INFO Project root configuration file: NONE
17:32:02.834 INFO SonarScanner CLI 7.1.0.4889
17:32:02.835 INFO Java 11.0.2 Eclipse Adoptium (64-bit)
17:32:02.836 INFO Linux 5.10.0-209.0.0.117.oe2203sp3.x86_64 amd64
使用配置文件方式读取扫描:
INFO
项目代码: https://cnb.cool/sre-demo/opforge/cicd/maven-demo.git
关于sonar-scanner 运行的参数可以参考:https://docs.sonarqube.org/latest/analysis/analysis-parameters/
bash
cat >> myproject.properties << 'EOF'
# 必须是唯一的项目标识符
sonar.projectKey=my-project
# 项目名称和版本
sonar.projectName=my-project
sonar.projectVersion=1.0
# 源代码目录路径
sonar.sources=./src/main/java
# 编程语言
sonar.language=java
# 字符编码
sonar.sourceEncoding=UTF-8
# 是否显示详细日志
sonar.verbose=false
# SonarQube服务器URL
sonar.host.url=http://172.22.33.207:9000
# 认证令牌(在SonarQube中生成)
sonar.token=sqa_xxxe6d4724xxx0eb8af8266c4
EOF
bash
#指定配置文件
sonar-scanner -Dproject.settings=myproject.properties
使用命令行方式读取扫描:
bash
sonar-scanner \
-Dsonar.projectKey=my-project-1 \
-Dsonar.projectName=my-project-1 \
-Dsonar.host.url=http://172.22.33.207:9000 \
-Dsonar.sourceEncoding=UTF-8 \
-Dsonar.verbose=false \
-Dsonar.token=sqa_xxxe6d4724xxx0eb8af8266c4 \
-Dsonar.sources=./src/main/java \
-Dsonar.language=java
1.2.2 使用Docker方式运行SonarScanner
使用Docker运行SonarScanner无需在本地安装SonarScanner,适合CI/CD环境:
- 官方示例说明
bash
docker run \
--rm \
-e SONAR_HOST_URL="https://${SONAR_HOST_URL}" \ ## sonarqube服务器地址
-v "${PROJECT_BASEDIR}:/usr/src" \ ## 项目根目录
sonarsource/sonar-scanner-cli
bash
cat >> myproject.properties << 'EOF'
# 必须是唯一的项目标识符
sonar.projectKey=sonar-demo-maven
# 项目名称和版本
sonar.projectName=sonar-demo-maven
sonar.projectVersion=V1.0
# 源代码目录路径
sonar.sources=./src/main/java
# 编程语言
sonar.language=java
# 字符编码
sonar.sourceEncoding=UTF-8
# 是否显示详细日志
sonar.verbose=false
# SonarQube服务器URL
sonar.host.url=http://172.22.33.207:9000
# 认证令牌(在SonarQube中生成)
sonar.token=sqa_xxxe6d4724xxx0eb8af8266c4
EOF
bash
docker run --rm -v "/root/maven-demo:/usr/src" sonarsource/sonar-scanner-cli
1.2.3 各种语言的扫描示例
bash
sonar-scanner \
-Dsonar.projectKey=demo-java \
-Dsonar.projectName=demo-java \
-Dsonar.sources=src \
-Dsonar.language=java \
-Dsonar.host.url=http://172.22.33.207:9000 \
-Dsonar.token=sqa_454efabf263d0aeb867f0e8034c6407938f89d91 \
-Dsonar.projectVersion=V1.0 \
-Dsonar.ws.timeout=30 \
-Dsonar.projectDescription="my first project!" \
-Dsonar.java.binaries=target/classes \
-Dsonar.java.test.binaries=target/test-classes \
-Dsonar.java.surefire.report=target/surefire-reports \
-Dsonar.sourceEncoding=UTF-8
bash
sonar-scanner \
-Dsonar.projectKey=demo-js \
-Dsonar.projectName=demo-js \
-Dsonar.sources=src \
-Dsonar.language=javascript \
-Dsonar.host.url=http://172.22.33.207:9000 \
-Dsonar.token=sqa_454efabf263d0aeb867f0e8034c6407938f89d91 \
-Dsonar.projectVersion=V1.0 \
-Dsonar.ws.timeout=30 \
-Dsonar.projectDescription="my first project!" \
-Dsonar.sourceEncoding=UTF-8
bash
sonar-scanner \
-Dsonar.projectKey=demo-go \
-Dsonar.projectName=demo-go \
-Dsonar.sources=. \
-Dsonar.language=go \
-Dsonar.host.url=http://172.22.33.207:9000 \
-Dsonar.token=sqa_454efabf263d0aeb867f0e8034c6407938f89d91 \
-Dsonar.projectVersion=V1.0 \
-Dsonar.ws.timeout=30 \
-Dsonar.projectDescription="my first project!" \
-Dsonar.exclusions=**/*_test.go \
-Dsonar.tests=. \
-Dsonar.test.inclusions=**/*_test.go \
-Dsonar.sourceEncoding=UTF-8