Ubuntu 上用 Jenkins 做代码质量管理的落地方案
一 架构与工具选型
- 质量平台:使用 SonarQube Server + SonarScanner 做统一度量与趋势分析(支持多语言、规则可配置、质量门禁)。
- 静态检查:在构建阶段集成 Checkstyle、PMD、SpotBugs(Java),或使用 cppcheck(C/C++)等,形成多维质量画像。
- 流水线:用 Jenkinsfile 编排“拉代码 → 构建 → 测试 → 静态检查 → 质量门禁 → 报告归档/阻断发布”,实现质量内建与可重复执行。
二 安装与准备
- 安装 Jenkins(Ubuntu)
- 更新并安装:sudo apt-get update && sudo apt-get install jenkins
- 启动与自启:sudo systemctl start jenkins && sudo systemctl enable jenkins
- 安装 SonarQube Server(Ubuntu)
- 从官网下载解压,准备数据库(如 MySQL),修改 conf/sonar.properties 指向数据库,启动服务(如 bin/linux-x86-64/sonar.sh start)。
- 安装分析工具
- Java 项目:Checkstyle、PMD、SpotBugs(Maven/Gradle 插件或命令行)。
- C/C++ 项目:cppcheck(命令行)。
- 安装 Jenkins 插件
- 在 Manage Jenkins → Manage Plugins 安装:SonarQube Scanner for Jenkins、Checkstyle、PMD、SpotBugs 等。
三 配置 SonarQube 与 Jenkins 集成
- SonarQube 侧
- 登录后台,开启 Server authentication token,生成 Token(用户菜单 → My Account → Security → Tokens)。
- Jenkins 侧
- 在 Manage Jenkins → Manage Credentials 新增 Secret text 类型的凭证,保存生成的 Token。
- 在 Manage Jenkins → System → SonarQube servers 新增 SonarQube 服务:填写 Name、Server URL,选择上一步的 Token 凭证。
- 安装并配置 SonarQube Scanner(工具位置或自动安装)。
四 在流水线中执行质量检查与门禁
- 方式 A:使用 SonarScanner 分析(推荐)
- 在项目根目录放置 sonar-project.properties(示例):
- sonar.projectKey=my-project
- sonar.projectName=My Project
- sonar.projectVersion=1.0
- sonar.sources=src
- sonar.java.binaries=target/classes
- sonar.sourceEncoding=UTF-8
- Jenkinsfile 片段(声明式):
- environment {
SONAR_TOKEN = credentials(‘sonar-token-id’) // 上一步的凭证 ID
}
- stage(‘SonarQube Analysis’) {
steps {
withSonarQubeEnv(‘SonarQube’) {
sh ‘’’
sonar-scanner
-Dsonar.projectKey=my-project
-Dsonar.sources=src
-Dsonar.host.url=https://your-sonarqube.example.com
-Dsonar.login=$SONAR_TOKEN
‘’’
}
}
}
- stage(‘Quality Gate’) {
steps {
timeout(time: 1, unit: ‘HOURS’) {
waitForQualityGate abortPipeline: true
}
}
}
- 方式 B:并行运行 Checkstyle/PMD/SpotBugs 并归档报告
- Maven 项目示例(Jenkinsfile 片段):
- stage(‘Build & Test’) {
steps {
sh ‘mvn clean verify’
}
}
- stage(‘Static Analysis’) {
steps {
sh ‘mvn checkstyle:check pmd:pmd spotbugs:spotbugs’
}
post {
always {
recordIssues tools: [
checkStyle(pattern: ‘/target/checkstyle-result.xml’),
pmd(pattern: '/target/pmd.xml’),
spotBugs(pattern: ‘**/target/spotbugsXml.xml’)
]
}
}
}
- 方式 C:C/C++ 项目示例(cppcheck)
- stage(‘Cppcheck’) {
steps {
sh ‘cppcheck --enable=all --xml --output-file=cppcheck-report.xml src/’
}
post {
always {
recordIssues tools: [cppcheck(pattern: ‘cppcheck-report.xml’)]
}
}
}
- 说明
- 使用 withSonarQubeEnv 自动注入 SonarQube 环境变量;waitForQualityGate 会阻塞直至质量门禁结果返回,设置 abortPipeline: true 可在不达标时阻断后续阶段。
五 质量门禁与度量可视化
- 质量门禁
- 在 SonarQube → Quality Gates 定义规则(如 Bugs > 0 阻断、Code Smells > 阈值、Coverage < 阈值 阻断),Jenkins 流水线通过 waitForQualityGate 自动消费结果并阻断发布。
- 报告与趋势
- Jenkins 项目页面可查看 Checkstyle/PMD/SpotBugs 的趋势图与问题列表;SonarQube 提供 Issues、Code Smells、Duplications、Coverage、Complexity 等度量与历史趋势,便于持续改进。