You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@edgent.apache.org by dl...@apache.org on 2016/08/15 20:29:37 UTC

[2/4] incubator-edgent git commit: fix handling of aggregator-only projects, add "reports"

fix handling of aggregator-only projects, add "reports"

Don't assemble jars or anything else for aggregator-only projects via
omitting applying the 'java' plugin to them.
That then avoids their undesired jars being added to the target-dir and
release.tgz.

Also
- remove unneeded subprojects*.jar dependency in aggregateJavadoc
- add "reports" task
- remove "dependsOn test" from report tasks (reports shouldn't induce
running tests)
- Update DEVELOPMENT.md with gradle info
- tweak jococoTestReport so "test reports" works
- make 'assemble' also update target_dir
- make root 'build' be like "all test reports"
- tweak 'copyJar' so sample src copy works with all the changes

TODO tgt_dir and tgz still missing console.war

Project: http://git-wip-us.apache.org/repos/asf/incubator-edgent/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-edgent/commit/1a0f6783
Tree: http://git-wip-us.apache.org/repos/asf/incubator-edgent/tree/1a0f6783
Diff: http://git-wip-us.apache.org/repos/asf/incubator-edgent/diff/1a0f6783

Branch: refs/heads/master
Commit: 1a0f6783669adc58efa7eae46e413f27214abfad
Parents: efaf223
Author: Dale LaBossiere <dl...@us.ibm.com>
Authored: Thu Aug 11 16:23:35 2016 -0400
Committer: Dale LaBossiere <dl...@us.ibm.com>
Committed: Thu Aug 11 16:23:35 2016 -0400

----------------------------------------------------------------------
 DEVELOPMENT.md  |  35 ++++++++++++
 build.gradle    | 147 +++++++++++++++++++++++++++++++++++++--------------
 settings.gradle |   4 ++
 3 files changed, 146 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/1a0f6783/DEVELOPMENT.md
----------------------------------------------------------------------
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index f53ea9f..cdae879 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -101,6 +101,41 @@ Running the reports target produces two reports:
 * `reports/junit/index.html` - JUnit test report
 * `reports/coverage/index.html` - Code coverage report.
 
+### [WIP] Building With Gradle
+
+Work is ongoing to replace the Ant based build system with a Gradle based one
+[EDGENT-139].  Delivered functionality is expected to work though is not yet
+be complete.
+
+**TODO: The primary build process is using Gradle, any pull request is expected to
+maintain the build success of `clean, all, test`.**
+
+The Gradle wrapper `edgent/{gradlew,gradlew.bat}` should be used to ensure an appropriate
+version of Gradle is used.  e.g.  `$ ./gradlew clean all test reports`
+
+The top-level Gradle file is `edgent/build.gradle` and contains several
+unique tasks: 
+
+* `all` (default) : Build all code and Javadoc into `build\distributions`. The build will fail on any code error or Javadoc warning or error.
+* `build` : essentially like "all test reports"
+* `clean` : Clean the project
+* `test` : Run the JUnit tests, if any test fails the test run stops.
+  * use a project test task and optionally the `--tests` option to run a subset of the tests:
+    * `./gradlew <project>:test`
+    * `./gradlew <project>:test --tests '*.SomeTest'`
+    * `./gradlew <project>:test --tests '*.SomeTest.someMethod'`
+* `reports` : Generate JUnit and Code Coverage reports in `build\distributions\reports`. Use after executing the `test` target. 
+  * `reports\tests\overview-summary.html` - JUnit test report
+  * `reports\coverage\index.html` - Code coverage report
+* `release` : Build a release bundle in `build/release-edgent`, **TODO: that includes subsets of the Edgent jars that run on Java 7 (`build/distributions/java7`) and Android (`build/distributions/android`)**.
+
+The build process has been tested on Linux and MacOSX.
+
+To build on Windows probably needs some changes, please get involved and contribute them!
+
+**TODO: Continuous Integration with Gradle**
+
+
 ### Code Layout
 
 The code is broken into a number of projects and modules within those projects defined by directories under `edgent`.

