Jenkins 集成 SonarQube:代码扫描、质量门禁与 Pipeline 实践
Jenkins 集成 SonarQube 的目标,不只是“跑一次扫描”,更重要的是把代码质量门禁纳入 CI 流程:当代码存在严重 Bug、漏洞、坏味道或覆盖率不达标时,让流水线及时失败。
这篇文章整理 Jenkins、GitLab、SonarQube 的自动化扫描流程,重点说明 SonarScanner、Jenkins Credentials、Pipeline 和 Quality Gate。
CI/CD 系列文章
本文属于 Jenkins + GitLab + SonarQube CI/CD 系列,相关内容可以继续阅读:
- Git 提交规范实践:Conventional Commits、Commitizen 与 CHANGELOG 自动生成
- GitLab Docker 部署与 Personal Access Token 配置指南
- Jenkins 安装部署与 JDK、Maven、Agent 构建环境配置
- GitLab Webhook 触发 Jenkins Pipeline:Push、Tag 与 Merge Request 自动构建
- Jenkins 基于 GitLab 分支与 Tag 的自动化打包发布实践
- Jenkins 集成 SonarQube:代码扫描、质量门禁与 Pipeline 实践
- SonarQube Docker 部署与 Java 项目静态代码分析指南
- SonarQube for IDE 使用指南:IntelliJ 安装、Connected Mode 与规则同步
- SonarQube LTA 升级与数据库迁移指南:从旧版本到 8.9/9.9/2025 LTA
前提条件
需要准备:
- Jenkins 已安装 SonarQube Scanner 插件。
- Jenkins 已配置 JDK / Maven。
- SonarQube 已创建项目或允许自动创建项目。
- SonarQube Token 已保存到 Jenkins Credentials。
不要把 Token 明文写在 Shell 脚本中。
Jenkins 全局配置
路径:
Manage Jenkins -> System -> SonarQube servers
配置:
- Name:
sonarqube - Server URL:
http://sonarqube.example.com:9000 - Server authentication token:选择 Jenkins Credentials 中的 Secret text。
Maven 项目配置
推荐在项目根目录添加 sonar-project.properties,或通过 Maven 参数传入。
示例:
sonar.projectKey=demo-service
sonar.projectName=demo-service
sonar.sourceEncoding=UTF-8
sonar.sources=src/main/java
sonar.tests=src/test/java
sonar.java.binaries=target/classes
旧参数 sonar.language 已不建议继续使用。
Jenkinsfile 示例
pipeline {
agent any
tools {
jdk 'jdk17'
maven 'maven-3.9'
}
stages {
stage('Checkout') {
steps { checkout scm }
}
stage('Test') {
steps { sh 'mvn -B test' }
post {
always { junit 'target/surefire-reports/*.xml' }
}
}
stage('SonarQube Analysis') {
steps {
withSonarQubeEnv('sonarqube') {
sh 'mvn -B sonar:sonar -Dsonar.projectKey=demo-service'
}
}
}
stage('Quality Gate') {
steps {
timeout(time: 5, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
}
}
Quality Gate
Quality Gate 可以检查:
- 新代码 Bug 数。
- 漏洞数量。
- Code Smell。
- 覆盖率。
- 重复率。
- 安全热点。
建议从“新代码质量”开始设门禁,避免历史债务太多导致团队无法落地。
常见问题
1. sonar.java.binaries 缺失
Java 项目通常需要先编译,再扫描:
mvn clean verify sonar:sonar
2. Token 泄露
立即撤销 Token,在 Jenkins Credentials 中重新配置,不要在日志中打印。
3. Quality Gate 一直等待
检查 SonarQube Webhook 是否配置回 Jenkins:
<SonarQube>/admin/webhooks
Jenkins 回调地址通常类似:
https://jenkins.example.com/sonarqube-webhook/
4. JDK 版本解析错误
确保构建 JDK 与项目源码版本一致,并配置 sonar.java.source 或 Maven compiler 参数。
生产建议
- Token 放 Jenkins Credentials。
- 扫描和构建使用相同源码版本。
- 质量门禁先管新代码。
- MR 阶段执行扫描,发布阶段复用结果。
- SonarQube 项目 Key 命名规范化。
参考资料
License:
CC BY 4.0