buildscript { ext.kotlin_version = '1.3.21' repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8' classpath 'io.spring.gradle:dependency-management-plugin:1.0.7.RELEASE' classpath 'net.ltgt.gradle:gradle-apt-plugin:0.21' classpath 'com.github.jengelman.gradle.plugins:shadow:5.1.0' } } def getGitHash = { -> def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'rev-parse', 'HEAD' standardOutput = stdout } return stdout.toString().trim() } allprojects { group = 'com.spotify.heroic' version = System.getenv('CIRCLE_TAG') ?: System.getenv('DOCKER_TAG') ?: '0.0.1-SNAPSHOT' ext.gitCommit = getGitHash() apply plugin: "io.spring.dependency-management" apply plugin: 'com.google.protobuf' apply plugin: 'kotlin' apply plugin: 'net.ltgt.apt' apply plugin: 'net.ltgt.apt-idea' apply plugin: 'java' apply plugin: 'idea' apply plugin: 'checkstyle' apply plugin: 'jacoco' apply plugin: 'maven-publish' repositories { mavenLocal() mavenCentral() } sourceSets { test { // Exclude integration tests java { exclude '**/*IT.java' } } integrationTest { compileClasspath += test.compileClasspath runtimeClasspath += test.runtimeClasspath resources.srcDir 'src/test/resources' // Exclude unit tests java { srcDirs = test.java.srcDirs exclude '**/*Test.java' } } } configurations { integrationTestCompile.extendsFrom testCompile integrationTestRuntime.extendsFrom testRuntime } // Set options for kotlin tasks regardless of sourceset tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { kotlinOptions { jvmTarget = '1.8' languageVersion = '1.3' apiVersion = '1.3' } } protobuf { protoc { // Download from repositories artifact = 'com.google.protobuf:protoc:3.13.0' } } jacoco { toolVersion = '0.8.4' } sourceCompatibility = '11' publishing { publications { maven(MavenPublication) { from(components.java) } } } configurations.all { resolutionStrategy { force 'com.spotify:dns:3.2.2' } } // Dependency management defines shared versions across all submodules to ensure consistency dependencyManagement { dependencies { dependencySet(group: 'org.elasticsearch.client', version: '7.5.0') { entry 'transport' entry 'elasticsearch-rest-client' entry 'elasticsearch-rest-high-level-client' entry 'elasticsearch-rest-client-sniffer' } dependency 'com.datastax.cassandra:cassandra-driver-core:3.8.0' dependency 'com.spotify:folsom:1.7.4' dependencySet(group: 'com.spotify.metrics', version: '1.0.2') { entry 'semantic-metrics-core' entry 'semantic-metrics-ffwd-reporter' } dependency 'com.google.protobuf:protobuf-java:3.13.0' dependency 'com.squareup.okhttp3:okhttp:3.10.0' dependencySet(group: 'org.jetbrains.kotlin', version: '1.3.21') { entry 'kotlin-stdlib-jdk-8' entry 'kotlin-test' } dependencySet(group: 'com.google.auto.value', version: '1.6.3') { entry 'auto-value-annotations' entry 'auto-value' } dependencySet(group: 'com.google.dagger', version: '2.7') { entry 'dagger' entry 'dagger-compiler' } dependencySet(group: 'eu.toolchain.async', version: '1.11.0') { entry 'tiny-async-api' entry 'tiny-async-core' } dependencySet(group: 'eu.toolchain.serializer', version: '1.4.5') { entry 'tiny-serializer-core' entry 'tiny-serializer-api' entry 'tiny-serializer-processor' } dependencySet(group: 'io.netty', version: '4.1.31.Final') { entry 'netty-transport' entry 'netty-transport-native-epoll' entry 'netty-codec' } dependency 'io.netty:netty-tcnative-boringssl-static:2.0.28.Final' dependencySet(group: 'io.grpc', version: '1.35.0') { entry 'grpc-auth' entry 'grpc-core' entry 'grpc-netty' entry 'grpc-netty-shaded' entry 'grpc-protobuf' entry 'grpc-protobuf-lite' entry 'grpc-stub' } dependencySet(group: 'io.opencensus', version: '0.22.1') { entry 'opencensus-api' entry 'opencensus-impl' entry 'opencensus-contrib-zpages' entry 'opencensus-contrib-grpc-util' entry 'opencensus-contrib-http-util' } dependency 'com.lightstep.opencensus:lightstep-opencensus-exporter:0.0.3' dependency 'com.lightstep.tracer:tracer-okhttp:0.16.2' dependency 'com.lightstep.tracer:java-common:0.16.2' dependency 'com.lightstep.tracer:lightstep-tracer-jre:0.14.8' dependency 'com.spotify.tracing:squashing-census-exporter:0.1.0' dependencySet(group: 'com.google.api', version: '1.35.1') { entry 'gax' entry 'gax-grpc' } dependencySet(group: 'com.google.cloud', version: '1.56.0') { entry('google-cloud-pubsub') { exclude 'io.grpc:grpc-netty-shaded' } entry 'google-cloud-core' entry 'google-cloud-core-grpc' } dependency 'com.google.cloud.bigtable:bigtable-client-core:1.19.0' dependency 'com.addthis:stream-lib:3.0.0' dependency 'org.xerial.snappy:snappy-java:1.1.7.2' dependency 'javax.inject:javax.inject:1' dependency 'javax.ws.rs:javax.ws.rs-api:2.1' dependency 'javax.mail:mail:1.4.7' dependency 'args4j:args4j:2.33' dependency 'org.apache.commons:commons-lang3:3.3.2' dependency 'org.apache.commons:commons-math3:3.4.1' dependency 'com.google.guava:guava:28.0-jre' dependency 'io.thekraken:grok:0.1.1' dependency 'org.jfree:jfreechart:1.0.19' dependency 'joda-time:joda-time:2.8.2' dependency 'com.tdunning:t-digest:3.2' dependencySet(group: 'org.apache.logging.log4j', version: '2.13.3') { entry 'log4j-core' entry 'log4j-slf4j-impl' entry 'log4j-1.2-api' entry 'log4j-api' } dependencySet(group: 'org.slf4j', version: '1.7.21') { entry 'jul-to-slf4j' entry 'sl4j-simple' entry 'jcl-over-slf4j' entry 'slf4j-api' } dependencySet(group: 'io.sentry', version: '1.7.30') { entry 'sentry-log4j2' entry 'sentry' } dependencySet(group: 'org.eclipse.jetty', version: '9.4.22.v20191022') { entry 'jetty-webapp' entry 'jetty-server' entry 'jetty-rewrite' entry 'jetty-util' } dependency 'javax.xml.bind:jaxb-api:2.3.1' dependency 'org.eclipse.jetty.http2:http2-server:9.4.22.v20191022' dependency 'javax.servlet:javax.servlet-api:3.1.0' dependency 'org.glassfish.jaxb:jaxb-runtime:2.3.2' dependencySet(group: 'org.glassfish.jersey.containers', version: '2.27') { entry('jersey-container-servlet-core') { exclude 'org.glassfish.hk2.external:javax.inject' } entry('jersey-container-servlet') { exclude 'org.glassfish.hk2.external:javax.inject' } entry('jersey-container-jetty-http') { exclude 'org.glassfish.hk2.external:javax.inject' } } dependency('org.glassfish.jersey.core:jersey-server:2.27') { exclude 'org.glassfish.hk2.external:javax.inject' } dependency 'org.glassfish.jersey.inject:jersey-hk2:2.27' // can't use a dependencySet for jackson since the groups are all different def jackson_version = '2.9.9' dependency "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" dependency 'com.fasterxml.jackson.core:jackson-databind:2.9.9.3' dependency "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:$jackson_version" dependency "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jackson_version" dependency "com.fasterxml.jackson.module:jackson-module-kotlin:$jackson_version" dependency 'junit:junit:4.12' dependency 'org.hamcrest:java-hamcrest:2.0.0.0' dependency 'org.mockito:mockito-core:3.0.0' dependencySet (group: 'org.testcontainers', version: '1.12.5') { entry 'testcontainers' entry 'elasticsearch' entry 'cassandra' } dependencySet(group: 'com.google.code.findbugs', version: '3.0.1') { entry 'annotations' entry 'jsr305' } dependency 'javax.annotation:javax.annotation-api:1.3.2' } } } subprojects { dependencies { implementation 'javax.inject:javax.inject' implementation 'com.google.dagger:dagger' compileOnly 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' annotationProcessor "com.google.auto.value:auto-value" testAnnotationProcessor "com.google.auto.value:auto-value" // tiny-serializer-processor relies on the deprecated javax annotations implementation 'javax.annotation:javax.annotation-api' annotationProcessor 'javax.annotation:javax.annotation-api' annotationProcessor 'eu.toolchain.serializer:tiny-serializer-processor' annotationProcessor 'com.google.dagger:dagger-compiler' testImplementation 'org.jetbrains.kotlin:kotlin-test' testImplementation 'junit:junit' testImplementation 'org.mockito:mockito-core' } tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } test { testLogging.showStandardStreams = true testLogging { events "passed", "skipped", "failed", "standardOut", "standardError" outputs.upToDateWhen { false } exceptionFormat "full" } } task integrationTest(type: Test) { description = 'Runs integration tests.' group = 'verification' testClassesDirs = sourceSets.integrationTest.output.classesDirs classpath = sourceSets.integrationTest.runtimeClasspath shouldRunAfter test testLogging { events "passed", "skipped", "failed", "standardOut", "standardError" outputs.upToDateWhen { false } exceptionFormat "full" } jacoco { destinationFile = file("$buildDir/jacoco/integrationTest.exec") } } check.dependsOn integrationTest // disable verbosity running with ./gradlew --info [checkstyleMain, checkstyleTest].each { task -> task.logging.setLevel(LogLevel.LIFECYCLE) } checkstyle { toolVersion = '8.37' configFile = rootProject.file('checkstyle.xml') configProperties = [ 'basedir': rootProject.rootDir ] showViolations = true ignoreFailures = false maxWarnings = 0 } jacocoTestReport { executionData test, integrationTest sourceDirectories = files(sourceSets.main.allSource.srcDirs) afterEvaluate { classDirectories = files(sourceSets.main.output.files.collect { fileTree(dir: it, exclude: [ '**/Dagger*.class', '**/*_Factory.class', '**/*_Serializer.class' ]) }) } reports { html.enabled = false xml.enabled = true csv.enabled = false } dependsOn test, integrationTest } } task jacocoRootReport(type: JacocoReport) { description = 'Generates an aggregate report from all subprojects' dependsOn subprojects.test, subprojects.integrationTest additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs) sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs) classDirectories = files(subprojects.sourceSets.main.output) executionData = files(subprojects.jacocoTestReport.executionData) reports { xml.enabled = true xml.destination file("${buildDir}/reports/jacoco/report.xml") csv.enabled = false html.enabled = false } doFirst { executionData = files(executionData.findAll { it.exists() }) } }