使用 Docker 搭建 SonarQube

1,313 阅读2分钟

背景

在工作为验证一个开源系统的效果,我喜欢使用 Docker 快速搭建系统集成,加上 docker compose 的编排就很不错,也能快速的理清系统的依赖关系,最近需要使用代码扫描,基于 docker

避坑指南

内存分配需求

在 Mac/Windows 中,需要在 Docker Desktop 中将 Docker 的可分配内存大于 2G,否则 SonarQube web 服务启动不了

image.png

Linux 文件描述符配置

缺少以下这个配置,在 linux 中 SonarQube 也会启动不了

sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192

Ref:hub.docker.com/_/sonarqube

image.png

多分支增量

Sonar Community 版本可以使用插件 sonarqube-with-community-branch-plugin 进行多分支增量扫描,可统计增量代码、增量覆盖率

image.png

使用插件镜像(快速验证推荐)

可食用 sonarqube-with-community-branch-plugin 的镜像,已经配置好相应的环境变量,只需再把 sonarqube-with-community-branch-plugin 的 jar 放到映射的 extensions 目录中即可

image.png

使用 SonarQube 官方镜像(需要集成其他插件推荐)

不使用插件镜像,要使用 sonarqube-community-branch-plugin 需要配置插件需要使用的环境变量,具体是在 docker-compose 中的 environment 中配置以下两个环境变量

# - SONAR_WEB_JAVAADDITIONALOPTS=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-x.xx.x.jar=web
# - SONAR_CE_JAVAADDITIONALOPTS=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-x.xx.x.jar=ce

这里从 GitHub 下载插件时,我在使用时发现总是会报错,找不到 Pre Main class,需要重新编译, 这里还未尝试,除此之外,该插件需要注意版本兼容,在插件的 Github 中有注明对应的版本兼容性,祝大家不会踩坑

其他坑

注意版本兼容问题

实操

Volume 最佳实践

由于在本机器中使用了 docker compose 搭建了许多服务,因此为了保证各服务不串数据,我都会在对应的目录下存储对应的服务数据,如下推荐

.
├── README.md
├── config
│   └── sonar.properties
├── data
│   ├── postgre
│   │   └── data
│   └── sonar
│       ├── bundled-plugins
│       ├── data
│       ├── extensions
│       └── lib
└── docker-compose.yml

配置文件

docker-compose.yml

version: "3"

services:
  sonarqube:
    # image: sonarqube:8.3.1-community
    image: mc1arke/sonarqube-with-community-branch-plugin:8.9-community
    container_name: sonarqube
    restart: 'no'
    networks:
      - sonarnet
    environment:
      - sonar.jdbc.username=sonar
      - sonar.jdbc.password=sonar
      - sonar.jdbc.url=jdbc:postgresql://sonarqube-postgre:5432/sonarqube
      - sonar.search.javaOpts=-Xms256m -Xmx256m
    ports:
      - "9010:9000"
      - "9011:9092"
    depends_on:
      - sonarqube-postgre
    links:
      - sonarqube-postgre
    volumes:
      - /Users/willijk/docker/sonarqube/data/sonar/data:/opt/sonarqube/data
      - /Users/willijk/docker/sonarqube/data/sonar/extensions:/opt/sonarqube/extensions
      - /Users/willijk/docker/sonarqube/data/sonar/bundled-plugins:/opt/sonarqube/lib/bundled-plugins
  sonarqube-postgre:
    image: postgres:12.3
    container_name: sonarqube-postgre
    restart: 'no'
    ports:
      - "5432:5432"
    networks:
        - sonarnet
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
      - POSTGRES_DB=sonarqube
    volumes:
      - /Users/willijk/docker/sonarqube/data/postgre:/var/lib/postgresql
      - /Users/willijk/docker/sonarqube/data/postgre/data:/var/lib/postgresql/data


networks:
  sonarnet:
    driver: bridge

效果

访问 ip:9010

image.png