前言

在追求快速交付的现代软件开发中,持续集成/持续交付(CI/CD) 是基石,而 Jenkins 作为其核心引擎,极大地提升了自动化构建和部署的效率。然而,速度不能以牺牲质量为代价。

SonarQube 作为领先的静态代码分析平台,能自动检测代码缺陷、安全漏洞和坏味道,是保障代码质量的利器。将 SonarQube 集成到 Jenkins 流水线中,可以在代码构建后立即自动进行深度质量扫描,实现:

  1. 质量左移: 提前发现并修复问题,降低后期成本。
  2. 自动化质量门禁: 只有通过质量阈值的代码才能进入后续流程。
  3. 即时反馈: 开发者快速获取本次提交的质量报告。

本文旨在清晰阐述 Jenkins 集成 SonarQube 的简单实践,帮助您在自动化流水线中无缝嵌入代码质量管控,实现高效与高质的软件交付。


1. 创建sonar目录

$ mkdir -p /data/sonar
$ cd /data/sonar
$ echo "vm.max_map_count=262144" >> /etc/sysctl.conf
$ sysctl -p

2. 编写Docker-conpose文件

$ vim docker-compose.yaml
version: '3'

services:
  sonarqube:
    image: sonarqube:lts-community
    ports:
      - '9000:9000'
    environment:
      SONAR_JDBC_URL: 'jdbc:postgresql://db:5432/sonardb'
      SONAR_JDBC_USERNAME: 'sonar'
      SONAR_JDBC_PASSWORD: 'sonar_password'
    restart: always
    volumes:
      - ./sonarqube/logs:/opt/sonarqube/logs
      - ./sonarqube/conf:/opt/sonarqube/conf
      - ./sonarqube/data:/opt/sonarqube/data
      - ./sonarqube/extensions:/opt/sonarqube/extensions
  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: 'sonar'
      POSTGRES_PASSWORD: 'sonar_password'
      POSTGRES_DB: 'sonardb'
    restart: always
    volumes:
      - ./postgres/postgresql:/var/lib/postgresql
      - ./postgres/data:/var/lib/postgresql/data
      - /etc/localtime:/etc/localtime:ro

3. 创建容器

$ docker-compose up -d

4. 目录授权

授权目录后重启容器

$ chmod 777 -R sonarqube
$ docker-compose restart

5. 创建用户密钥

SonarQube地址:http://IP:9000

默认账号:admin

默认密码:admin

My Account --> Security --> Generate Tokens --> Generate ,保存生成的用户token

image-20250626145442134

6. 扫描测试

6.1 安装sonar-scanner-cli

  • 下载 sonar-scanner-cli
$ wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.8.1.3023-linux.zip
$ unzip sonar-scanner-cli-4.8.1.3023-linux.zip  
$ mv sonar-scanner-cli-4.8.1.3023-linux /usr/local/sonar-scanner-4.8.1.3023-linux
  • 配置环境变量
$ vim /etc/profile
# sonar-scanner
export SONARRUNNER_HOME=/usr/local/sonar-scanner-4.8.1.3023-linux
export PATH=$SONARRUNNER_HOME/bin:$PATH
  • 生效配置
$ source /etc/profile

6.2 拉一个java测试项目代码

$ git clone https://github.com/hzbb2221/springboot-helloworld.git
$ cd springboot-helloworld
$ mvn clean install

6.3 代码质量扫描

$ sonar-scanner \
  -Dsonar.projectKey=springboot-helloworld \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://192.168.253.146:9000 \
  -Dsonar.login=sqa_9274d90b5e4fb4135d09e5724d2d5d1f9f66b424 \
  -Dsonar.java.binaries=./target/classes

参数说明

  • sonar.projectKey: 项目名称

  • sonar.sources:项目文件目录(当前目录)

  • sonar.host.url:sonarqube地址

  • sonar.login:登录token,可使用项目token或者用户token

  • sonar.java.binaries:指定Java项目编译后的.class文件目录(仅Java需要)

  • 集成到Jenkin CI中时,可增加以下两个参数:

    • sonar.qualitygate.wait:启用质量限制,禁止不满足规则的代码通过
    • sonar.qualitygate.timeout:超时配置,防止无限等待

6.4 代码质量阈值

image-20250701100209337

6.5 查看扫描报告

image-20250626150412377

7. Jenkins pipeline 集成

代码质量审查也可以集成进Maven中,但在实际项目中除java外还存在前端及其他语言的代码,所以这里统一用客户端扫描了。

pipeline {
    agent any

    stages {
        stage("1. 拉取代码") {
		...
        }
        
        stage("2. 编译应用") {
		...
        }
        
        stage("3. 代码审查") {
            steps {
                sh """
                sonar-scanner \
                  -Dsonar.projectKey=$JOB_NAME \
                  -Dsonar.sources=. \
                  -Dsonar.host.url=http://192.168.253.146:9000 \
                  -Dsonar.login=sqa_9274d90b5e4fb4135d09e5724d2d5d1f9f66b424 \
                  -Dsonar.java.binaries=./target/classes \
                  -Dsonar.qualitygate.wait=true \
                  -Dsonar.qualitygate.timeout=300
                """
            }
        }

        stage("4. 构建镜像") {
		...
        }

        stage("5. 上传镜像") {
		...
        }
        
        stage("6. 更新应用") {
		...
        }
        
    }
}
  • 执行 Build

image-20250627183223538

8. 查看代码审查报告

image-20250626174428699

image-20250626175828867

文章作者: hzbb
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 运维小记
DevOps 自动化 CICD
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