gradle集成sonarqube

1 前言

本文想要达到的目地:
在gradle项目(JAVA)中集成sonarqube,将分析结果上传到sonar中,并在WEB端展现。

maven项目集成sonarqube倒是挺简单的,最近接触gradle项目,要求集成sonarqube做代码静态分析,费了一番功夫才整出来,现在此记录,以备后查。

PS: 以前接触的都是maven项目,最近新接触gradle,对sonarqube也了解不深,所以本文只讲操作不讲原理。

2 在gradle项目中启用sonarqube

就像把大象放进冰箱要经历三步一样,gradle项目中集成sonarqube做代码分析同样是三步:
1. 在build.gradle中添加配置,启动sonarqube插件;
2. 配置sonar系统认证的权限信息,以便将分析结果上传到sonar中展示;
3. 运行分析命令:gradle sonarqube;

2.1 配置build.gradle

buildscript {
  repositories {
    # 添加库路径,实际项目中原来此处可能还有别的库,在此位置追加。追加库的位置可能会导致项目报错(找不到某些依赖的错误),先插入到最前面不行再往后一行行移动,一个个的试,具体原因还没来得及探究
    maven {url "https://plugins.gradle.org/m2/"}
  }
  dependencies {
    # 在此位置追加以下依赖行
    classpath("org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6-rc1")
  }
}

# plugins段放置位置有要示,放在buildscript段前面会报错,放到文件最末尾也报错,紧跟buildscript放置OK,其余位置没有偿试
plugins {
  # 添加插件信息
  id "org.sonarqube" version "2.6-rc1"
}
# 声明插件
apply plugin: "org.sonarqube"

# 如果项目不存在嵌套的子项目,则以上配置即可
# 如果项目存在嵌套的子项目,还要添加以下配置
sonarqube {
    properties {
        property "sonar.sourceEncoding", "UTF-8"
    }
}

subprojects {
    # 在subprojects段中添加以下块内容
    sonarqube {
        properties {
            # 如果同时存在src/main/java与src/main/test,则要按以下方式设置,如果没有单元测试用例目录test,也可以只填写src
            property "sonar.sources", "src/main/java"
            }
        }
}       

2.2 配置sonar认证权限信息

  1. 连接sonar的认证信息也可以在每个项目的build.gradle文件中配置,但1来是在源代码中直接包含用户名与密码不安全;2来是如果将来sonar服务器有迁移或IP变更,或是密码有修改需要每个项目去单独修改不够灵活;
  2. 但如果存在多个sonar服务,不同项目的分析结果需要存放到不同的sonar中,则必须在build.gradle中配置认证信息

新建文件:~/.gradle/gradle.properties,内容如下:

systemProp.sonar.host.url=http://x.x.x.x:9000
systemProp.sonar.login=username
systemProp.sonar.password=password

2.3 运行分析命令:gradle sonarqube

# 运行分析命令
gradle sonarqube
# 成功后可以登陆http://x.x.x.x:9000查看分析结果

3 与jenkins集成

jenkins + gradle + sonarqube集成,网上的教程大多是在jenkins中安装SonarQube Scanner for Jenkins插件,官方教程见此网址:
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins

此处提供另一种不采用SonarQube Scanner for Jenkins插件的方式。
步骤:
1. 不考虑sonar,先实现jenkins与gradle集成(整体较简单,不提供具体步骤);
2. 按照【在gradle项目中启用sonarqube】中的2.1与2.2配置;
3. 在settings.gradle定义rootProject.name(如果没有定义根项目名称,则多个项目在sonar中展示的项目名称都会是workspace,每次运行完成后结果会互相覆盖掉);
4. 修改jenkins job配置,原来构建运行的task为:【clean build】,修改为【clean sonarqube build】

此种方式对jenkins job修改较小,适合微服务构架中众多小项目的情况,唯一需要修改jenkins job配置的步骤4可以用脚本批量替换

你可能感兴趣的:(CI-持续集成,java)