sonar代码静态扫描

sonar 介绍

Sonar全称SonarQube是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以多维度检测代码质量,是代码审查利器

通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测 ,可以帮我们分析bug, 漏洞,异味,代码覆盖率,及代码重复问题。

image-20220712210238139

Sonar 并不是简单地把不同的代码检查工具结果直接显示在 WEB页 面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便的不同规模和种类的工程进行代码质量管理。

sonar-7.8 win安装与配置

  • 使用 sonarqube 对 java 项目代码进行扫描的时候,java 项目的版本不能低于 sonar 的编译版本。

  • sonarqube:7.8-community 是 sonar 对 jdk1.8 的最后一个版本,从 7.9 以后 sonar 最低支持版本为 jdk 1.11

  • 7.8版本以后不再支持MySQL,将使用PostgreSQL

  • 由于项目java项目是使用jdk1.8编译的,因此这里安装sonar-7.8版本为例

环境准备

  1. jdk 1.8 下载并安装(略)

    百度网盘分享链接

  2. sonarqube 7.8下载:https://www.sonarqube.org/

    百度网盘分享链接

  3. sonar-scanner 4.2.0 下载:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/

    百度网盘分享链接

  4. postgresql 12.11 下载:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

    百度网盘分享链接

image-20220712212658303

PostgreSQL安装与配置

PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS)

安装PostgreSQL

  1. 双击exe安装包,一路next。只需修改安装路径,设置超级用户密码,其他选项建议默认值即可

    超级用户用户名为:postgres

配置PostgreSQL

  1. 运行pgAdmin4,以postgres用户登陆成功后,创建为sonarQube专用的sonar用户

    image-20220712214448153

    如下图,在General中设置用户名为sonar,Privileges中控制权限。用户名为sonar,密码为sonar

    image-20220712214625639

    image-20220712214929232

    image-20220712215003059

    image-20220712215216480

  2. 创建成功之后,在面板当中可看到sonar用户。

    image-20220712215538667

  3. 创建sonar7.8数据库,所属者设为sonar

    image-20220713084733840

SonarQube安装与启动

配置SonarQube

  1. 下载完后,是一个 zip 压缩包。直接解压到目标目录即可,这里解压到D:\sonarqube-7.8

  2. conf\sonar.properties 中正确配置数据库信息,内容如下

    # User credentials.
    # Permissions to create tables, indices and triggers must be granted to JDBC user.
    # The schema must be created first.
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    
    #----- PostgreSQL 9.3 or greater
    # By default the schema named "public" is used. It can be overridden with the parameter "currentSchema".
    #sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema
    sonar.jdbc.url=jdbc:postgresql://127.0.0.1/sonar7.8?currentSchema=public
  3. 注意在conf/wrapper.conf中指定jdk(如果已设置jdk环境变量,可忽略),如下

    wrapper.java.command=C:\Program Files\Java\jdk1.8.0_161\bin\java.exe

启动SonarQube

  1. 执行bin目录下的启动脚本

    image-20220712221138919

  2. 访问 http://127.0.0.1:9000/, 管理员账号密码默认为 admin

    image-20220712221350969

SonarScanner安装与使用

安装SonarScanner

  1. 下载完后,是一个 zip 压缩包。直接解压到目标目录即可,这里解压到D:\sonar-scanner

  2. 配置系统环境变量

    SONAR_SCANNER_HOME=D:\sonar-scanner
    PATH=%PATH%;%SONAR_SCANNER_HOME%\bin
  3. 检查是否安装成功

    sonar-scanner --version

image-20220712211554037

  1. SonarScanner配置文件

    #----- Default SonarQube server
    sonar.host.url=http://localhost:9000
    
    #----- Default source code encoding
    sonar.sourceEncoding=UTF-8
    • 其中 sonar.host.url 配置项是 SonarQube 服务器的地址,根据具体情况配置

使用SonarScanner静态分析

  1. 项目配置

    在项目根目录中,创建配置文件sonar-project.properties

    # 项目名称
    sonar.projectKey=demo-mgr
    sonar.projectName=demo-mgr
    sonar.projectVersion=1.0
    
    #代码路径
    sonar.sources=./src
    
    # class路径
    sonar.java.binaries=./target/classes
    
    # 语言格式
    sonar.language=java
    # 项目多模块情况
    # 项目名称
    sonar.projectName=demo
    sonar.projectKey=demo
    sonar.projectVersion=0.0.0.1
    
    # sonar 配置
    sonar.forceAnalysis=true
    sonar.sourceEncoding=UTF-8
    sonar.language=java
    sonar.login=admin
    sonar.password=admin
    
    
    #代码路径
    sonar.sources=src/main/java
    sonar.modules=moduleOne,moduleTwo
    # moduleOne.sonar.modules=oneSub1,oneSub2
    
    # class路径
    sonar.java.binaries=./target/classes
    
    
  2. 执行扫描

    sonar-project.properties所在目录中,执行扫描命令如下:

    sonar-scanner

    分析成功如下:

    image-20220712224257818

  3. 查看分析报告

    image-20220712224321805

