gradle集成sonarqube

本文介绍如何在Gradle项目中集成SonarQube进行代码质量分析,包括配置build.gradle、设置权限信息和运行分析命令等步骤,并提供与Jenkins集成的方法。

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可以用脚本批量替换

<think>我们正在分析的是一个Gradle构建脚本的依赖块(dependenciesblock)。这个块通常出现在项目的根构建文件(build.gradle)中,用于声明构建脚本本身所需的依赖项(即用于构建项目的工具)。这些依赖项不是项目代码的一部分,而是用于构建过程的插件或库。在这个例子中,有三个依赖项:1.AndroidGradle插件:用于构建Android应用。2.JaCoCo:一个用于代码覆盖率报告的库。3.SonarQubeGradle插件:用于将SonarQube分析集成Gradle构建中。每个依赖项都使用`classpath`关键字声明,这意味着它们将被添加到构建脚本的类路径中,从而可以在构建脚本中使用它们提供的功能。具体解释:-`com.android.tools.build:gradle:$agp_version`:这是AndroidGradle插件的坐标。`$agp_version`是一个变量,应该在Gradle配置中定义(例如在`gradle.properties`文件中),表示所使用的AndroidGradle插件版本。-`org.jacoco:org.jacoco.core:$jacoco_version`:这是JaCoCo核心库的坐标。同样,`$jacoco_version`是一个变量,表示JaCoCo的版本。-`org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3`:这是SonarQubeGradle插件的坐标。这里直接使用了版本号3.3(没有使用变量)。在Gradle中,这样的依赖块通常位于`buildscript`块内,整个结构可能如下:```groovybuildscript{//定义变量(如果不在外部定义)ext{agp_version='7.0.4'jacoco_version='0.8.7'}repositories{google()mavenCentral()}dependencies{classpath"com.android.tools.build:gradle:$agp_version"classpath"org.jacoco:org.jacoco.core:$jacoco_version"classpath"org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3"}}```注意:`buildscript`块用于配置构建脚本的类路径。这意味着这些依赖项在构建脚本中可用,但不会自动添加到项目模块中。现在,让我们回答如何理解这段代码:这段代码声明了三个构建脚本依赖:1.AndroidGradle插件:用于提供构建Android应用程序所需的任务和功能。2.JaCoCo核心库:用于在构建过程中生成代码覆盖率报告。3.SonarQubeGradle插件:用于在构建过程中运行SonarQube分析,以进行代码质量检查。这些依赖项将下载到构建脚本的类路径中,使得我们可以在构建脚本中应用相应的插件(例如,在模块的build.gradle文件中使用`applyplugin:'com.android.application'`来应用Android应用插件)。相关问题:1.如何定义`agp_version`和`jacoco_version`变量?2.如何在项目中应用这些插件?3.除了`classpath`,Gradle依赖配置还有哪些类型?4.SonarQube插件的主要功能是什么?</think>### 理解 Gradle 依赖声明 这段代码是 **Gradle 构建脚本**中的依赖声明块,用于声明构建过程所需的插件依赖。它位于项目根目录的 `build.gradle` 文件中,通常在 `buildscript` 块内部。核心作用是让构建系统能下载和使用指定的插件工具。 #### 代码逐行解析: ```groovy dependencies { classpath "com.android.tools.build:gradle:$agp_version" // Android 构建插件 classpath "org.jacoco:org.jacoco.core:$jacoco_version" // JaCoCo 代码覆盖率工具 classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3" // SonarQube 扫描插件 } ``` 1. **依赖类型 `classpath`** 表示这些依赖用于**构建过程本身**(而非项目代码)。它们会被添加到 Gradle 的类路径中,使后续脚本能调用这些插件。 2. **依赖坐标格式** 遵循 Maven 的 `groupId:artifactId:version` 格式: - `com.android.tools.build:gradle`:Android Gradle 插件 (AGP) `$agp_version` 是变量(如 `7.2.0`),通常在 `gradle.properties` 中定义 - `org.jacoco:org.jacoco.core`:JaCoCo 代码覆盖率库 `$jacoco_version` 是版本变量(如 `0.8.8`) - `org.sonarsource.scanner.gradle:sonarqube-gradle-plugin`:SonarQube 扫描插件 直接使用固定版本 `3.3` 3. **插件的用途**: | 插件 | 作用 | |------|------| | Android Gradle Plugin | 提供 Android 项目构建能力(编译、打包、签名等) | | JaCoCo | 生成单元测试/代码覆盖率报告 | | SonarQube | 集成代码质量扫描(静态分析、漏洞检测等) | #### 典型使用场景 在模块的 `build.gradle` 中应用这些插件: ```groovy // 应用 Android 应用插件 apply plugin: 'com.android.application' // 应用 JaCoCo 覆盖率插件 apply plugin: 'jacoco' // 应用 SonarQube 扫描插件 apply plugin: 'org.sonarqube' ``` #### 完整 `buildscript` 示例 ```groovy // 根项目 build.gradle buildscript { // 定义版本变量 ext { agp_version = "7.3.1" jacoco_version = "0.8.8" } repositories { google() // 从 Google Maven 仓库下载 mavenCentral() // 从 Maven 中央仓库下载 } dependencies { classpath "com.android.tools.build:gradle:$agp_version" classpath "org.jacoco:org.jacoco.core:$jacoco_version" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3" } } ``` #### 关键注意事项: 1. **变量来源**:`$agp_version` 等变量通常在: - `gradle.properties` 文件中定义 - 或直接在 `ext` 块中声明(如上例) 2. **仓库配置**:必须在 `repositories` 块声明仓库(如 `google()`),否则下载失败 3. **作用域**:这些插件仅用于构建过程,不会打包到 APK 中
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值