2017-02-24 93 views
3

使用sonarqube gradle插件使用子模塊來配置Android項目的正確方法是什麼?谷歌並不是我的朋友,但我可能錯過了一些基本的東西。 (我搜索與android構建目錄和子模塊有關的sonarqube問題,沒有有用的結果。)使用sonarqube gradle插件使用子模塊來配置Android項目的正確方法是什麼?

在非常高的層面上,我正在使用具有以下結構的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中的命令行設置,但最終的目標是擁有與詹金斯工作的配置。 我的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 
    } 
} 
+0

爲什麼不使用sonarqube作爲特定機器的軟件而不是將它用作gradle插件 – dhams

回答

1

是它有點棘手與多個項目模塊,它使用適當的通配符實現。

按照下列步驟:

  1. 包含所有子模塊放置 sonarqube.gradle文件 enter image description here

  2. 在的所述的build.gradle文件中的主模塊中主模塊添加maven插件和 類依賴關係 enter image description here

這裏是兩個以上提到的文件的例子:

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() 
    } 
} 

然後從sonarqube.gradle在申請建立。的單獨的模塊

的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' 

enter image description here

後應用sonarqube.gradle涉及的子模塊中的所有的build.gradle文件。

只需運行命令

./gradlew sonarqube 

相信我的計劃將會成功建立並被推入到sonarqube服務器,如果您使用的FindBugs推前使該項目的錯誤結果將得到顯示

否則build會失敗,因爲findbugs需要字節碼來分析。

並且不要使用屬性

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

這sonar.projectKey屬性。這由SonarQube用於識別聲納數據庫中的每個項目(或模塊)。 因此,如果您的所有模塊具有相同的projectKey值,SonarQube將更新其數據庫中的單個項目。 不用擔心,該屬性會自動設置爲每個模塊的文件夾名稱。

相關問題