sonar-8.9 win安装与配置

环境准备

  1. jdk 1.11 下载并配置好JDK环境变量(略)

    百度网盘分享链接

  2. sonarqube 8.9 下载:https://www.sonarqube.org/

    百度网盘分享链接

  3. sonar-scanner 4.2.0 下载:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/

    百度网盘分享链接

  4. postgresql 12.11 下载:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

    百度网盘分享链接

安装与配置

安装与配置过程同前面《sonar-7.8 win安装与配置

区别位置:

  1. 注意需安装jdk 1.11

  2. 配置PostgreSQL时,可以创建数据库名sonar8.9以区分

  3. 配置SonarQube时,注意在conf/wrapper.conf指定jdk,如下

    wrapper.java.command=C:\Program Files\Java\jdk-11.0.6\bin\java.exe
  4. 配置SonarQube时,注意在conf\sonar.properties正确配置数据库信息,如下

    # User credentials.
    # Permissions to create tables, indices and triggers must be granted to JDBC user.
    # The schema must be created first.
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    
    #----- PostgreSQL 9.3 or greater
    # By default the schema named "public" is used. It can be overridden with the parameter "currentSchema".
    #sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema
    sonar.jdbc.url=jdbc:postgresql://127.0.0.1/sonar8.9?currentSchema=public

sonar 代码扫描

mvn配合使用

jenkins配置使用

pycharm配置使用

sonar 设置

新代码周期

安装插件sonarqube-community-branch-plugin:https://github.com/mc1arke/sonarqube-community-branch-plugin/releases

sonar8.9对应插件sonarqube-community-branch-plugin-1.8.1.jar 网盘下载:https://pan.baidu.com/s/1tQtSnyaX3owCiMVdFI3yZw?pwd=pl5o

image-20220713140838695

sonar 规则

将PMD规则添加到JAVA项目

  1. 下载安装PMD插件:https://github.com/jborgers/sonar-pmd/releases

    将下载后的jar包放到`extensions\plugins目录下,重启sonarqube即可

  2. 添加pmd规则

    image-20220713151826541

    复制内置规则,然后编辑规则:激活更多规则,设置为默认或在规则内指定项目。

版本问题

  • 如果我们项目项目用的是jdk1.8,同时还使用了1.8里面的一些后续版本不在兼容的包类,如:rt.jar里面的sun.misc.BASE64Decoderjavax.xml.bind.Marshaller等。用jdk11来运行就会报错。

    mvn clean test sonar:sonar
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project iccboy-sonar-test: Compilation failure
    [ERROR] /opt/code/iccboy-sonar-test/iccboy-sonar/iccboy-sonar-common/src/main/java/com/iccboy/sonar/test/common/utils/FileUtil.java:[8,16] 找不到符号
    [ERROR]   符号:   类 BASE64Decoder
    [ERROR]   位置: 程序包 sun.misc
  • 如果我们用jdk8来执行,则优化报sonar的class编译文件解析不对的问题(Java.lang.UnsupportedClassVersionError)

    mvn clean test sonar:sonar
    [ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar (default-cli) on project iccboy-sonar-test: Execution default-cli of goal org.sonarsou
    rce.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar failed: An API incompatibility was encountered while executing org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar:
    java.lang.UnsupportedClassVersionError: org/sonar/batch/bootstrapper/EnvironmentInformation has been compiled by a more recent version of the Java Runtime (class file version 55.0), th
    is version of the Java Runtime only recognizes class file versions up to 52.0

为了解决上面的问题,则将命令分步骤执行

  • 第一步先用jdk8执行项目的编译和测试

    export JAVA_HOME=/usr/local/jdk8/jdk1.8.0_211
    mvn clean test
  • 第二步再用jdk11执行sonar命令

    export JAVA_HOME=/usr/local/jdk11/jdk-11.0.14
    mvn sonar:sonar

如果是windows环境,则将export改为set


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
My Show My Code