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

使用sonarqube gradle插件配置Android项目的子模块的正确方法是什么?,android,jenkins,sonarqube,sonarqube-scan,Android,Jenkins,Sonarqube,Sonarqube Scan,使用sonarqube gradle插件配置Android项目的子模块的正确方法是什么?谷歌不是我的朋友,但我可能错过了一些基本的东西。(我搜索与android构建目录和子模块相关的sonarqube问题。没有有用的结果。) 在一个非常高的层次上,我正在使用以下结构的Android项目 git_repository |----- android_project |--- app |--- SDK |- api git_存储库包含README.md和其他顶级文件,包括androi

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

在一个非常高的层次上,我正在使用以下结构的Android项目

git_repository
|----- android_project
  |--- app
  |--- SDK
    |- api
git_存储库包含README.md和其他顶级文件,包括android_项目。android_项目包含应用程序的功能,以及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\u repository/android\u project/settings.gradle完整列表

include ':app', ':api'
project(':api').projectDir = new File('SDK/api')
// 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
    }
}
git\u repository/android\u project/build.gradle完整列表

include ':app', ':api'
project(':api').projectDir = new File('SDK/api')
// 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文件

  • 在主模块的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/"
    
        }
    }
    
    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

    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/"
    
        }
    }
    
    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使用该功能识别sonar数据库中的每个项目(或模块)。 所以,如果所有模块都具有相同的projectKey值,SonarQube将更新其数据库中的单个项目。
    别担心,此属性会自动设置为每个模块的文件夹名称。

    为什么不将sonarqube用作特定机器的软件,而将其用作gradle插件*错误:任务执行失败:应用程序:CompiledBugJavaWithJavaC'>javax/xml/bind/JAXBException我在运行gradlew sonarqube时遇到此错误。@Amal p:这不起作用,它只上载最后一个模块的日志。这意味着它会覆盖以前模块的日志