http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/1a0f6783/build.gradle
----------------------------------------------------------------------
diff --git a/build.gradle b/build.gradle
index 571b12a..aa4f924 100644
--- a/build.gradle
+++ b/build.gradle
@@ -18,7 +18,6 @@ defaultTasks 'all'
 allprojects {
   apply plugin: 'idea'
   apply plugin: 'eclipse'
-  apply plugin: 'java'
 
   repositories {
     mavenCentral()
@@ -28,6 +27,8 @@ allprojects {
   }
 }
 
+apply plugin: 'java'
+
 ext {
   commithash_error = ''
   commithash = {
@@ -51,11 +52,28 @@ ext {
   target_docs_dir = "${ext.target_dir}/docs"
   target_javadoc_dir = "${ext.target_docs_dir}/javadoc"
   target_report_dir = "${ext.target_dir}/reports"
+  
+  aggregatorOnlyProjects = [
+    ':analytics', ':api', ':apps',
+    ':connectors', ':console', ':providers',
+    ':runtime', ':samples', ':spi',
+    ':test', ':utils'
+  ]
+  
+  filteredSubprojects = subprojects*.findAll { 
+    project -> !aggregatorOnlyProjects.contains(project.path)
+  }
 }
 
 /* Configure subprojects */
 subprojects {
 
+  // ignore aggregator only projects so we don't assemble empty jars, etc for them.
+  if (aggregatorOnlyProjects.contains(project.path)) {
+    return
+  }
+
+  apply plugin: 'java'
   apply plugin: "jacoco"
 
   if (buildFile.isFile() && !buildFile.exists()) {
@@ -104,6 +122,9 @@ subprojects {
   }
 
   test {
+    // TODO fix this - this dependency handling shouldn't occur here,
+    // rather :console:server should dependOn :console:servlets
+    // (really the server doesn't exist w/o the servlets)
     if(it.path == ":test:fvtiot" ||  it.path == ":providers:development") {
       dependsOn ":console:servlets"
     }
@@ -145,32 +166,41 @@ subprojects {
   }
 
   task copyJar(type: Copy) {
+    description = "Copy subproject's assembled artifacts to target_dir (implicitly builds jars due to 'from jar')"
     def projectGroup = "$project.group".replace("edgent.", "")
 
     if (["api", "providers", "runtime", "spi"].contains(projectGroup)) {
+      // println "copyJar(cfg) lib $project.group $projectGroup $project.name $jar.archiveName"
       from jar
-      into "${rootProject.ext.target_java8_dir}/" + "/lib"
+      into "${rootProject.ext.target_java8_dir}/lib"
       rename("$jar.archiveName", "$jar.baseName.$jar.extension")
-    } else if (["samples"].contains(projectGroup)) {
+    } 
+    else if (["samples"].contains(projectGroup)) {
+      // println "copyJar(cfg) samples $project.group $projectGroup $project.name $jar.archiveName"
       from jar
-      into "${rootProject.ext.target_java8_dir}/" + projectGroup + "/lib"
+      into "${rootProject.ext.target_java8_dir}/$projectGroup/lib"
       rename("$jar.archiveName", "$jar.baseName.$jar.extension")
 
       //Copy Sample SRC to dist
-      copy {
-        into "${rootProject.ext.target_java8_dir}/" + projectGroup + "/src/$project.name/src/main/java/"
-        from(sourceSets.main.allSource.srcDirs) {
-          include '**/*.java'
+      doLast {
+        copy {
+          from(sourceSets.main.allSource.srcDirs) {
+            include '**/*.java'
+          }
+          into "${rootProject.ext.target_java8_dir}/$projectGroup/src/$project.name/src/main/java/"
         }
       }
-    } else {
+    } 
+    else {
+      // println "copyJar(cfg) other $project.group $projectGroup $project.name $jar.archiveName"
       from jar
-      into "${rootProject.ext.target_java8_dir}/" + projectGroup + "/$project.name".replaceAll(":", "/") + "/lib"
+      into "${rootProject.ext.target_java8_dir}/$projectGroup/$project.name/lib"
       rename("$jar.archiveName", "$jar.baseName.$jar.extension")
     }
   }
-
-  copyJar.dependsOn assemble
+  
+  // assemble: inject updating target_dir 
+  assemble.finalizedBy copyJar
 }
 
 task copyScripts(type: Copy) {
@@ -192,7 +222,7 @@ dependencies {
 }
 
 task createJunitReport << {
-  description = 'Generates a Junit report from all subprojects'
+  description = "Generates a Junit report from all subprojects (use after 'test')"
 
   ant.taskdef(name: 'junitreport',
           classname: 'org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator',
@@ -201,15 +231,13 @@ task createJunitReport << {
     fileset(dir: './') {
       include(name: '**/test-results/TEST-*.xml')
     }
-    report(format: 'frames', todir: "${target_report_dir}/junit")
+    report(format: 'frames', todir: "${target_report_dir}/tests")
   }
   ant.move(file: "TESTS-TestSuites.xml", tofile: "${target_report_dir}/TESTS-TestSuites.xml")
 }
-build.finalizedBy createJunitReport
 
 task jacocoTestReport << {
-
-  description = 'Generates a coverage report from all subprojects'
+  description = "Generates a coverage report from all subprojects (use after 'test')"
 
   def libDir = new File("${target_java8_dir}", "lib")
   def utilsDir = new File("${target_java8_dir}", "utils")
@@ -241,10 +269,18 @@ task jacocoTestReport << {
       executionData.addToAntBuilder(ant, 'resources')
     }
 
+    // the 'test' task directly uses the built class files
+    // (test doesn't assemble jars nor populate target_dir with them)
+    jococoClassfilesFromJars = false;
+    
     structure(name: project.name) {
       group(name: "Edgent API") {
         classfiles {
-          fileset(dir: "${target_java8_dir}/lib", includes: "edgent.api.*.jar")
+          if (jococoClassfilesFromJars) {
+            fileset(dir: "${target_java8_dir}/lib", includes: "edgent.api.*.jar")
+          } else {
+            fileset(dir: "api", includes: "**/*.class")
+          }
         }
         sourcefiles {
           fileset(dir: "./api/function/src/main/java", includes: "**/*.java")
@@ -256,7 +292,11 @@ task jacocoTestReport << {
       }
       group(name: "Edgent SPI") {
         classfiles {
-          fileset(dir: "${target_java8_dir}/lib", includes: "edgent.spi.*.jar")
+          if (jococoClassfilesFromJars) {
+            fileset(dir: "${target_java8_dir}/lib", includes: "edgent.spi.*.jar")
+          } else {
+            fileset(dir: "spi", includes: "**/*.class")
+          }
         }
         sourcefiles {
           fileset(dir: "./spi/graph/src/main/java", includes: "**/*.java")
@@ -265,7 +305,11 @@ task jacocoTestReport << {
       }
       group(name: "Edgent Runtime") {
         classfiles {
-          fileset(dir: "${target_java8_dir}/lib", includes: "edgent.runtime.*.jar")
+          if (jococoClassfilesFromJars) {
+            fileset(dir: "${target_java8_dir}/lib", includes: "edgent.runtime.*.jar")
+          } else {
+            fileset(dir: "runtime", includes: "**/*.class")
+          }
         }
         sourcefiles {
           fileset(dir: "./runtime/etiao/src/main/java", includes: "**/*.java")
@@ -274,7 +318,11 @@ task jacocoTestReport << {
       }
       group(name: "Edgent Utilities") {
         classfiles {
-          fileset(dir: "${target_java8_dir}/utils", includes: "**/edgent.utils.*.jar")
+          if (jococoClassfilesFromJars) {
+            fileset(dir: "${target_java8_dir}/utils", includes: "**/edgent.utils.*.jar")
+          } else { 
+            fileset(dir: "utils", includes: "**/*.class")
+          }
         }
         sourcefiles {
           fileset(dir: "./utils/metrics/src/main/java", includes: "**/*.java")
@@ -283,7 +331,11 @@ task jacocoTestReport << {
       }
       group(name: "Edgent Connectors") {
         classfiles {
-          fileset(dir: "${target_java8_dir}/connectors", includes: "**/edgent.connectors.*.jar")
+          if (jococoClassfilesFromJars) {
+            fileset(dir: "${target_java8_dir}/connectors", includes: "**/edgent.connectors.*.jar")
+          } else { 
+            fileset(dir: "connectors", includes: "**/*.class")
+          }
         }
         sourcefiles {
           fileset(dir: "./connectors/common/src/main/java", includes: "**/*.java")
@@ -302,7 +354,11 @@ task jacocoTestReport << {
       }
       group(name: "Edgent Providers") {
         classfiles {
-          fileset(dir: "${target_java8_dir}/lib", includes: "edgent.providers.*.jar")
+          if (jococoClassfilesFromJars) {
+            fileset(dir: "${target_java8_dir}/lib", includes: "edgent.providers.*.jar")
+          } else {
+            fileset(dir: "providers", includes: "**/*.class")
+          }
         }
         sourcefiles {
           fileset(dir: "./providers/direct/src/main/java", includes: "**/*.java")
@@ -311,7 +367,11 @@ task jacocoTestReport << {
       }
       group(name: "Edgent Analytics") {
         classfiles {
-          fileset(dir: "${target_java8_dir}/analytics", includes: "**/edgent.analytics.*.jar")
+          if (jococoClassfilesFromJars) {
+            fileset(dir: "${target_java8_dir}/analytics", includes: "**/edgent.analytics.*.jar")
+          } else {
+            fileset(dir: "analytics", includes: "**/*.class")
+          }
         }
         sourcefiles {
           fileset(dir: "./analytics/math3/src/main/java", includes: "**/*.java")
@@ -320,7 +380,11 @@ task jacocoTestReport << {
       }
       group(name: "Edgent Console") {
         classfiles {
-          fileset(dir: "${target_java8_dir}/console", includes: "**/edgent.console.*.jar")
+          if (jococoClassfilesFromJars) {
+            fileset(dir: "${target_java8_dir}/console", includes: "**/edgent.console.*.jar")
+          } else {
+            fileset(dir: "console", includes: "**/*.class")
+          }
         }
         sourcefiles {
           fileset(dir: "./console/server/src/main/java", includes: "**/*.java")
@@ -332,13 +396,9 @@ task jacocoTestReport << {
     xml(destfile: "${target_report_dir}/coverage/jacoco-sessions.xml")
   }
 }
-build.finalizedBy jacocoTestReport
-// jacocoTestReport.dependsOn subprojects*.test, subprojects*.copyJar
-jacocoTestReport.dependsOn subprojects*.test
 
 task aggregateJavadoc(type: Javadoc) {
   description = 'Create all javadoc into target_dir/docs/javadoc'
-  dependsOn(subprojects*.jar)    // why is this needed?
   destinationDir file("$rootProject.ext.target_javadoc_dir")
   options.addStringOption('Xdoclint:none', '-quiet')
   configure(options) {
@@ -381,10 +441,6 @@ task aggregateJavadoc(type: Javadoc) {
   }
 }
 
-task copyJars(dependsOn: subprojects*.copyJar) {
-  description = 'copyJar aggregator'
-}
-
 task addVersionDotTxt {
   description = 'Add version.txt in target_dir'
   doLast {
@@ -408,7 +464,7 @@ task mkTargetDir << {
 
 task addMiscDistFiles {
   description = 'Add misc things to target_dir'
-  dependsOn 'mkTargetDir', 'addVersionDotTxt'
+  dependsOn mkTargetDir, addVersionDotTxt
   addVersionDotTxt.mustRunAfter mkTargetDir
   doLast {
     copy { from 'LICENSE'; into target_dir }
@@ -436,24 +492,35 @@ task releaseTarGz(type: Tar) {
 }  
 
 task all {
-  description = 'Assemble distribution artifacts and populate the target_dir with jars, doc, etc.'
-  dependsOn('copyJars', 'copyScripts', 'aggregateJavadoc')
+  description = "Assemble distribution artifacts and populate the target_dir with jars, doc, etc. Like 'build' w/o 'test'"
+  dependsOn filteredSubprojects*.assemble, copyScripts, aggregateJavadoc
 }
 
 task cleanAll {
-  description = 'clean aggregator'  // e.g., release dependsOn clean only does top-level clean
-  dependsOn 'clean'  // top-level clean too
-  dependsOn subprojects*.clean
+  description = 'clean aggregator'  // "release dependsOn clean" only does top-level clean
+  dependsOn clean, filteredSubprojects*.clean
 }
 
 task release {
   description = 'Assemble distribution artifacts, populate target_dir, and create a release tgz'
-  dependsOn('cleanAll', 'addMiscDistFiles', 'all', 'releaseTarGz')
+  dependsOn cleanAll, addMiscDistFiles, all, releaseTarGz
   addMiscDistFiles.mustRunAfter cleanAll
   all.mustRunAfter addMiscDistFiles
   releaseTarGz.mustRunAfter all
 }
 
+task reports {
+  description = "Generate JUnit and Coverage reports of prior test run. Use after 'test'"
+  dependsOn createJunitReport, jacocoTestReport
+}
+
+// build: inject test report generation and javadoc generation (for early problem detection)
+// make 'build' like "all test reports"
+build {
+  dependsOn filteredSubprojects*.build, aggregateJavadoc, copyScripts
+  finalizedBy reports // after build's test task
+}
+
 task wrapper(type: Wrapper) {
   jarFile = rootProject.file('.gradle-wrapper/gradle-wrapper.jar')
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/1a0f6783/settings.gradle
----------------------------------------------------------------------
diff --git a/settings.gradle b/settings.gradle
index 36fe2d8..64d96cc 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -11,6 +11,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+ 
+// N.B. if you add a subproject to a new 'aggregator only' project
+// adjust the 'aggregatorOnlyProjects' list in build.gradle
+
 include 'api:function'
 include 'api:execution'
 include 'api:window'