使用sonarqube gradle插件配置带有子模块的Android项目的正确方法是啥?

Posted

技术标签:

【中文标题】使用sonarqube gradle插件配置带有子模块的Android项目的正确方法是啥?【英文标题】:What is the correct way to configure an Android project with submodules for use with the sonarqube gradle plugin?使用sonarqube gradle插件配置带有子模块的Android项目的正确方法是什么? 【发布时间】:2017-07-15 06:20:46 【问题描述】:

配置带有子模块的 android 项目以与 sonarqube gradle 插件一起使用的正确方法是什么?谷歌不是我的朋友,但我可能错过了一些基本的东西。 (我搜索与 android 构建目录和子模块相关的 sonarqube 问题。没有有用的结果。)

在一个非常高的层次上,我正在处理一个具有以下结构的 Android 项目。

git_repository
|----- android_project
  |--- app
  |--- SDK
    |- api

git_repository 包含 README.md 和其他***文件,包括 android_project。 android_project 包含应用程序,以及 SDK 中的 git 子模块。这个 git 子模块包含应用程序需要运行的 api 代码。

问题是当我尝试运行 sonarqube 时,它​​似乎在寻找不存在的文件/目录。对于一个更简单的最小项目,我没有这个问题。我计划在周一建立一个使用子模块的最小项目,但我想在周末离开之前解决这个问题。

$ ./gradlew clean sonarqube
* snip *
:sonarqube
Invalid value for sonar.java.test.libraries
:sonarqube FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':sonarqube'.
> No files nor directories matching '/Users/my_username/git_repository/android_project/app/build/intermediates/dependency-cache/debug'

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or -- debug option to get more log output.

BUILD FAILED

Total time: 9.897 secs
$

此 gradle 任务在 MacOS/Android Studio 命令行设置中失败,但最终目标是拥有可与 Jenkins 一起使用的配置。 我的 settings.gradle 和 build.gradle 文件如下。显然我做错了什么。

git_repository/android_project/settings.gradle完整列表

include ':app', ':api'
project(':api').projectDir = new File('SDK/api')

git_repository/android_project/build.gradle完整清单

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript 
    repositories 
        jcenter()
        maven 
            url "https://plugins.gradle.org/m2/"
        
    

    dependencies 
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.2'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    


apply plugin: 'org.sonarqube'

allprojects 
    repositories 
        jcenter()
    
    tasks.withType(JavaCompile) 
        options.encoding = 'UTF-8'
    


//subprojects 
//    sonarqube 
//        properties 
// //           property "sonar.sources", "src"
//        
//    
//

//sonarqube 
//    properties 
////        property "sonar.exclusions", "file:**/SDK/**"
//    
//

subprojects 
    sonarqube 
        properties 
            property "sonar.sourceEncoding","UTF-8"
            property "sonar.sources","src/main/java"
            property "sonar.java.binaries", "./build/"
            property "sonar.tests","src/androidTest"
//            property "sonar.exclusions","build,build/**,**/*.png"

            property "sonar.import_unknown_files", true

            property "sonar.android.lint.report", "./build/outputs/lint-results.xml"
        
    


project(":api") 
    sonarqube 
        skipProject = true
    

【问题讨论】:

为什么不使用 sonarqube 作为特定机器的软件,而是将其用作 gradle 插件 【参考方案1】:

是的,对于具有多个模块的项目来说,这有点棘手,它使用适当的通配符来实现。

按照以下步骤操作:

    在包含所有子模块的主模块中放置 sonarqube.gradle 文件

    在 master 模块的 build.gradle 文件中添加 maven 插件和 类依赖

以下是上述两个文件的示例:

sonarqube.gradle

apply plugin: "org.sonarqube"

sonarqube 
//noinspection GroovyAssignabilityCheck
    properties 
//noinspection GroovyAssignabilityCheck
        property "sonar.projectName", "appar"
//noinspection GroovyAssignabilityCheck
        property "sonar.projectVersion", "1.0"
//noinspection GroovyAssignabilityCheck
        property "sonar.analysis.mode", "publish"
//noinspection GroovyAssignabilityCheck
        property "sonar.language", "java"
//noinspection GroovyAssignabilityCheck
        property 'sonar.sourceEncoding', "UTF-8"
//noinspection GroovyAssignabilityCheck
        property "sonar.sources", "./src/main"
   // noinspection GroovyAssignabilityCheck
        property "sonar.exclusions", "src/main/java/com/appar/model/**, **/*Entity.java"
//noinspection GroovyAssignabilityCheck
        property "sonar.host.url", "http://192.168.21.33:9000"
//noinspection GroovyAssignabilityCheck
        property "sonar.login", "admin"
//noinspection GroovyAssignabilityCheck
        property "sonar.profile", "fulllint"
//noinspection GroovyAssignabilityCheck
        property 'sonar.import_unknown_files', true
//noinspection GroovyAssignabilityCheck
        property "sonar.android.lint.report", "./build/outputs/lint-results-debug.xml"
//noinspection GroovyAssignabilityCheck
        property "sonar.password", "admin"
 //noinspection GroovyAssignabilityCheck
        property "sonar.java.binaries", "build/"

    

build.gradle

buildscript 
    repositories 
        jcenter()
        maven 
            url "https://plugins.gradle.org/m2/"
        
    
    dependencies 
        classpath 'com.android.tools.build:gradle:2.2.2'
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.0.1"
        classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1'
    


allprojects 
    repositories 
        jcenter()
    

然后从单独模块的 build.gradle 中的 sonarqube.gradle 申请

以下是其中一个子模块的 build.gradle 示例:

apply plugin: 'com.android.library'
apply from: '../sonarqube.gradle'

android 
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig 
        minSdkVersion 21
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    

    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
        debug 
            testCoverageEnabled = true
        
    


dependencies 
    compile project(':java-library')

    testCompile 'junit:junit:4.12'
    testCompile "org.robolectric:robolectric:3.1.4"

只需将此行与上述文件中所示的所有其他应用行一起放置

apply from: '../sonarqube.gradle'

将 sonarqube.gradle 应用到子模块中的所有 build.gradle 文件之后。

只需运行命令

./gradlew sonarqube 

相信我,该项目将成功构建并推送到 sonarqube 服务器中,并且会显示错误结果

如果您正在使用 findbugs,请在推送之前创建项目,否则构建将失败,因为 findbugs 需要字节码进行分析。

并且不要使用该属性

//noinspection GroovyAssignabilityCheck
            property "sonar.projectKey", "appar_app"

这个 sonar.projectKey 属性。 SonarQube 使用它来识别声纳数据库中的每个项目(或模块)。 因此,如果您的所有模块都具有相同的 projectKey 值,SonarQube 将更新其数据库中的一个项目。 不用担心,这个属性会自动设置为每个模块的文件夹名称。

【讨论】:

* 出了什么问题:任务 ':app:compileDebugJavaWithJavac' 执行失败。 > javax/xml/bind/JAXBException 我在运行 gradlew sonarqube 时遇到这个错误。 @Amal p:这不起作用,它只上传最后一个模块的日志。这意味着它会覆盖以前模块的日志

以上是关于使用sonarqube gradle插件配置带有子模块的Android项目的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 中Gradle配置sonarqube

使用android productFlavors时,sonarqube gradle插件异常

gradle、sonarqube 和 jacoco 插件的哪些版本兼容

Sonarqube gradle 插件 - 排除测试源会破坏报告中的单元测试计数

在 SonarQube 中配置 gradle 项目

带有 jacoco 插件的 SonarQube 覆盖百分比显示为零,但可以看到单元测试的数量