avatar

Ryan's Blog

The first step is always the hardest.

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于
  • 工具
Home Jenkins 集成 SonarQube:代码扫描、质量门禁与 Pipeline 实践
文章

Jenkins 集成 SonarQube:代码扫描、质量门禁与 Pipeline 实践

Posted 2022-01-12 Updated 18 days ago
By Ryan Chen
11~15 min read

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 命名规范化。

参考资料

  • SonarScanner CLI 文档
  • Jenkins SonarQube Scanner 插件
  • Jenkins Pipeline
指南
Jenkins GitLab SonarQube SonarScanner Quality Gate Pipeline 代码质量 CI/CD
License:  CC BY 4.0
Share

Further Reading

Jun 27, 2026

Agent 架构设计原则:Router、Runtime 与 Business Script 的职责划分

本文整理一套适合 Router Agent + Skill + Runtime 架构的设计原则:Agent 只负责业务决策,Runtime 统一负责执行、恢复、Trace、Checkpoint 和 Evidence,Business Script 只做确定性业务执行。

Sep 9, 2024

Redis 核心概念、数据结构与高可用架构详解

系统梳理 Redis 的核心数据类型、底层结构、过期与淘汰、持久化、事务、主从复制、Sentinel、Cluster、缓存一致性和分布式锁等机制,适合作为 Redis 学习、面试复习和高可用架构设计参考。

Sep 5, 2024

B+树原理与 MySQL InnoDB 索引机制解析

本文从 B+ 树的多叉平衡结构、叶子节点链表、范围查询和磁盘 I/O 特性出发,解释数据库索引为什么常采用 B+ 树,并结合 MySQL InnoDB 的聚簇索引、二级索引、回表、覆盖索引和联合索引机制理解其实际应用。

OLDER

Git 提交规范实践:Conventional Commits、Commitizen 与 CHANGELOG 自动生成

NEWER

Jenkins 基于 GitLab 分支与 Tag 的自动化打包发布实践

Recently Updated

  • Agent 架构设计原则:Router、Runtime 与 Business Script 的职责划分
  • RocketMQ 架构设计与应用最佳实践:高可用消息队列核心解析
  • Redis 核心概念、数据结构与高可用架构详解
  • B+树原理与 MySQL InnoDB 索引机制解析
  • MySQL AUTO_INCREMENT 插入 0 变成自增值的原因与解决方案

Trending Tags

RocketMQ Windows Feign Docker Zipkin SonarQube OkHttp HttpClient API 性能优化

Contents

©2026 Ryan's Blog. Some rights reserved. · 粤ICP备2022031588号