SonarQube 的安装(docker)与使用

简介

SonarQube(原名Sonar)是一个开源的代码质量管理系统,可以扫描项目中重复代码、编码标准、单元测试、代码覆盖率、代码复杂度、潜在Bug、注释等.

支持Java、C/C++、C#、PHP、Flex、Groovy、JavaScript、Python等多种语言.

代码扫码的好处在于通过配置规则扫描代码设计缺陷和代码优化从而提高代码的质量.
本文介绍使用docker技术搭建SonarQube环境并扫描代码.

环境搭建

快速启动

这种方式启动sonarqube是没有数据存储的,docker重新加载后数据不会reload数据.

docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube:lts

浏览器打开:0.0.0.0:9000
帐号密码:admin、admin

全配置启动

docker启动postgres

使用postgres作为数据存储,通过如下命令启动:

docker run --name postgres -e POSTGRES_PASSWORD=password -e POSTGRES_USER=sonar -p 5432:5432 -d postgres:9.4

sonarqube不支持mysql5.5版本,最低支持5.6版本

docker启动sonarqube

需要注意两点:

  • 需要先启动postgres,数据库会自动创建
  • 本地搭建ip地址不能写localhost,需要写内网ip
    启动命令如下:
docker run -d --name sonarqube \
    -p 9000:9000 \
    -p 9092:9092 \
    -e sonar.jdbc.username=sonar \
    -e sonar.jdbc.password=password \
    -e sonar.jdbc.url=jdbc:postgresql://db:5432/sonar \
    --link postgres:db \
    sonarqube

浏览器打开:0.0.0.0:9000
帐号密码:admin、admin

docker-compose启动

先从官网下载sonarqube6.7版本,解压后重命名为sonarqube。在目录中新建一个docker-compose.yaml文件,内容如下:

version: "3.3"
services:
  db:
    image: postgres
    container_name: postgres
    ports:
        - "5432:5432" 
    environment:
        - POSTGRES_USER=sonar 
        - POSTGRES_PASSWORD=sonar
    volumes:
        - /var/lib/postgresql/data
    networks:
      main:
        aliases:
          - db

  adminer:
    image: adminer
    restart: always
    ports:
      - 8088:8080
    networks:
      main:
        aliases:
          - adminer

  sonarqube:
    image: sonarqube:6.7-community
    container_name: sonarqube
    ports:
      - "9000:9000"
      - "9092:9092"
    volumes:
        - ~/sonarqube/conf:/opt/sonarqube/conf
        - ~/sonarqube/data:/opt/sonarqube/data
        - ~/sonarqube/extensions:/opt/sonarqube/extensions
        - ~/sonarqube/elasticsearch:/opt/sonarqube/elasticsearch
    environment:
      - SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar
    privileged: true
    networks:
      main:
        aliases:
          - sonarqube

networks:
  main:

这样启动的好处是,可以方便的手动安装插件,也可以保证每次重启sonarqube服务之后,数据仍然保留。建议可以提前手动下载一些常用插件,如汉化,Android lint插件

如果需要配置域名,可以自己用nginx做个反向代理就OK了。

效果

启动成功以后,第一次页登录成功后会设置token,这个token是以后被扫描代码工程中需要配置的,用于通过token的方式连接Sonarqube平台传数据结果

安装插件

使用admin账户登陆sonar之后,在配置中点击应用市场,安装需要的插件
常用的插件有

  • sonar-l10n-zh-plugin (汉化插件)
  • sonar-android-plugin (Android代码规则)
  • sonar-jacoco-plugin (jacoco代码覆盖率插件)
  • sonar-java-plugin (Java代码规则插件,默认已经安装好了建议更新)

使用sonar扫描代码

maven项目配置

直接在项目目录中运行如下命令

mvn sonar:sonar   -Dsonar.host.url=http://localhost:9000   -Dsonar.login=token

如果没有设置权限,也可以不写后面的token
扫描结果如下

gradle项目配置

gradle需要先配置下build.gradle文件,加入如下配置:

apply plugin: "org.sonarqube"
    sonarqube {
        properties {
            property "sonar.host.url", "http://localhost:9000"  //sonar管理系统地址
            property "sonar.login", "admin" // sonar管理系统账号
            property "sonar.password", "admin" // sonar管理系统密码
            property "sonar.sourceEncoding", "UTF-8"  //编码格式
            property "sonar.surefire.reportsPath", "build/sonar"  //soanr结果生成路径
            property "sonar.junit.reportsPath", "build/sonar"  //单元测试报告生成路径
            property "sonar.sources", "src/main/java"    //源代码路径
            property "sonar.projectName", "xxxx"  //项目名称
            property "sonar.language", "java"
        }
    }

如果是android多模块开发的,只想要扫描其中一个模块,则需要在该模块的build.gradle文件中单独加入如上配置
然后如果不需要跳过单元测试,则直接运行:

./gradlew sonarqube 

需要跳过单元测试的话,后面加上-x test

nodejs项目配置

nodejs的项目,需要先用npm安装一个sonar-scanner,运行命令npm -g install sonar-scanner 安装。安装完成后再项目目录运行下面的命令:

sonar-scanner -Dsonar.host.url=http://localhost:9000  -Dsonar.login=token

sonar-project.properties文件示例

可以通过编写sonar-project.properties文件,实现自定义扫描代码。

#----- Default SonarQube server
#sonar.host.url=http://sonar.com.cn
# 项目key
sonar.projectKey=xxxx
# 项目名称
sonar.projectName=aaaaa
# 项目版本,可以写死,也可以引用变量
sonar.projectVersion=1.0.0
# 源文件编码
sonar.sourceEncoding=UTF-8
# 源文件语言
sonar.language=java
# path to source directories (required)
# 源代码目录,如果多个使用","分割 例如:mode1/src/main,mode2/src/main
sonar.sources=src/main
# 单元测试目录,如果多个使用","分割 例如:mode1/src/test,mode2/src/test
sonar.tests=src/test
# path to project binaries (optional), for example directory of Java bytecode
# java字节码目录
sonar.binaries=target/classes
# Exclude the test source
# 忽略的目录
#sonar.exclusions=*/src/test/**/*
# 单元测试报告目录
sonar.junit.reportsPath=target/surefire-reports
# 代码覆盖率插件
sonar.java.coveragePlugin=jacoco
# jacoco.exec文件路径
sonar.jacoco.reportPath=target/coverage-reports/jacoco.exec
# 这个没搞懂,官方示例是配置成jacoco.exec文件路径
sonar.jacoco.itReportPath=target/coverage-reports/jacoco-it.exec

将该文件放入项目目录,然后运行sonar-scanner -X进行代码扫描

总结

常见的sonar代码扫描如上,iOS由于没有使用过,所以不知道怎么配置,看教程像是很复杂的样子。等以后接触了,再来更新。