SonarQube(四):Docker / Docker-Compose + Java 8 + Spring Boot 2 实战搭建

本文记录在 Java 8 + Spring Boot 2 技术栈下,使用 Docker / Docker Compose 搭建 SonarQube 并完成代码扫描的完整过程,适合本地或测试环境使用。

一、SonarQube 版本选择说明

sonarqube:7.8-community 是官方最后一个支持 JDK 1.8 的版本。

由于历史项目仍运行在 Java 8 + Spring Boot 2 上,理论上推荐使用 7.8-community

本文示例中 暂时使用 7.6-community(原理与配置完全一致)。

二、使用 Docker Compose 启动 SonarQube

1. docker-compose.yml

version: "3.8"

services:
  sonarqube:
    image: sonarqube:7.6-community
    container_name: sonarqube
    depends_on:
      - postgres
    environment:
      sonar.search.javaOpts: "-Xms1024m -Xmx1024m"
      sonar.jdbc.url: jdbc:postgresql://postgres:5432/sonar
      sonar.jdbc.username: sonar
      sonar.jdbc.password: sonar
    ports:
      - "59000:9000"
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs

  postgres:
    image: postgres:10
    container_name: sonarqube-postgres
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgres_data:

2. 关键说明(非常重要)

(1)为什么 SonarQube 的环境变量是 小写

这是 历史设计问题,并非 Docker Compose 的限制。

这些配置项本质上映射到容器内的:

/opt/sonarqube/conf/sonar.properties

如果有疑问,可以进入容器查看该文件中的 key 定义。

(2)PostgreSQL 版本限制

  • SonarQube 7.x 不支持高版本 PostgreSQL
  • 建议使用:postgres:9.6postgres:10

否则可能出现:

  • 启动失败
  • 无法初始化 schema
  • 隐性兼容问题

(3)Elasticsearch 内存是否生效如何确认?

sonar.search.javaOpts: "-Xms1024m -Xmx1024m"

启动后,可在 SonarQube 管理页面查看:

Administration → System

确认 Elasticsearch JVM 参数是否生效,避免 OOM。

三、Spring Boot 2 项目接入 SonarQube

1. Maven 插件配置

pom.xml 中加入 Sonar 扫描插件(最后一个支持java8的版本):

<plugin>
    <groupId>org.sonarsource.scanner.maven</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>3.6.0.1398</version>
</plugin>

2. 使用 Maven Profile 管理 Sonar 配置(推荐)

<profiles>
    <profile>
        <id>sonar</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <sonar.host.url>http://domain-or-ip:port</sonar.host.url>
            <sonar.login>token</sonar.login>
        </properties>
    </profile>
</profiles>

Token 获取方式

SonarQube → My Account → Security → Generate Token

⚠ 注意:Token 只会显示一次,请妥善保存。

四、执行代码扫描

1. 完整命令(不使用 Profile)

mvn clean verify sonar:sonar \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=YOUR_TOKEN

2. 使用 Profile 后的简化命令(推荐)

mvn clean verify sonar:sonar

五、查看 SonarQube 分析结果

浏览器访问:

http://domain-or-ip:59000

默认用户名/密码是admin/admin。

即可进入 SonarQube 控制台,查看:

  • Bugs
  • Vulnerabilities
  • Code Smells
  • Coverage
  • Duplication

六、总结

  • Java 8 项目务必选择 SonarQube 7.x
  • PostgreSQL 版本不要过高
  • Elasticsearch 内存配置必须检查是否生效
  • 使用 Maven Profile 可以显著简化扫描命令

该方案非常适合老项目(Spring Boot 2 + Java 8)进行代码质量治理与技术债管理。

七、附件

download code