普通文本  |  498行  |  20.73 KB

buildscript {
    repositories {
        mavenCentral()
        mavenLocal()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'ru.vyarus:gradle-animalsniffer-plugin:1.4.6'
        classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.16'
        classpath "net.ltgt.gradle:gradle-apt-plugin:0.18"
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.20.0'
        classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.7.1"
        classpath "me.champeau.gradle:jmh-gradle-plugin:0.4.7"
        classpath "gradle.plugin.io.morethan.jmhreport:gradle-jmh-report:0.7.0"
    }
}

// Display the version report using: ./gradlew dependencyUpdates
// Also see https://github.com/ben-manes/gradle-versions-plugin.
apply plugin: 'com.github.ben-manes.versions'

// Don't use the Checker Framework by default, since it interferes with Error Prone.
def useCheckerFramework = rootProject.hasProperty('checkerFramework')
def useErrorProne = !useCheckerFramework

subprojects {
    apply plugin: "checkstyle"
    apply plugin: 'maven'
    apply plugin: 'idea'
    apply plugin: 'eclipse'
    apply plugin: 'java'
    apply plugin: "signing"
    apply plugin: "jacoco"
    // The plugin only has an effect if a signature is specified
    apply plugin: 'ru.vyarus.animalsniffer'
    apply plugin: 'findbugs'
    apply plugin: 'net.ltgt.apt'
    apply plugin: "me.champeau.gradle.jmh"
    apply plugin: "io.morethan.jmhreport"
    // Plugins that require java8
    if (JavaVersion.current().isJava8Compatible()) {
        if (useErrorProne) {
            apply plugin: "net.ltgt.errorprone"
        }
        apply plugin: 'com.github.sherter.google-java-format'
    }

    group = "io.opencensus"
    version = "0.17.0-SNAPSHOT" // CURRENT_OPENCENSUS_VERSION

    sourceCompatibility = 1.6
    targetCompatibility = 1.6

    repositories {
        mavenCentral()
        mavenLocal()
    }

    if (useCheckerFramework) {
        configurations {
            checkerFrameworkJavac {
                description = 'a customization of the Open JDK javac compiler with additional support for type annotations'
            }
            checkerFrameworkAnnotatedJDK {
                description = 'a copy of JDK classes with Checker Framework type qualifiers inserted'
            }
        }
    }

    [compileJava, compileTestJava, compileJmhJava].each() {
        // We suppress the "try" warning because it disallows managing an auto-closeable with
        // try-with-resources without referencing the auto-closeable within the try block.
        // We suppress the "processing" warning as suggested in
        // https://groups.google.com/forum/#!topic/bazel-discuss/_R3A9TJSoPM
        it.options.compilerArgs += ["-Xlint:all", "-Xlint:-try", "-Xlint:-processing"]
        if (useErrorProne) {
            if (JavaVersion.current().isJava8Compatible()) {
                it.options.compilerArgs += ["-XepAllDisabledChecksAsWarnings", "-XepDisableWarningsInGeneratedCode"]

                // MutableMethodReturnType can suggest returning Guava types from
                // API methods (https://github.com/google/error-prone/issues/982).
                it.options.compilerArgs += ["-Xep:MutableMethodReturnType:OFF"]

                // ReturnMissingNullable conflicts with Checker Framework null analysis.
                it.options.compilerArgs += ["-Xep:ReturnMissingNullable:OFF"]

                // OpenCensus doesn't currently use Var annotations.
                it.options.compilerArgs += ["-Xep:Var:OFF"]
            }
        }
        if (useCheckerFramework) {
            it.options.compilerArgs += [
                '-processor',
		'com.google.auto.value.processor.AutoValueProcessor,org.checkerframework.checker.nullness.NullnessChecker',
		"-Astubs=$rootDir/checker-framework/stubs"
            ]
        }
        it.options.encoding = "UTF-8"
        // Protobuf-generated code produces some warnings.
        // https://github.com/google/protobuf/issues/2718
        it.options.compilerArgs += ["-Xlint:-cast"]
        if (!JavaVersion.current().isJava9()) {
            // TODO(sebright): Enable -Werror for Java 9 once we upgrade AutoValue (issue #1017).
            it.options.compilerArgs += ["-Werror"]
        }
        if (JavaVersion.current().isJava7()) {
            // Suppress all deprecation warnings with Java 7, since there are some bugs in its handling of
            // @SuppressWarnings. See
            // https://stackoverflow.com/questions/26921774/how-to-avoid-deprecation-warnings-when-suppresswarningsdeprecation-doesnt
            it.options.compilerArgs += ["-Xlint:-deprecation"]

            // TODO(bdrutu): Enable for Java 7 when fix the issue with configuring bootstrap class.
            // [options] bootstrap class path not set in conjunction with -source 1.6
            it.options.compilerArgs += ["-Xlint:-options"]
        }
        if (JavaVersion.current().isJava9()) {
            // TODO(sebright): Currently, building with Java 9 produces the following "options" warnings:
            //
            // :opencensus-api:compileJavawarning: [options] bootstrap class path not set in conjunction with -source 1.6
            // warning: [options] source value 1.6 is obsolete and will be removed in a future release
            // warning: [options] target value 1.6 is obsolete and will be removed in a future release
            it.options.compilerArgs += ["-Xlint:-options"]
        }
    }

    compileTestJava {
        // serialVersionUID is basically guaranteed to be useless in tests
        options.compilerArgs += ["-Xlint:-serial"]
        // It undeprecates DoubleSubject.isEqualTo(Double).
        options.compilerArgs += ["-Xlint:-deprecation"]
    }

    jar.manifest {
        attributes('Implementation-Title': name,
                'Implementation-Version': version,
                'Built-By': System.getProperty('user.name'),
                'Built-JDK': System.getProperty('java.version'),
                'Source-Compatibility': sourceCompatibility,
                'Target-Compatibility': targetCompatibility)
    }

    javadoc.options {
        encoding = 'UTF-8'
        links 'https://docs.oracle.com/javase/8/docs/api/'
    }

    ext {
        appengineVersion = '1.9.64'
        aspectjVersion = '1.8.11'
        autoValueVersion = '1.4'
        findBugsAnnotationsVersion = '3.0.1'
        findBugsJsr305Version = '3.0.2'
        errorProneVersion = '2.3.1'
        grpcVersion = '1.14.0'
        guavaVersion = '20.0'
        googleAuthVersion = '0.11.0'
        googleCloudBetaVersion = '0.64.0-beta'
        googleCloudGaVersion = '1.46.0'
        log4j2Version = '2.11.1'
        signalfxVersion = '0.0.39'
        springBootVersion = '1.5.15.RELEASE'
        springCloudVersion = '1.3.4.RELEASE'
        springVersion = '4.3.12.RELEASE'
        prometheusVersion = '0.4.0'
        protobufVersion = '3.5.1'
        zipkinReporterVersion = '2.3.2'
        jaegerReporterVersion = '0.27.0'
        opencensusProtoVersion = '0.0.2'
        dropwizardVersion = '3.1.2'

        libraries = [
                appengine_api: "com.google.appengine:appengine-api-1.0-sdk:${appengineVersion}",
                aspectj: "org.aspectj:aspectjrt:${aspectjVersion}",
                auto_value: "com.google.auto.value:auto-value:${autoValueVersion}",
                auto_service: 'com.google.auto.service:auto-service:1.0-rc3',
                byte_buddy: 'net.bytebuddy:byte-buddy:1.7.11',
                config: 'com.typesafe:config:1.2.1',
                disruptor: 'com.lmax:disruptor:3.4.1',
                errorprone: "com.google.errorprone:error_prone_annotations:${errorProneVersion}",
                findbugs_annotations: "com.google.code.findbugs:annotations:${findBugsAnnotationsVersion}",
                google_auth: "com.google.auth:google-auth-library-credentials:${googleAuthVersion}",
                google_cloud_logging: "com.google.cloud:google-cloud-logging:${googleCloudGaVersion}",
                google_cloud_trace: "com.google.cloud:google-cloud-trace:${googleCloudBetaVersion}",
                log4j2: "org.apache.logging.log4j:log4j-core:${log4j2Version}",
                zipkin_reporter: "io.zipkin.reporter2:zipkin-reporter:${zipkinReporterVersion}",
                zipkin_urlconnection: "io.zipkin.reporter2:zipkin-sender-urlconnection:${zipkinReporterVersion}",
                jaeger_reporter: "com.uber.jaeger:jaeger-core:${jaegerReporterVersion}",
                google_cloud_monitoring: "com.google.cloud:google-cloud-monitoring:${googleCloudGaVersion}",
                grpc_context: "io.grpc:grpc-context:${grpcVersion}",
                grpc_core: "io.grpc:grpc-core:${grpcVersion}",
                grpc_netty: "io.grpc:grpc-netty:${grpcVersion}",
                grpc_stub: "io.grpc:grpc-stub:${grpcVersion}",
                guava: "com.google.guava:guava:${guavaVersion}",
                jsr305: "com.google.code.findbugs:jsr305:${findBugsJsr305Version}",
                signalfx_java: "com.signalfx.public:signalfx-java:${signalfxVersion}",
                spring_aspects: "org.springframework:spring-aspects:${springVersion}",
                spring_boot_starter_web: "org.springframework.boot:spring-boot-starter-web:${springBootVersion}",
                spring_cloud_build: "org.springframework.cloud:spring-cloud-build:${springCloudVersion}",
                spring_cloud_starter_sleuth: "org.springframework.cloud:spring-cloud-starter-sleuth:${springCloudVersion}",
                spring_context: "org.springframework:spring-context:${springVersion}",
                spring_context_support: "org.springframework:spring-context-support:${springVersion}",
                prometheus_simpleclient: "io.prometheus:simpleclient:${prometheusVersion}",
                protobuf: "com.google.protobuf:protobuf-java:${protobufVersion}",
                opencensus_proto: "io.opencensus:opencensus-proto:${opencensusProtoVersion}",

                // Test dependencies.
                guava_testlib: "com.google.guava:guava-testlib:${guavaVersion}",
                junit: 'junit:junit:4.12',
                mockito: 'org.mockito:mockito-core:1.9.5',
                spring_test: "org.springframework:spring-test:${springVersion}",
                truth: 'com.google.truth:truth:0.30',
                dropwizard: "io.dropwizard.metrics:metrics-core:${dropwizardVersion}",
        ]
    }

    configurations {
        compile {
            // Detect Maven Enforcer's dependencyConvergence failures. We only
            // care for artifacts used as libraries by others.
            if (!(project.name in ['benchmarks', 'opencensus-all',
                                   'opencensus-exporter-stats-stackdriver',
                                   'opencensus-exporter-trace-stackdriver',
                                   'opencensus-exporter-trace-jaeger'])) {
                resolutionStrategy.failOnVersionConflict()
            }
        }
    }

    dependencies {
        if (useCheckerFramework) {
            ext.checkerFrameworkVersion = '2.5.5'

            // 2.4.0 is the last version of the Checker Framework compiler that supports annotations
            // in comments, though it should continue to work with newer versions of the Checker Framework.
            // See
            // https://github.com/census-instrumentation/opencensus-java/pull/1112#issuecomment-381366366.
            ext.checkerFrameworkCompilerVersion = '2.4.0'

            ext.jdkVersion = 'jdk8'
            checkerFrameworkAnnotatedJDK "org.checkerframework:${jdkVersion}:${checkerFrameworkVersion}"
            checkerFrameworkJavac "org.checkerframework:compiler:${checkerFrameworkCompilerVersion}"
            compileOnly "org.checkerframework:checker:${checkerFrameworkVersion}"
            compile "org.checkerframework:checker-qual:${checkerFrameworkVersion}"
            compileOnly libraries.auto_value
        }

        compileOnly libraries.errorprone,
                    libraries.jsr305

        testCompile libraries.guava_testlib,
                libraries.junit,
                libraries.mockito,
                libraries.truth

    if (useErrorProne && JavaVersion.current().isJava8Compatible()) {
            // The ErrorProne plugin defaults to the latest, which would break our
            // build if error prone releases a new version with a new check
            errorprone "com.google.errorprone:error_prone_core:${errorProneVersion}"
        }
    }

    findbugs {
        toolVersion = findBugsAnnotationsVersion
        ignoreFailures = false   // bug free or it doesn't ship!
        effort = 'max'
        reportLevel = 'low'      // low = sensitive to even minor mistakes
        omitVisitors = []        // bugs that we want to ignore
        excludeFilter = file("$rootDir/findbugs-exclude.xml")
    }
    // Generate html report for findbugs.
    findbugsMain {
        reports {
            xml.enabled = false
            html.enabled = true
        }
    }
    findbugsTest {
        reports {
            xml.enabled = false
            html.enabled = true
        }
    }
    findbugsJmh {
        reports {
            xml.enabled = false
            html.enabled = true
        }
    }

    checkstyle {
        configFile = file("$rootDir/buildscripts/checkstyle.xml")
        toolVersion = "8.12"
        ignoreFailures = false
        if (rootProject.hasProperty("checkstyle.ignoreFailures")) {
            ignoreFailures = rootProject.properties["checkstyle.ignoreFailures"].toBoolean()
        }
        configProperties["rootDir"] = rootDir
    }

    // Disable checkstyle if no java8.
    checkstyleMain.enabled = JavaVersion.current().isJava8Compatible()
    checkstyleTest.enabled = JavaVersion.current().isJava8Compatible()
    checkstyleJmh.enabled = JavaVersion.current().isJava8Compatible()

    // Google formatter works only on java8.
    if (JavaVersion.current().isJava8Compatible()) {
        googleJavaFormat {
            toolVersion '1.6'
        }

        afterEvaluate {  // Allow subproject to add more source sets.
            tasks.googleJavaFormat {
                source = sourceSets*.allJava
                include '**/*.java'
            }

            tasks.verifyGoogleJavaFormat {
                source = sourceSets*.allJava
                include '**/*.java'
            }
        }
    }

    signing {
        required false
        sign configurations.archives
    }

    task javadocJar(type: Jar) {
        classifier = 'javadoc'
        from javadoc
    }

    task sourcesJar(type: Jar) {
        classifier = 'sources'
        from sourceSets.main.allSource
    }

    artifacts {
        archives javadocJar, sourcesJar
    }

    jmh {
        jmhVersion = '1.20'
        warmupIterations = 10
        iterations = 10
        fork = 1
        failOnError = true
        resultFormat = 'JSON'
        // Allow to run single benchmark class like:
        // ./gradlew -PjmhIncludeSingleClass=StatsTraceContextBenchmark clean :grpc-core:jmh
        if (project.hasProperty('jmhIncludeSingleClass')) {
            include = [
                    project.property('jmhIncludeSingleClass')
            ]
        }
    }

    jmhReport {
        jmhResultPath = project.file("${project.buildDir}/reports/jmh/results.json")
        jmhReportOutput = project.file("${project.buildDir}/reports/jmh")
    }

    tasks.jmh.finalizedBy tasks.jmhReport

    uploadArchives {
        repositories {
            mavenDeployer {
                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

                def configureAuth = {
                    if (rootProject.hasProperty('ossrhUsername') && rootProject.hasProperty('ossrhPassword')) {
                        authentication(userName:rootProject.ossrhUsername, password: rootProject.ossrhPassword)
                    }
                }

                repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/", configureAuth)

                snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/", configureAuth)

                pom.project {
                    name "OpenCensus"
                    packaging 'jar'
                    description project.description
                    url 'https://github.com/census-instrumentation/opencensus-java'

                    scm {
                        connection 'scm:svn:https://github.com/census-instrumentation/opencensus-java'
                        developerConnection 'scm:git:git@github.com/census-instrumentation/opencensus-java'
                        url 'https://github.com/census-instrumentation/opencensus-java'
                    }

                    licenses {
                        license {
                            name 'The Apache License, Version 2.0'
                            url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }

                    developers {
                        developer {
                            id 'io.opencensus'
                            name 'OpenCensus Contributors'
                            email 'census-developers@googlegroups.com'
                            url 'opencensus.io'
                            // https://issues.gradle.org/browse/GRADLE-2719
                            organization = 'OpenCensus Authors'
                            organizationUrl 'https://www.opencensus.io'
                        }
                    }
                }
            }
        }
    }

    // Upload the following artifacts only:
    uploadArchives.onlyIf {
        name in ['opencensus-api',
                 'opencensus-contrib-agent',
                 'opencensus-contrib-appengine-standard-util',
                 'opencensus-contrib-dropwizard',
                 'opencensus-contrib-exemplar-util',
                 'opencensus-contrib-grpc-metrics',
                 'opencensus-contrib-grpc-util',
                 'opencensus-contrib-http-util',
                 'opencensus-contrib-log-correlation-log4j2',
                 'opencensus-contrib-log-correlation-stackdriver',
                 'opencensus-contrib-monitored-resource-util',
                 'opencensus-contrib-spring',
                 'opencensus-contrib-spring-sleuth-v1x',
                 'opencensus-contrib-zpages',
                 'opencensus-exporter-stats-prometheus',
                 'opencensus-exporter-stats-signalfx',
                 'opencensus-exporter-stats-stackdriver',
                 'opencensus-exporter-trace-instana',
                 'opencensus-exporter-trace-logging',
                 'opencensus-exporter-trace-ocagent',
                 'opencensus-exporter-trace-stackdriver',
                 'opencensus-exporter-trace-zipkin',
                 'opencensus-exporter-trace-jaeger',
                 'opencensus-impl-core',
                 'opencensus-impl-lite',
                 'opencensus-impl',
                 'opencensus-testing']
    }

    // At a test failure, log the stack trace to the console so that we don't
    // have to open the HTML in a browser.
    test {
        testLogging {
            exceptionFormat = 'full'
            showExceptions true
            showCauses true
            showStackTraces true
        }
        maxHeapSize = '1500m'
    }

    if (useCheckerFramework) {
        allprojects {
            tasks.withType(JavaCompile).all { JavaCompile compile ->
                compile.doFirst {
                    compile.options.compilerArgs += [
                        '-Xmaxerrs', '10000',
                        "-Xbootclasspath/p:${configurations.checkerFrameworkAnnotatedJDK.asPath}",
                        "-AskipDefs=\\.AutoValue_|^io.opencensus.contrib.appengine.standard.util.TraceIdProto\$|^io.opencensus.contrib.appengine.standard.util.TraceProto\$",
                        "-AinvariantArrays"
                    ]
                    options.fork = true
                    options.forkOptions.jvmArgs += ["-Xbootclasspath/p:${configurations.checkerFrameworkJavac.asPath}"]
                }
            }
        }
    }

    // For projects that depend on gRPC during test execution, make sure to
    // also configure ALPN if running on a platform (e.g. FreeBSD) that is not
    // supported by io.netty:netty-tcnative-boringssl-static:jar. Also see:
    // https://github.com/grpc/grpc-java/blob/master/SECURITY.md#tls-with-jdk-jetty-alpnnpn
    if (project.name in ['opencensus-exporter-stats-stackdriver',
                         'opencensus-exporter-trace-stackdriver']) {
        def os = org.gradle.internal.os.OperatingSystem.current()
        if (!os.isLinux() && !os.isWindows() && !os.isMacOsX()) {
            configurations {
                alpn
            }
            dependencies {
                alpn 'org.mortbay.jetty.alpn:jetty-alpn-agent:2.0.7'
            }
            test {
                jvmArgs "-javaagent:${configurations.alpn.asPath}"
            }
        }
    }
}