| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * License); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an AS IS BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // This file contains common build rules that are to be applied |
| // to all projects and also a set of methods called applyXYZNature which |
| // sets up common build rules for sub-projects with the same needs. |
| // |
| // The supported list of natures are: |
| // * Java - Configures plugins commonly found in Java projects |
| // * Go - Configures plugins commonly found in Go projects |
| // * Docker - Configures plugins commonly used to build Docker containers |
| // * Grpc - Configures plugins commonly used to generate source from protos |
| // * Avro - Configures plugins commonly used to generate source from Avro specifications |
| // |
| // For example, see applyJavaNature below. |
| |
| println "Applying build_rules.gradle to $project.name" |
| |
| // Define the set of repositories and dependencies required to |
| // fetch and enable plugins. |
| buildscript { |
| repositories { |
| maven { url file(offlineRepositoryRoot) } |
| |
| // To run gradle in offline mode, one must first invoke |
| // 'updateOfflineRepository' to create an offline repo |
| // inside the root project directory. See the application |
| // of the offline repo plugin within build_rules.gradle |
| // for further details. |
| if (gradle.startParameter.isOffline()) { |
| return |
| } |
| |
| mavenLocal() |
| mavenCentral() |
| jcenter() |
| maven { url "https://plugins.gradle.org/m2/" } |
| maven { url "http://repo.spring.io/plugins-release" } |
| } |
| dependencies { |
| classpath "com.github.jengelman.gradle.plugins:shadow:2.0.1" // Enable shading Java dependencies |
| } |
| } |
| |
| /*************************************************************************************************/ |
| // Apply common properties/repositories and tasks to all projects. |
| |
| // Create a function which returns true iff we are performing a release. |
| def isRelease() { |
| return project.hasProperty('isRelease') |
| } |
| |
| group = 'org.apache.beam' |
| |
| // Automatically use the official release version if we are performing a release |
| // otherwise append '-SNAPSHOT' |
| version = '2.5.0' |
| if (!isRelease()) { |
| version += '-SNAPSHOT' |
| } |
| |
| // Define the default set of repositories for all builds. |
| repositories { |
| maven { url offlineRepositoryRoot } |
| |
| // To run gradle in offline mode, one must first invoke |
| // 'updateOfflineRepository' to create an offline repo |
| // inside the root project directory. See the application |
| // of the offline repo plugin within build_rules.gradle |
| // for further details. |
| if (gradle.startParameter.isOffline()) { |
| return |
| } |
| |
| mavenLocal() |
| mavenCentral() |
| jcenter() |
| |
| // Spring for resolving pentaho dependency. |
| maven { url "https://repo.spring.io/plugins-release/" } |
| |
| // Release staging repository |
| maven { url "https://oss.sonatype.org/content/repositories/staging/" } |
| |
| // Apache nightly snapshots |
| maven { url "https://repository.apache.org/snapshots" } |
| |
| // Apache release snapshots |
| maven { url "https://repository.apache.org/content/repositories/releases" } |
| } |
| |
| // Apply a plugin which enables configuring projects imported into Intellij. |
| apply plugin: "idea" |
| |
| // Provide code coverage |
| // TODO: Should this only apply to Java projects? |
| apply plugin: "jacoco" |
| gradle.taskGraph.whenReady { graph -> |
| // Disable jacoco unless report requested such that task outputs can be properly cached. |
| // https://discuss.gradle.org/t/do-not-cache-if-condition-matched-jacoco-agent-configured-with-append-true-satisfied/23504 |
| def enabled = graph.allTasks.any { it instanceof JacocoReport } |
| tasks.withType(Test) { |
| jacoco.enabled = enabled |
| } |
| } |
| |
| // Apply a plugin which provides tasks for dependency / property / task reports. |
| // See https://docs.gradle.org/current/userguide/project_reports_plugin.html |
| // for further details. This is typically very useful to look at the "htmlDependencyReport" |
| // when attempting to resolve dependency issues. |
| apply plugin: "project-report" |
| |
| // Apply a task dependency visualization plugin which creates a ".dot" file in the build directory |
| // giving the task dependencies for the current build. Unfortunately this creates a ".dot" file |
| // in each sub-projects report output directory. |
| // See https://github.com/mmalohlava/gradle-visteg for further details. |
| apply plugin: "cz.malohlava.visteg" |
| |
| // Apply a plugin which provides the 'updateOfflineRepository' task that creates an offline |
| // repository. This offline repository satisfies all Gradle build dependencies and Java |
| // project dependencies. The offline repository is placed within $rootDir/offline-repo |
| // but can be overridden by specifying the 'offlineRepositoryRoot' Gradle option. |
| // Note that parallel build must be disabled when executing 'updateOfflineRepository' |
| // by specifying '-Dorg.gradle.parallel=false', see |
| // https://github.com/mdietrichstein/gradle-offline-dependencies-plugin/issues/3 |
| apply plugin: "io.pry.gradle.offline_dependencies" |
| |
| offlineDependencies { |
| repositories { |
| maven { url offlineRepositoryRoot } |
| mavenLocal() |
| mavenCentral() |
| jcenter() |
| maven { url "https://plugins.gradle.org/m2/" } |
| maven { url "http://repo.spring.io/plugins-release" } |
| } |
| |
| includeSources = false |
| includeJavadocs = false |
| includeIvyXmls = false |
| } |
| |
| /*************************************************************************************************/ |
| // Define and export a map dependencies shared across multiple sub-projects. |
| // |
| // Example usage: |
| // configuration { |
| // shadow library.java.avro |
| // shadowTest library.java.junit |
| // } |
| |
| // These versions are defined here because they represent |
| // a dependency version which should match across multiple |
| // Maven artifacts. |
| def google_cloud_bigdataoss_version = "1.4.5" |
| def bigtable_version = "1.0.0" |
| def bigtable_proto_version = "1.0.0-pre3" |
| def google_clients_version = "1.23.0" |
| def google_auth_version = "0.7.1" |
| def grpc_version = "1.2.0" |
| def protobuf_version = "3.2.0" |
| def guava_version = "20.0" |
| def netty_version = "4.1.8.Final" |
| def grpc_google_common_protos = "0.1.9" |
| def hamcrest_version = "1.3" |
| def hadoop_version = "2.7.3" |
| def jackson_version = "2.9.5" |
| def spark_version = "2.3.0" |
| def pubsub_grpc_version = "0.1.18" |
| def apex_core_version = "3.7.0" |
| def apex_malhar_version = "3.4.0" |
| def postgres_version = "42.2.2" |
| def jaxb_api_version = "2.2.12" |
| def kafka_version = "1.0.0" |
| def quickcheck_version = "0.8" |
| |
| // A map of maps containing common libraries used per language. To use: |
| // dependencies { |
| // shadow library.java.slf4j_api |
| // } |
| ext.library = [ |
| java: [ |
| activemq_amqp: "org.apache.activemq:activemq-amqp:5.13.1", |
| activemq_broker: "org.apache.activemq:activemq-broker:5.13.1", |
| activemq_client: "org.apache.activemq:activemq-client:5.13.1", |
| activemq_jaas: "org.apache.activemq:activemq-jaas:5.13.1", |
| activemq_junit: "org.apache.activemq.tooling:activemq-junit:5.13.1", |
| activemq_kahadb_store: "org.apache.activemq:activemq-kahadb-store:5.13.1", |
| activemq_mqtt: "org.apache.activemq:activemq-mqtt:5.13.1", |
| apex_common: "org.apache.apex:apex-common:$apex_core_version", |
| apex_engine: "org.apache.apex:apex-engine:$apex_core_version", |
| args4j: "args4j:args4j:2.33", |
| avro: "org.apache.avro:avro:1.8.2", |
| bigdataoss_gcsio: "com.google.cloud.bigdataoss:gcsio:$google_cloud_bigdataoss_version", |
| bigdataoss_util: "com.google.cloud.bigdataoss:util:$google_cloud_bigdataoss_version", |
| bigtable_client_core: "com.google.cloud.bigtable:bigtable-client-core:$bigtable_version", |
| bigtable_protos: "com.google.cloud.bigtable:bigtable-protos:$bigtable_proto_version", |
| byte_buddy: "net.bytebuddy:byte-buddy:1.8.11", |
| commons_compress: "org.apache.commons:commons-compress:1.16.1", |
| commons_csv: "org.apache.commons:commons-csv:1.4", |
| commons_io_1x: "commons-io:commons-io:1.3.2", |
| commons_io_2x: "commons-io:commons-io:2.5", |
| commons_lang3: "org.apache.commons:commons-lang3:3.6", |
| datastore_v1_proto_client: "com.google.cloud.datastore:datastore-v1-proto-client:1.4.0", |
| datastore_v1_protos: "com.google.cloud.datastore:datastore-v1-protos:1.3.0", |
| error_prone_annotations: "com.google.errorprone:error_prone_annotations:2.0.15", |
| findbugs_annotations: "com.google.code.findbugs:findbugs-annotations:3.0.1", |
| findbugs_jsr305: "com.google.code.findbugs:jsr305:3.0.1", |
| gax_grpc: "com.google.api:gax-grpc:0.20.0", |
| google_api_client: "com.google.api-client:google-api-client:$google_clients_version", |
| google_api_client_jackson2: "com.google.api-client:google-api-client-jackson2:$google_clients_version", |
| google_api_client_java6: "com.google.api-client:google-api-client-java6:$google_clients_version", |
| google_api_common: "com.google.api:api-common:1.0.0-rc2", |
| google_api_services_bigquery: "com.google.apis:google-api-services-bigquery:v2-rev374-$google_clients_version", |
| google_api_services_clouddebugger: "com.google.apis:google-api-services-clouddebugger:v2-rev233-$google_clients_version", |
| google_api_services_cloudresourcemanager: "com.google.apis:google-api-services-cloudresourcemanager:v1-rev477-$google_clients_version", |
| google_api_services_dataflow: "com.google.apis:google-api-services-dataflow:v1b3-rev221-$google_clients_version", |
| google_api_services_pubsub: "com.google.apis:google-api-services-pubsub:v1-rev382-$google_clients_version", |
| google_api_services_storage: "com.google.apis:google-api-services-storage:v1-rev124-$google_clients_version", |
| google_auth_library_credentials: "com.google.auth:google-auth-library-credentials:$google_auth_version", |
| google_auth_library_oauth2_http: "com.google.auth:google-auth-library-oauth2-http:$google_auth_version", |
| google_cloud_core: "com.google.cloud:google-cloud-core:1.0.2", |
| google_cloud_core_grpc: "com.google.cloud:google-cloud-core-grpc:$grpc_version", |
| google_cloud_dataflow_java_proto_library_all: "com.google.cloud.dataflow:google-cloud-dataflow-java-proto-library-all:0.5.160304", |
| google_cloud_spanner: "com.google.cloud:google-cloud-spanner:0.20.0b-beta", |
| google_http_client: "com.google.http-client:google-http-client:$google_clients_version", |
| google_http_client_jackson: "com.google.http-client:google-http-client-jackson:$google_clients_version", |
| google_http_client_jackson2: "com.google.http-client:google-http-client-jackson2:$google_clients_version", |
| google_http_client_protobuf: "com.google.http-client:google-http-client-protobuf:$google_clients_version", |
| google_oauth_client: "com.google.oauth-client:google-oauth-client:$google_clients_version", |
| google_oauth_client_java6: "com.google.oauth-client:google-oauth-client-java6:$google_clients_version", |
| grpc_all: "io.grpc:grpc-all:$grpc_version", |
| grpc_auth: "io.grpc:grpc-auth:$grpc_version", |
| grpc_core: "io.grpc:grpc-core:$grpc_version", |
| grpc_google_cloud_pubsub_v1: "com.google.api.grpc:grpc-google-cloud-pubsub-v1:$pubsub_grpc_version", |
| grpc_protobuf: "io.grpc:grpc-protobuf:$grpc_version", |
| grpc_protobuf_lite: "io.grpc:grpc-protobuf-lite:$grpc_version", |
| grpc_netty: "io.grpc:grpc-netty:$grpc_version", |
| grpc_stub: "io.grpc:grpc-stub:$grpc_version", |
| guava: "com.google.guava:guava:$guava_version", |
| guava_testlib: "com.google.guava:guava-testlib:$guava_version", |
| hadoop_client: "org.apache.hadoop:hadoop-client:$hadoop_version", |
| hadoop_common: "org.apache.hadoop:hadoop-common:$hadoop_version", |
| hadoop_mapreduce_client_core: "org.apache.hadoop:hadoop-mapreduce-client-core:$hadoop_version", |
| hadoop_minicluster: "org.apache.hadoop:hadoop-minicluster:$hadoop_version", |
| hadoop_hdfs: "org.apache.hadoop:hadoop-hdfs:$hadoop_version", |
| hadoop_hdfs_tests: "org.apache.hadoop:hadoop-hdfs:$hadoop_version:tests", |
| hamcrest_core: "org.hamcrest:hamcrest-core:$hamcrest_version", |
| hamcrest_library: "org.hamcrest:hamcrest-library:$hamcrest_version", |
| jackson_annotations: "com.fasterxml.jackson.core:jackson-annotations:$jackson_version", |
| jackson_core: "com.fasterxml.jackson.core:jackson-core:$jackson_version", |
| jackson_databind: "com.fasterxml.jackson.core:jackson-databind:$jackson_version", |
| jackson_dataformat_cbor: "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:$jackson_version", |
| jackson_dataformat_yaml: "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:$jackson_version", |
| jackson_datatype_joda: "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jackson_version", |
| jackson_module_scala: "com.fasterxml.jackson.module:jackson-module-scala_2.11:$jackson_version", |
| jaxb_api: "javax.xml.bind:jaxb-api:$jaxb_api_version", |
| joda_time: "joda-time:joda-time:2.4", |
| junit: "junit:junit:4.12", |
| kafka_2_11: "org.apache.kafka:kafka_2.11:$kafka_version", |
| kafka_clients: "org.apache.kafka:kafka-clients:$kafka_version", |
| malhar_library: "org.apache.apex:malhar-library:$apex_malhar_version", |
| mockito_core: "org.mockito:mockito-core:1.9.5", |
| netty_handler: "io.netty:netty-handler:$netty_version", |
| netty_tcnative_boringssl_static: "io.netty:netty-tcnative-boringssl-static:1.1.33.Fork26", |
| netty_transport_native_epoll: "io.netty:netty-transport-native-epoll:$netty_version", |
| postgres: "org.postgresql:postgresql:$postgres_version", |
| protobuf_java: "com.google.protobuf:protobuf-java:$protobuf_version", |
| protobuf_java_util: "com.google.protobuf:protobuf-java-util:$protobuf_version", |
| proto_google_cloud_pubsub_v1: "com.google.api.grpc:proto-google-cloud-pubsub-v1:$pubsub_grpc_version", |
| proto_google_cloud_spanner_admin_database_v1: "com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:$grpc_google_common_protos", |
| proto_google_common_protos: "com.google.api.grpc:proto-google-common-protos:$grpc_google_common_protos", |
| slf4j_api: "org.slf4j:slf4j-api:1.7.25", |
| slf4j_simple: "org.slf4j:slf4j-simple:1.7.25", |
| slf4j_jdk14: "org.slf4j:slf4j-jdk14:1.7.25", |
| slf4j_log4j12: "org.slf4j:slf4j-log4j12:1.7.25", |
| snappy_java: "org.xerial.snappy:snappy-java:1.1.4", |
| spark_core: "org.apache.spark:spark-core_2.11:$spark_version", |
| spark_network_common: "org.apache.spark:spark-network-common_2.11:$spark_version", |
| spark_streaming: "org.apache.spark:spark-streaming_2.11:$spark_version", |
| stax2_api: "org.codehaus.woodstox:stax2-api:3.1.4", |
| woodstox_core_asl: "org.codehaus.woodstox:woodstox-core-asl:4.4.1", |
| quickcheck_core: "com.pholser:junit-quickcheck-core:$quickcheck_version", |
| ], |
| // For generating pom.xml from archetypes. |
| maven: [ |
| maven_compiler_plugin: "maven-plugins:maven-compiler-plugin:3.7.0", |
| maven_exec_plugin: "maven-plugins:maven-exec-plugin:1.6.0", |
| maven_jar_plugin: "maven-plugins:maven-jar-plugin:3.0.2", |
| maven_shade_plugin: "maven-plugins:maven-shade-plugin:3.1.0", |
| maven_surefire_plugin: "maven-plugins:maven-surefire-plugin:2.21.0", |
| ], |
| ] |
| |
| /*************************************************************************************************/ |
| |
| // Returns a string representing the relocated path to be used with the shadow plugin when |
| // given a suffix such as "com.google.common". |
| ext.getJavaRelocatedPath = { String suffix -> |
| return ("org.apache.beam.repackaged." |
| + project.name.replace("-", "_") |
| + "." |
| + suffix) |
| } |
| |
| // By default if there is at least one include rule then all included dependencies must be specified. |
| // This overrides the default behavior of include all if no includes are specified. |
| // See details here: |
| // https://github.com/johnrengelman/shadow/blob/98191096a94674245c7b3e63975df9e14f67074e/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internal/DefaultDependencyFilter.groovy#L123 |
| ext.DEFAULT_SHADOW_CLOSURE = { |
| dependencies { |
| include(dependency(library.java.guava)) |
| } |
| relocate("com.google.common", getJavaRelocatedPath("com.google.common")) { |
| // com.google.common is too generic, need to exclude guava-testlib |
| exclude "com.google.common.collect.testing.**" |
| exclude "com.google.common.escape.testing.**" |
| exclude "com.google.common.testing.**" |
| exclude "com.google.common.util.concurrent.testing.**" |
| } |
| } |
| |
| // A class defining the set of configurable properties accepted by applyJavaNature |
| class JavaNatureConfiguration { |
| double javaVersion = 1.8 // Controls the JDK source language and target compatibility |
| boolean enableFindbugs = true // Controls whether the findbugs plugin is enabled and configured |
| boolean enableErrorProne = true // Controls whether the errorprone plugin is enabled and configured |
| boolean failOnWarning = false // Controls whether compiler warnings are treated as errors |
| |
| //TODO(https://issues.apache.org/jira/browse/BEAM-4394): Should this default to true? |
| boolean enableSpotless = false // Controls whether spotless plugin enforces autoformat |
| boolean testShadowJar = false // Controls whether tests are run with shadowJar |
| |
| // The shadowJar / shadowTestJar tasks execute the following closure to configure themselves. |
| // Users can compose their closure with the default closure via: |
| // DEFAULT_SHADOW_CLOSURE << { |
| // dependencies { |
| // include(...) |
| // } |
| // relocate(...) |
| // } |
| Closure shadowClosure; |
| } |
| |
| // Configures a project with a default set of plugins that should apply to all Java projects. |
| // |
| // Users should invoke this method using Groovy map syntax. For example: |
| // applyJavaNature(javaVersion: 1.8) |
| // |
| // See JavaNatureConfiguration for the set of accepted properties. |
| // |
| // The following plugins are enabled: |
| // * java |
| // * maven |
| // * net.ltgt.apt (plugin to configure annotation processing tool) |
| // * propdeps (provide optional and provided dependency configurations) |
| // * propdeps-maven |
| // * checkstyle |
| // * findbugs |
| // * shadow |
| // * com.diffplug.gradle.spotless (code style plugin) |
| // |
| // Dependency Management for Java Projects |
| // --------------------------------------- |
| // |
| // By default, the shadow plugin is enabled to perform shading of commonly found dependencies. |
| // Because of this it is important that dependencies are added to the correct configuration. |
| // Dependencies should fall into one of these four configurations: |
| // * compile - Required during compilation or runtime of the main source set. |
| // This configuration represents all dependencies that much also be shaded away |
| // otherwise the generated Maven pom will be missing this dependency. |
| // * shadow - Required during compilation or runtime of the main source set. |
| // Will become a runtime dependency of the generated Maven pom. |
| // * testCompile - Required during compilation or runtime of the test source set. |
| // This must be shaded away in the shaded test jar. |
| // * shadowTest - Required during compilation or runtime of the test source set. |
| // TODO: Figure out whether this should be a test scope dependency |
| // of the generated Maven pom. |
| // |
| // When creating a cross-project dependency between two Java projects, one should only rely on the shaded configurations. |
| // This allows for compilation/test execution to occur against the final artifact that will be provided to users. |
| // This is by done by referencing the "shadow" or "shadowTest" configuration as so: |
| // dependencies { |
| // shadow project(path: "other:java:project1", configuration: "shadow") |
| // shadowTest project(path: "other:java:project2", configuration: "shadowTest") |
| // } |
| // This will ensure the correct set of transitive dependencies from those projects are correctly added to the |
| // main and test source set runtimes. |
| |
| ext.applyJavaNature = { |
| println "applyJavaNature with " + (it ? "$it" : "default configuration") + " for project $project.name" |
| // Use the implicit it parameter of the closure to handle zero argument or one argument map calls. |
| JavaNatureConfiguration configuration = it ? it as JavaNatureConfiguration : new JavaNatureConfiguration() |
| if (!configuration.shadowClosure) { |
| configuration.shadowClosure = DEFAULT_SHADOW_CLOSURE |
| } |
| |
| apply plugin: "java" |
| |
| // Configure the Java compiler source language and target compatibility levels. Also ensure that |
| // we configure the Java compiler to use UTF-8. |
| sourceCompatibility = configuration.javaVersion |
| targetCompatibility = configuration.javaVersion |
| tasks.withType(JavaCompile) { |
| options.encoding = "UTF-8" |
| options.compilerArgs += ["-Xlint:all","-Xlint:-options","-Xlint:-cast","-Xlint:-deprecation","-Xlint:-processing","-Xlint:-rawtypes","-Xlint:-serial","-Xlint:-try","-Xlint:-unchecked","-Xlint:-varargs","-parameters"] |
| if (configuration.enableErrorProne) { |
| options.compilerArgs += [ |
| "-XepDisableWarningsInGeneratedCode", |
| "-XepExcludedPaths:(.*/)?(build/generated.*avro-java|build/generated)/.*", |
| "-Xep:MutableConstantField:OFF" // Guava's immutable collections cannot appear on API surface. |
| ] |
| } |
| if (configuration.failOnWarning) { |
| options.compilerArgs += "-Werror" |
| } |
| } |
| |
| // Configure the default test tasks set of tests executed |
| // to match the equivalent set that is executed by the maven-surefire-plugin. |
| // See http://maven.apache.org/components/surefire/maven-surefire-plugin/test-mojo.html |
| test { |
| include "**/Test*.class" |
| include "**/*Test.class" |
| include "**/*Tests.class" |
| include "**/*TestCase.class" |
| } |
| |
| // Configure all test tasks to use JUnit |
| tasks.withType(Test) { |
| useJUnit { } |
| } |
| |
| // Ensure that tests are packaged and part of the artifact set. |
| task packageTests(type: Jar) { |
| classifier = 'tests' |
| from sourceSets.test.output |
| } |
| artifacts.archives packageTests |
| |
| // Configures annotation processing for commonly used annotation processors |
| // across all Java projects. |
| apply plugin: "net.ltgt.apt" |
| dependencies { |
| // Note that these plugins specifically use the compileOnly and testCompileOnly |
| // configurations because they are never required to be shaded or become a |
| // dependency of the output. |
| def auto_value = "com.google.auto.value:auto-value:1.5.3" |
| def auto_service = "com.google.auto.service:auto-service:1.0-rc2" |
| |
| compileOnly auto_value |
| apt auto_value |
| testCompileOnly auto_value |
| testApt auto_value |
| |
| compileOnly auto_service |
| apt auto_service |
| testCompileOnly auto_service |
| testApt auto_service |
| } |
| |
| // Add the optional and provided configurations for dependencies |
| // TODO: Either remove these plugins and find another way to generate the Maven poms |
| // with the correct dependency scopes configured. |
| apply plugin: 'propdeps' |
| apply plugin: 'propdeps-maven' |
| |
| // Configures a checkstyle plugin enforcing a set of rules and also allows for a set of |
| // suppressions. |
| apply plugin: 'checkstyle' |
| tasks.withType(Checkstyle) { |
| configFile = project(":").file("sdks/java/build-tools/src/main/resources/beam/checkstyle.xml") |
| configProperties = [ "checkstyle.suppressions.file": project(":").file("sdks/java/build-tools/src/main/resources/beam/suppressions.xml") ] |
| showViolations = true |
| maxErrors = 0 |
| } |
| checkstyle { |
| toolVersion = "8.7" |
| } |
| |
| // Apply the eclipse and apt-eclipse plugins. This adds the "eclipse" task and |
| // connects the apt-eclipse plugin to update the eclipse project files |
| // with the instructions needed to run apt within eclipse to handle the AutoValue |
| // and additional annotations |
| apply plugin: 'eclipse' |
| apply plugin: "net.ltgt.apt-eclipse" |
| |
| // Enables a plugin which can apply code formatting to source. |
| // TODO(https://issues.apache.org/jira/browse/BEAM-4394): Should this plugin be enabled for all projects? |
| if (configuration.enableSpotless) { |
| apply plugin: "com.diffplug.gradle.spotless" |
| spotless { |
| java { |
| googleJavaFormat() |
| } |
| } |
| } |
| |
| // Enables a plugin which performs code analysis for common bugs. |
| // This plugin is configured to only analyze the "main" source set. |
| if (configuration.enableFindbugs) { |
| apply plugin: 'findbugs' |
| findbugs { |
| excludeFilter = rootProject.file('sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml') |
| sourceSets = [sourceSets.main] |
| } |
| tasks.withType(FindBugs) { |
| reports { |
| html.enabled = true |
| xml.enabled = false |
| } |
| } |
| } |
| |
| // Enable errorprone, not by default right now |
| if (configuration.enableErrorProne) { |
| apply plugin: 'net.ltgt.errorprone' |
| tasks.withType(JavaCompile) { |
| options.compilerArgs += "-XepDisableWarningsInGeneratedCode" |
| } |
| } |
| |
| // Enables a plugin which can perform shading of classes. See the general comments |
| // above about dependency management for Java projects and how the shadow plugin |
| // is expected to be used for the different Gradle configurations. |
| // |
| // TODO: Enforce all relocations are always performed to: |
| // getJavaRelocatedPath(package_suffix) where package_suffix is something like "com.google.commmon" |
| apply plugin: 'com.github.johnrengelman.shadow' |
| |
| // Create a new configuration 'shadowTest' like 'shadow' for the test scope |
| configurations { |
| shadow { |
| description = "Dependencies for shaded source set 'main'" |
| } |
| compile.extendsFrom shadow |
| shadowTest { |
| description = "Dependencies for shaded source set 'test'" |
| extendsFrom shadow |
| } |
| testCompile.extendsFrom shadowTest |
| } |
| |
| // Always configure the shadowJar classifier and merge service files. |
| shadowJar ({ |
| classifier = "shaded" |
| mergeServiceFiles() |
| into("META-INF/") { |
| from "${rootProject.projectDir}/LICENSE" |
| from "${rootProject.projectDir}/NOTICE" |
| } |
| } << configuration.shadowClosure) |
| |
| // Always configure the shadowTestJar classifier and merge service files. |
| tasks.create(name: 'shadowTestJar', type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar, { |
| classifier = "shaded-tests" |
| from sourceSets.test.output |
| configurations = [project.configurations.testRuntime] |
| |
| exclude "META-INF/INDEX.LIST" |
| exclude "META-INF/*.SF" |
| exclude "META-INF/*.DSA" |
| exclude "META-INF/*.RSA" |
| } << configuration.shadowClosure) |
| |
| // Ensure that shaded jar and test-jar are part of the their own configuration artifact sets |
| artifacts.shadow shadowJar |
| artifacts.shadowTest shadowTestJar |
| |
| if (configuration.testShadowJar) { |
| // Use a configuration and dependency set which represents the execution classpath using shaded artifacts for tests. |
| configurations { |
| shadowTestRuntimeClasspath |
| } |
| |
| dependencies { |
| shadowTestRuntimeClasspath project(path: project.path, configuration: "shadowTest") |
| shadowTestRuntimeClasspath project(path: project.path, configuration: "provided") |
| } |
| |
| test { |
| classpath = configurations.shadowTestRuntimeClasspath |
| } |
| } |
| |
| if (isRelease() || project.hasProperty('publishing')) { |
| apply plugin: "maven-publish" |
| |
| // Create a task which emulates the maven-archiver plugin in generating a |
| // pom.properties file. |
| task generatePomPropertiesFileForMavenJavaPublication { |
| outputs.file "${project.buildDir}/publications/mavenJava/pom.properties" |
| doLast { |
| new File("${project.buildDir}/publications/mavenJava/pom.properties").text = |
| """version=${project.version} |
| groupId=${project.group} |
| artifactId=${project.name} |
| """ |
| } |
| } |
| |
| // Have the shaded include both the generate pom.xml and its properties file |
| // emulating the behavior of the maven-archiver plugin. |
| shadowJar { |
| dependsOn 'generatePomFileForMavenJavaPublication' |
| into("META-INF/maven/${project.group}/${project.name}") { |
| from "${project.buildDir}/publications/mavenJava/pom.xml" |
| } |
| dependsOn 'generatePomPropertiesFileForMavenJavaPublication' |
| into("META-INF/maven/${project.group}/${project.name}") { |
| from "${project.buildDir}/publications/mavenJava/pom.properties" |
| } |
| } |
| |
| // Only build artifacts for archives if we are publishing |
| artifacts.archives shadowJar |
| artifacts.archives shadowTestJar |
| |
| task sourcesJar(type: Jar) { |
| from sourceSets.main.allSource |
| classifier = 'sources' |
| } |
| artifacts.archives sourcesJar |
| |
| task testSourcesJar(type: Jar) { |
| from sourceSets.test.allSource |
| classifier = 'test-sources' |
| } |
| artifacts.archives testSourcesJar |
| |
| task javadocJar(type: Jar, dependsOn: javadoc) { |
| classifier = 'javadoc' |
| from javadoc.destinationDir |
| } |
| artifacts.archives javadocJar |
| |
| // Only sign artifacts if we are performing a release |
| if (isRelease()) { |
| apply plugin: "signing" |
| signing { |
| useGpgCmd() |
| // Drop the unshaded jar because we don't want to publish it. |
| // Otherwise the unshaded one is the only one published since they |
| // both have no classifier and the names conflict. |
| def unshaded = configurations.archives.getArtifacts().matching({ |
| artifact -> artifact.classifier == "" }) |
| configurations.archives.getArtifacts().removeAll(unshaded) |
| sign configurations.archives |
| } |
| |
| model { |
| tasks.generatePomFileForMavenJavaPublication { |
| destination = file("$buildDir/publications/mavenJava/pom.xml") |
| } |
| tasks.publishMavenJavaPublicationToMavenLocal { |
| dependsOn project.tasks.signArchives |
| } |
| tasks.publishMavenJavaPublicationToMavenRepository { |
| dependsOn project.tasks.signArchives |
| } |
| } |
| } |
| |
| uploadArchives { |
| repositories { |
| mavenDeployer { |
| beforeDeployment { MavenDeployment deployment -> isRelease() && signing.signPom(deployment) } |
| } |
| } |
| } |
| |
| publishing { |
| repositories { |
| maven { |
| url(project.properties['distMgmtSnapshotsUrl'] ?: isRelease() |
| ? 'https://repository.apache.org/service/local/staging/deploy/maven2' |
| : 'https://repository.apache.org/content/repositories/snapshots') |
| |
| // We attempt to find and load credentials from ~/.m2/settings.xml file that a user |
| // has configured with the Apache release and snapshot staging credentials. |
| // <settings> |
| // <servers> |
| // <server> |
| // <id>apache.releases.https</id> |
| // <username>USER_TOKEN</username> |
| // <password>PASS_TOKEN</password> |
| // </server> |
| // <server> |
| // <id>apache.snapshots.https</id> |
| // <username>USER_TOKEN</username> |
| // <password>PASS_TOKEN</password> |
| // </server> |
| // </servers> |
| // </settings> |
| def settingsXml = new File(System.getProperty('user.home'), '.m2/settings.xml') |
| if (settingsXml.exists()) { |
| def serverId = (isRelease() ? 'apache.releases.https' : 'apache.snapshots.https') |
| def m2SettingCreds = new XmlSlurper().parse(settingsXml).servers.server.find { server -> serverId.equals(server.id.text()) } |
| if (m2SettingCreds) { |
| credentials { |
| username m2SettingCreds.username.text() |
| password m2SettingCreds.password.text() |
| } |
| } |
| } |
| } |
| } |
| |
| publications { |
| mavenJava(MavenPublication) { |
| artifact shadowJar { |
| // Strip the "shaded" classifier. |
| classifier null |
| } |
| artifact shadowTestJar { |
| classifier "tests" |
| } |
| artifact sourcesJar { |
| classifier "sources" |
| } |
| artifact testSourcesJar { |
| classifier "test-sources" |
| } |
| artifact javadocJar { |
| classifier "javadoc" |
| } |
| |
| pom.withXml { |
| def root = asNode() |
| root.appendNode('name', project.description) |
| if (project.hasProperty("summary")) { |
| root.appendNode('description', project.summary) |
| } |
| root.appendNode('url', "http://beam.apache.org") |
| root.appendNode('inceptionYear', "2016") |
| |
| def licenseNode = root.appendNode('licenses').appendNode('license') |
| licenseNode.appendNode('name', "Apache License, Version 2.0") |
| licenseNode.appendNode('url', "http://www.apache.org/licenses/LICENSE-2.0.txt") |
| licenseNode.appendNode('distribution', "repo") |
| |
| def scmNode = root.appendNode('scm') |
| scmNode.appendNode('connection', "scm:git:https://gitbox.apache.org/repos/asf/beam.git") |
| scmNode.appendNode('developerConnection', "scm:git:https://gitbox.apache.org/repos/asf/beam.git") |
| scmNode.appendNode('url', "https://gitbox.apache.org/repos/asf?p=beam.git;a=summary") |
| |
| def issueMgmtNode = root.appendNode('issueManagement') |
| issueMgmtNode.appendNode('system', "jira") |
| issueMgmtNode.appendNode('url', "https://issues.apache.org/jira/browse/BEAM") |
| |
| def mailingListsNode = root.appendNode('mailingLists') |
| def devListNode = mailingListsNode.appendNode('mailingList') |
| devListNode.appendNode('name', "Beam Dev") |
| devListNode.appendNode('subscribe', "dev-subscribe@beam.apache.org") |
| devListNode.appendNode('unsubscribe', "dev-unsubscribe@beam.apache.org") |
| devListNode.appendNode('post', "dev@beam.apache.org") |
| devListNode.appendNode('archive', "http://www.mail-archive.com/dev%beam.apache.org") |
| def userListNode = mailingListsNode.appendNode('mailingList') |
| userListNode.appendNode('name', "Beam User") |
| userListNode.appendNode('subscribe', "user-subscribe@beam.apache.org") |
| userListNode.appendNode('unsubscribe', "user-unsubscribe@beam.apache.org") |
| userListNode.appendNode('post', "user@beam.apache.org") |
| userListNode.appendNode('archive', "http://www.mail-archive.com/user%beam.apache.org") |
| def commitListNode = mailingListsNode.appendNode('mailingList') |
| commitListNode.appendNode('name', "Beam Commits") |
| commitListNode.appendNode('subscribe', "commits-subscribe@beam.apache.org") |
| commitListNode.appendNode('unsubscribe', "commits-unsubscribe@beam.apache.org") |
| commitListNode.appendNode('post', "commits@beam.apache.org") |
| commitListNode.appendNode('archive', "http://www.mail-archive.com/commits%beam.apache.org") |
| |
| def developerNode = root.appendNode('developers').appendNode('developer') |
| developerNode.appendNode('name', "The Apache Beam Team") |
| developerNode.appendNode('email', "dev@beam.apache.org") |
| developerNode.appendNode('url', "http://beam.apache.org") |
| developerNode.appendNode('organization', "Apache Software Foundation") |
| developerNode.appendNode('organizationUrl', "http://www.apache.org") |
| |
| // Iterate over the dependencies that would exist post shading, |
| // adding a <dependency> node for each |
| def dependenciesNode = root.appendNode('dependencies') |
| def generateDependenciesFromConfiguration = { param -> |
| configurations."${param.configuration}".allDependencies.each { |
| def dependencyNode = dependenciesNode.appendNode('dependency') |
| dependencyNode.appendNode('groupId', it.group) |
| dependencyNode.appendNode('artifactId', it.name) |
| dependencyNode.appendNode('version', it.version) |
| |
| dependencyNode.appendNode('scope', param.scope) |
| |
| // Start with any exclusions that were added via configuration exclude rules. |
| // Then add all the exclusions that are specific to the dependency (if any |
| // were declared). Finally build the node that represents all exclusions. |
| def exclusions = [] |
| exclusions += configurations."${param.configuration}".excludeRules |
| if (it.hasProperty('excludeRules')) { |
| exclusions += it.excludeRules |
| } |
| if (!exclusions.empty) { |
| def exclusionsNode = dependencyNode.appendNode('exclusions') |
| for (ExcludeRule exclude : exclusions) { |
| def exclusionNode = exclusionsNode.appendNode('exclusion') |
| exclusionNode.appendNode('groupId', exclude.group) |
| exclusionNode.appendNode('artifactId', exclude.module) |
| } |
| } |
| } |
| } |
| |
| // TODO: Should we use the runtime scope instead of the compile scope |
| // which forces all our consumers to declare what they consume? |
| generateDependenciesFromConfiguration(configuration: 'shadow', scope: 'compile') |
| generateDependenciesFromConfiguration(configuration: 'provided', scope: 'provided') |
| |
| // NB: This must come after asNode() logic, as it seems asNode() |
| // removes XML comments. |
| // TODO: Load this from file? |
| def elem = asElement() |
| def hdr = elem.getOwnerDocument().createComment( |
| ''' |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| http://www.apache.org/licenses/LICENSE-2.0 |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ''') |
| elem.insertBefore(hdr, elem.getFirstChild()) |
| |
| // create the sign pom artifact |
| def pomFile = file("${project.buildDir}/publications/mavenJava/pom.xml") |
| writeTo(pomFile) |
| if (isRelease()) { |
| def pomAscFile = signing.sign(pomFile).signatureFiles[0] |
| artifact(pomAscFile) { |
| classifier = null |
| extension = 'pom.asc' |
| } |
| } |
| } |
| |
| // create the signed artifacts |
| if (isRelease()) { |
| project.tasks.signArchives.signatureFiles.each { |
| artifact(it) { |
| def matcher = it.file =~ /-(tests|sources|test-sources|javadoc)\.jar\.asc$/ |
| if (matcher.find()) { |
| classifier = matcher.group(1) |
| } else { |
| classifier = null |
| } |
| extension = 'jar.asc' |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| // Ban these dependencies from all configurations |
| configurations.all { |
| // guava-jdk5 brings in classes which conflict with guava |
| exclude group: "com.google.guava", module: "guava-jdk5" |
| // Ban the usage of the JDK tools as a library as this is system dependent |
| exclude group: "jdk.tools", module: "jdk.tools" |
| // protobuf-lite duplicates classes which conflict with protobuf-java |
| exclude group: "com.google.protobuf", module: "protobuf-lite" |
| // Exclude these test dependencies because they bundle other common |
| // test libraries classes causing version conflicts. Users should rely |
| // on using the yyy-core package instead of the yyy-all package. |
| exclude group: "org.hamcrest", module: "hamcrest-all" |
| exclude group: "org.mockito", module: "mockito-all" |
| } |
| |
| // Force usage of the libraries defined within our common set found in the root |
| // build.gradle instead of using Gradles default dependency resolution mechanism |
| // which chooses the latest version available. |
| // |
| // TODO: Figure out whether we should force all dependency conflict resolution |
| // to occur in the "shadow" and "shadowTest" configurations. |
| configurations.all { config -> |
| // The "errorprone" configuration controls the classpath used by errorprone static analysis, which |
| // has different dependencies than our project. |
| if (config.getName() != "errorprone") { |
| config.resolutionStrategy { |
| force library.java.values() |
| } |
| } |
| } |
| |
| // These directories for when build actions are delegated to Gradle |
| def gradleAptGeneratedMain = "${project.buildDir}/generated/source/apt/main" |
| def gradleAptGeneratedTest = "${project.buildDir}/generated/source/apt/test" |
| |
| // These directories for when build actions are executed by Idea |
| // IntelliJ does not add these source roots (that it owns!) unless hinted |
| def ideaRoot = "${project.projectDir}/out" |
| def ideaAptGeneratedMain = "${ideaRoot}/production/classes/generated" |
| def ideaAptGeneratedTest = "${ideaRoot}/test/classes/generated_test" |
| |
| idea { |
| module { |
| sourceDirs += file(gradleAptGeneratedMain) |
| testSourceDirs += file(gradleAptGeneratedTest) |
| |
| sourceDirs += file(ideaAptGeneratedMain) |
| testSourceDirs += file(ideaAptGeneratedTest) |
| |
| generatedSourceDirs += [ |
| file(gradleAptGeneratedMain), |
| file(gradleAptGeneratedTest), |
| file(ideaAptGeneratedMain), |
| file(ideaAptGeneratedTest) |
| ] |
| |
| } |
| } |
| } |
| |
| // Reads and contains all necessary performance test parameters |
| class JavaPerformanceTestConfiguration { |
| |
| /* Optional properties (set only if needed in your case): */ |
| |
| // Path to PerfKitBenchmarker application (pkb.py). |
| // It is only required when running Performance Tests with PerfKitBenchmarker |
| String pkbLocation = System.getProperty('pkbLocation') |
| |
| // Data Processing Backend's log level. |
| String logLevel = System.getProperty('logLevel', 'INFO') |
| |
| // Path to gradle binary. |
| String gradleBinary = System.getProperty('gradleBinary', './gradlew') |
| |
| // If benchmark is official or not. |
| // Official benchmark results are meant to be displayed on PerfKitExplorer dashboards. |
| String isOfficial = System.getProperty('official', 'false') |
| |
| // Specifies names of benchmarks to be run by PerfKitBenchmarker. |
| String benchmarks = System.getProperty('benchmarks', 'beam_integration_benchmark') |
| |
| // If beam is not "prebuilt" then PerfKitBenchmarker runs the build task before running the tests. |
| String beamPrebuilt = System.getProperty('beamPrebuilt', 'true') |
| |
| // Beam's sdk to be used by PerfKitBenchmarker. |
| String beamSdk = System.getProperty('beamSdk', 'java') |
| |
| // Timeout (in seconds) after which PerfKitBenchmarker will stop executing the benchmark (and will fail). |
| String timeout = System.getProperty('itTimeout', '1200') |
| |
| // Path to kubernetes configuration file. |
| String kubeconfig = System.getProperty('kubeconfig', System.getProperty('user.home') + '/.kube/config') |
| |
| // Path to kubernetes executable. |
| String kubectl = System.getProperty('kubectl', 'kubectl') |
| |
| // Paths to files with kubernetes infrastructure to setup before the test runs. |
| // PerfKitBenchmarker will have trouble reading 'null' path. It expects empty string if no scripts are expected. |
| String kubernetesScripts = System.getProperty('kubernetesScripts', '') |
| |
| // Path to file with 'dynamic' and 'static' pipeline options. |
| // that will be appended by PerfKitBenchmarker to the test running command. |
| // PerfKitBenchmarker will have trouble reading 'null' path. It expects empty string if no config file is expected. |
| String optionsConfigFile = System.getProperty('beamITOptions', '') |
| |
| // Any additional properties to be appended to benchmark execution command. |
| String extraProperties = System.getProperty('beamExtraProperties', '') |
| |
| // Runner which will be used for running the tests. Possible values: dataflow/direct. |
| // PerfKitBenchmarker will have trouble reading 'null' value. It expects empty string if no config file is expected. |
| String runner = System.getProperty('integrationTestRunner', '') |
| |
| // Filesystem which will be used for running the tests. Possible values: hdfs. |
| // if not specified runner's local filesystem will be used. |
| String filesystem = System.getProperty('filesystem') |
| |
| /* Always required properties: */ |
| |
| // Pipeline options to be used by the tested pipeline. |
| String integrationTestPipelineOptions = System.getProperty('integrationTestPipelineOptions') |
| |
| // Fully qualified name of the test to be run, eg: |
| // 'org.apache.beam.sdks.java.io.jdbc.JdbcIOIT'. |
| String integrationTest = System.getProperty('integrationTest') |
| |
| // Relative path to module where the test is, eg. 'sdks/java/io/jdbc. |
| String itModule = System.getProperty('itModule') |
| } |
| |
| // When applied in a module's build.gradle file, this closure provides task for running |
| // IO integration tests (manually, without PerfKitBenchmarker). |
| ext.enableJavaPerformanceTesting = { |
| println "enableJavaPerformanceTesting with ${it ? "$it" : "default configuration"} for project ${project.name}" |
| |
| // Use the implicit it parameter of the closure to handle zero argument or one argument map calls. |
| // See: http://groovy-lang.org/closures.html#implicit-it |
| JavaPerformanceTestConfiguration configuration = it ? it as JavaPerformanceTestConfiguration : new JavaPerformanceTestConfiguration() |
| |
| // Task for running integration tests |
| task integrationTest(type: Test) { |
| // Disable Gradle cache (it should not be used because the IT's won't run). |
| outputs.upToDateWhen { false } |
| |
| include "**/*IT.class" |
| systemProperties.beamTestPipelineOptions = configuration.integrationTestPipelineOptions |
| } |
| } |
| |
| // When applied in a module's build.gradle file, this closure adds task providing |
| // additional dependencies that might be needed while running integration tests. |
| ext.provideIntegrationTestingDependencies = { |
| println "provideIntegrationTestingDependencies with ${it ? "$it" : "default configuration"} for project ${project.name}" |
| |
| // Use the implicit it parameter of the closure to handle zero argument or one argument map calls. |
| // See: http://groovy-lang.org/closures.html#implicit-it |
| JavaPerformanceTestConfiguration configuration = it ? it as JavaPerformanceTestConfiguration : new JavaPerformanceTestConfiguration() |
| |
| // Add runners needed to run integration tests on |
| task packageIntegrationTests(type: Jar) { |
| def runner = configuration.runner |
| def filesystem = configuration.filesystem |
| |
| dependencies { |
| |
| /* include dependencies required by runners */ |
| //if (runner?.contains('dataflow')) { |
| if (runner?.equalsIgnoreCase('dataflow')) { |
| testCompile project(path: ":beam-runners-google-cloud-dataflow-java", configuration: 'shadowTest') |
| } |
| |
| if (runner?.equalsIgnoreCase('direct')) { |
| testCompile project(path: ":beam-runners-direct-java", configuration: 'shadowTest') |
| } |
| |
| /* include dependencies required by filesystems */ |
| if (filesystem?.equalsIgnoreCase('hdfs')) { |
| testCompile project(path: ":beam-sdks-java-io-hadoop-file-system", configuration: 'shadowTest') |
| shadowTest library.java.hadoop_client |
| } |
| |
| /* include dependencies required by AWS S3 */ |
| if (filesystem?.equalsIgnoreCase('s3')) { |
| testCompile project(path: ":beam-sdks-java-io-amazon-web-services", configuration: 'shadowTest') |
| } |
| } |
| } |
| } |
| |
| // When applied in a module's build gradle file, this closure provides a task |
| // that will involve PerfKitBenchmarker for running integrationTests. |
| ext.createPerformanceTestHarness = { |
| println "createPerformanceTestHarness with ${it ? "$it" : "default configuration"} for project ${project.name}" |
| |
| // Use the implicit it parameter of the closure to handle zero argument or one argument map calls. |
| // See: http://groovy-lang.org/closures.html#implicit-it |
| JavaPerformanceTestConfiguration configuration = it ? it as JavaPerformanceTestConfiguration : new JavaPerformanceTestConfiguration() |
| |
| // This task runs PerfKitBenchmarker, which does benchmarking of the IO ITs. |
| // The arguments passed to it allows it to invoke gradle again with the desired benchmark. |
| // |
| // To invoke this, run: |
| // |
| // ./gradlew performanceTest \ |
| // -DpkbLocation="<path to pkb.py>" |
| // -DintegrationTestPipelineOptions='["--numberOfRecords=1000", "<more options>"]' \ |
| // -DintegrationTest=<io test, eg. org.apache.beam.sdk.io.text.TextIOIT> \ |
| // -DitModule=<directory containing desired test, eg. sdks/java/io/file-based-io-tests> \ |
| // -DintegrationTestRunner=<runner to be used for testing, eg. dataflow> |
| // |
| // There are more options with default values that can be tweaked if needed (see below). |
| task performanceTest(type: Exec) { |
| |
| // PerfKitBenchmarker needs to work in the Beam's root directory, |
| // otherwise it requires absolute paths ./gradlew, kubernetes scripts etc. |
| commandLine "${configuration.pkbLocation}", |
| "--dpb_log_level=${configuration.logLevel}", |
| "--gradle_binary=${configuration.gradleBinary}", |
| "--official=${configuration.isOfficial}", |
| "--benchmarks=${configuration.benchmarks}", |
| "--beam_location=${rootProject.projectDir}", |
| |
| "--beam_prebuilt=${configuration.beamPrebuilt}", |
| "--beam_sdk=${configuration.beamSdk}", |
| |
| "--beam_it_timeout=${configuration.timeout}", |
| |
| "--kubeconfig=${configuration.kubeconfig}", |
| "--kubectl=${configuration.kubectl}", |
| "--beam_kubernetes_scripts=${configuration.kubernetesScripts}", |
| |
| "--beam_it_options=${configuration.integrationTestPipelineOptions}", |
| "--beam_options_config_file=${configuration.optionsConfigFile}", |
| |
| "--beam_it_class=${configuration.integrationTest}", |
| "--beam_it_module=${configuration.itModule}", |
| |
| "--beam_extra_properties=${configuration.extraProperties}", |
| "--beam_runner=${configuration.runner}" |
| } |
| } |
| |
| /*************************************************************************************************/ |
| |
| ext.applyGoNature = { |
| println "applyGoNature with " + (it ? "$it" : "default configuration") + " for project $project.name" |
| apply plugin: "com.github.blindpirate.gogradle" |
| golang { |
| goVersion = '1.10' |
| } |
| |
| repositories { |
| golang { |
| // Gogradle doesn't like thrift: https://github.com/gogradle/gogradle/issues/183 |
| root 'git.apache.org/thrift.git' |
| emptyDir() |
| } |
| golang { |
| root 'github.com/apache/thrift' |
| emptyDir() |
| } |
| } |
| |
| idea { |
| module { |
| // The gogradle plugin downloads all dependencies into the source tree here, |
| // which is a path baked into golang |
| excludeDirs += file("${project.path}/vendor") |
| |
| // gogradle's private working directory |
| excludeDirs += file("${project.path}/.gogradle") |
| } |
| } |
| } |
| |
| /*************************************************************************************************/ |
| |
| ext.applyDockerNature = { |
| println "applyDockerNature with " + (it ? "$it" : "default configuration") + " for project $project.name" |
| apply plugin: "com.palantir.docker" |
| docker { |
| noCache true |
| } |
| } |
| |
| // A class defining the set of configurable properties accepted by containerImageName. |
| class ContainerImageNameConfiguration { |
| String root = null // Sets the docker repository root (optional). |
| String name = null // Sets the short container image name, such as "go" (required). |
| String tag = null // Sets the image tag (optional). |
| } |
| |
| // containerImageName returns a configurable container image name, by default a |
| // development image at bintray.io (see sdks/CONTAINERS.md): |
| // |
| // $USER-docker-apache.bintray.io/beam/$NAME:latest |
| // |
| // Both the root and tag can be defined using properties or explicitly provided. |
| ext.containerImageName = { |
| println "containerImageName with " + (it ? "$it" : "default configuration") + " for project $project.name" |
| // Use the implicit it parameter of the closure to handle zero argument or one argument map calls. |
| ContainerImageNameConfiguration configuration = it ? it as ContainerImageNameConfiguration : new ContainerImageNameConfiguration() |
| |
| if (configuration.root == null) { |
| if (rootProject.hasProperty(["docker-repository-root"])) { |
| configuration.root = rootProject["docker-repository-root"] |
| } else { |
| configuration.root = "${System.properties["user.name"]}-docker-apache.bintray.io/beam" |
| } |
| } |
| if (configuration.tag == null) { |
| if (rootProject.hasProperty(["docker-tag"])) { |
| configuration.tag = rootProject["docker-tag"] |
| } else { |
| configuration.tag = 'latest' |
| } |
| } |
| return "${configuration.root}/${configuration.name}:${configuration.tag}" |
| } |
| |
| /*************************************************************************************************/ |
| |
| ext.applyGrpcNature = { |
| println "applyGrpcNature with " + (it ? "$it" : "default configuration") + " for project $project.name" |
| apply plugin: "com.google.protobuf" |
| protobuf { |
| protoc { |
| // The artifact spec for the Protobuf Compiler |
| artifact = "com.google.protobuf:protoc:3.2.0" |
| } |
| |
| // Configure the codegen plugins |
| plugins { |
| // An artifact spec for a protoc plugin, with "grpc" as |
| // the identifier, which can be referred to in the "plugins" |
| // container of the "generateProtoTasks" closure. |
| grpc { |
| artifact = "io.grpc:protoc-gen-grpc-java:1.2.0" |
| } |
| } |
| |
| generateProtoTasks { |
| ofSourceSet("main")*.plugins { |
| // Apply the "grpc" plugin whose spec is defined above, without |
| // options. Note the braces cannot be omitted, otherwise the |
| // plugin will not be added. This is because of the implicit way |
| // NamedDomainObjectContainer binds the methods. |
| grpc { } |
| } |
| } |
| } |
| |
| def generatedProtoMainJavaDir = "${project.buildDir}/generated/source/proto/main/java" |
| def generatedProtoTestJavaDir = "${project.buildDir}/generated/source/proto/test/java" |
| def generatedGrpcMainJavaDir = "${project.buildDir}/generated/source/proto/main/grpc" |
| def generatedGrpcTestJavaDir = "${project.buildDir}/generated/source/proto/test/grpc" |
| idea { |
| module { |
| sourceDirs += file(generatedProtoMainJavaDir) |
| generatedSourceDirs += file(generatedProtoMainJavaDir) |
| |
| testSourceDirs += file(generatedProtoTestJavaDir) |
| generatedSourceDirs += file(generatedProtoTestJavaDir) |
| |
| sourceDirs += file(generatedGrpcMainJavaDir) |
| generatedSourceDirs += file(generatedGrpcMainJavaDir) |
| |
| testSourceDirs += file(generatedGrpcTestJavaDir) |
| generatedSourceDirs += file(generatedGrpcTestJavaDir) |
| } |
| } |
| } |
| |
| /*************************************************************************************************/ |
| |
| // TODO: Decide whether this should be inlined into the one project that relies on it |
| // or be left here. |
| ext.applyAvroNature = { |
| println "applyAvroNature with " + (it ? "$it" : "default configuration") + " for project $project.name" |
| apply plugin: "com.commercehub.gradle.plugin.avro" |
| } |
| |
| // A class defining the set of configurable properties for createJavaExamplesArchetypeValidationTask |
| class JavaExamplesArchetypeValidationConfiguration { |
| // Type [Quickstart, MobileGaming] for the postrelease validation is required. |
| // Used both for the test name run${type}Java${runner} |
| // and also for the script name, ${type}-java-${runner}.toLowerCase(). |
| String type |
| |
| // runner [Direct, Dataflow, Spark, Flink, FlinkLocal, Apex] |
| String runner |
| |
| // gcpProject sets the gcpProject argument when executing examples. |
| String gcpProject |
| |
| // gcsBucket sets the gcsProject argument when executing examples. |
| String gcsBucket |
| |
| // bqDataset sets the BigQuery Dataset when executing mobile-gaming examples |
| String bqDataset |
| |
| // pubsubTopic sets topics when executing streaming pipelines |
| String pubsubTopic |
| } |
| |
| // Creates a task to run the quickstart for a runner. |
| // Releases version and URL, can be overriden for a RC release with |
| // ./gradlew :release:runJavaExamplesValidationTask -Pver=2.3.0 -Prepourl=https://repository.apache.org/content/repositories/orgapachebeam-1027 |
| ext.createJavaExamplesArchetypeValidationTask = { |
| JavaExamplesArchetypeValidationConfiguration config = it as JavaExamplesArchetypeValidationConfiguration |
| def taskName = "run${config.type}Java${config.runner}" |
| println "Generating :${taskName}" |
| def releaseVersion = project.findProperty('ver') ?: version |
| def releaseRepo = project.findProperty('repourl') ?: 'https://repository.apache.org/content/repositories/snapshots' |
| def argsNeeded = ["--ver=${releaseVersion}", "--repourl=${releaseRepo}"] |
| if (config.gcpProject) { |
| argsNeeded.add("--gcpProject=${config.gcpProject}") |
| } |
| if (config.gcsBucket) { |
| argsNeeded.add("--gcsBucket=${config.gcsBucket}") |
| } |
| if (config.bqDataset) { |
| argsNeeded.add("--bqDataset=${config.bqDataset}") |
| } |
| if (config.pubsubTopic) { |
| argsNeeded.add("--pubsubTopic=${config.pubsubTopic}") |
| } |
| project.evaluationDependsOn(':release') |
| task "${taskName}" (dependsOn: ':release:classes', type: JavaExec) { |
| group = "Verification" |
| description = "Run the Beam ${config.type} with the ${config.runner} runner" |
| main = "${config.type}-java-${config.runner}".toLowerCase() |
| classpath = project(':release').sourceSets.main.runtimeClasspath |
| args argsNeeded |
| } |
| } |