/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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. */ import java.nio.file.Files import org.gradle.util.GradleVersion plugins { id 'java-gradle-plugin' id 'groovy' } group = 'org.elasticsearch.gradle' String minimumGradleVersion = file('src/main/resources/minimumGradleVersion').text.trim() if (GradleVersion.current() < GradleVersion.version(minimumGradleVersion)) { throw new GradleException("Gradle ${minimumGradleVersion}+ is required to build elasticsearch") } if (project == rootProject) { // change the build dir used during build init, so that doing a clean // won't wipe out the buildscript jar buildDir = 'build-bootstrap' } /***************************************************************************** * Propagating version.properties to the rest of the build * *****************************************************************************/ // we update the version property to reflect if we are building a snapshot or a release build // we write this back out below to load it in the Build.java which will be shown in rest main action // to indicate this being a snapshot build or a release build. File propsFile = project.file('version.properties') Properties props = VersionPropertiesLoader.loadBuildSrcVersion(propsFile) version = props.getProperty("elasticsearch") processResources { inputs.file(propsFile) // We need to be explicit with the version because we add snapshot and qualifier to it based on properties inputs.property("dynamic_elasticsearch_version", props.getProperty("elasticsearch")) doLast { Writer writer = file("$destinationDir/version.properties").newWriter() try { props.store(writer, "Generated version properties") } finally { writer.close() } } } /***************************************************************************** * Java version * *****************************************************************************/ if (JavaVersion.current() < JavaVersion.VERSION_11) { throw new GradleException('At least Java 11 is required to build elasticsearch gradle tools') } // Gradle 4.10 does not support setting this to 11 yet targetCompatibility = "10" sourceCompatibility = "10" // We have a few classes that need to be compiled for older java versions because these are used to run checks against // those sourceSets { minimumRuntime { // We only want Java here, but the Groovy doesn't configure javadoc correctly if we don't define this as groovy groovy { srcDirs = ['src/main/minimumRuntime'] } } } compileMinimumRuntimeGroovy { // We can't use BuildPlugin here, so read from file String minimumRuntimeVersion = file('src/main/resources/minimumRuntimeVersion').text.trim() targetCompatibility = minimumRuntimeVersion sourceCompatibility = minimumRuntimeVersion } dependencies { if (project.ext.has("isEclipse") == false || project.ext.isEclipse == false) { // eclipse is confused if this is set explicitly compile sourceSets.minimumRuntime.output } minimumRuntimeCompile "junit:junit:${props.getProperty('junit')}" minimumRuntimeCompile localGroovy() } jar { from sourceSets.minimumRuntime.output } /***************************************************************************** * Dependencies used by the entire build * *****************************************************************************/ repositories { jcenter() } dependencies { compile localGroovy() compile "com.carrotsearch.randomizedtesting:junit4-ant:${props.getProperty('randomizedrunner')}" compile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${props.getProperty('randomizedrunner')}" compile 'com.netflix.nebula:gradle-extra-configurations-plugin:3.0.3' compile 'com.netflix.nebula:nebula-publishing-plugin:4.4.4' compile 'com.netflix.nebula:gradle-info-plugin:3.0.3' compile 'org.eclipse.jgit:org.eclipse.jgit:3.2.0.201312181205-r' compile 'com.perforce:p4java:2012.3.551082' // THIS IS SUPPOSED TO BE OPTIONAL IN THE FUTURE.... compile 'org.apache.rat:apache-rat:0.11' compile "org.elasticsearch:jna:4.5.1" compile 'com.github.jengelman.gradle.plugins:shadow:2.0.4' compile 'de.thetaphi:forbiddenapis:2.6' compile 'com.avast.gradle:docker-compose-gradle-plugin:0.4.5' testCompile "junit:junit:${props.getProperty('junit')}" } // Gradle 2.14+ removed ProgressLogger(-Factory) classes from the public APIs // Use logging dependency instead // Gradle 4.3.1 stopped releasing the logging jars to jcenter, just use the last available one GradleVersion logVersion = GradleVersion.current() > GradleVersion.version('4.3') ? GradleVersion.version('4.3') : GradleVersion.current() dependencies { compileOnly "org.gradle:gradle-logging:${logVersion.getVersion()}" } /***************************************************************************** * Bootstrap repositories * *****************************************************************************/ // this will only happen when buildSrc is built on its own during build init if (project == rootProject) { repositories { if (System.getProperty("repos.mavenLocal") != null) { mavenLocal() } } // only run tests as build-tools test.enabled = false } /***************************************************************************** * Normal project checks * *****************************************************************************/ // this happens when included as a normal project in the build, which we do // to enforce precommit checks like forbidden apis, as well as setup publishing if (project != rootProject) { apply plugin: 'elasticsearch.build' apply plugin: 'nebula.maven-base-publish' apply plugin: 'nebula.maven-scm' // we need to apply these again to override the build plugin targetCompatibility = "10" sourceCompatibility = "10" // groovydoc succeeds, but has some weird internal exception... groovydoc.enabled = false // build-tools is not ready for primetime with these... dependencyLicenses.enabled = false dependenciesInfo.enabled = false forbiddenApisMain.enabled = false forbiddenApisTest.enabled = false forbiddenApisMinimumRuntime.enabled = false jarHell.enabled = false thirdPartyAudit.enabled = false test { include "**/*Tests.class" exclude "**/*IT.class" // The test task is configured to runtimeJava version, but we build-tools doesn't support all of them, so test // with compiler instead on the ones that are too old. if (project.runtimeJavaVersion <= JavaVersion.VERSION_1_10) { jvm = "${project.compilerJavaHome}/bin/java" } } // This can't be an RandomizedTestingTask because we can't yet reference it task integTest(type: Test) { // integration test requires the local testing repo for example plugin builds dependsOn project.rootProject.allprojects.collect { it.tasks.matching { it.name == 'publishNebulaPublicationToLocalTestRepository'} } exclude "**/*Tests.class" testClassesDirs = sourceSets.test.output.classesDirs classpath = sourceSets.test.runtimeClasspath inputs.dir(file("src/testKit")) // tell BuildExamplePluginsIT where to find the example plugins systemProperty ( 'test.build-tools.plugin.examples', files( project(':example-plugins').subprojects.collect { it.projectDir } ).asPath, ) systemProperty 'test.local-test-repo-path', "${rootProject.buildDir}/local-test-repo" systemProperty 'test.version_under_test', version systemProperty 'test.lucene-snapshot-revision', (versions.lucene =~ /\w+-snapshot-([a-z0-9]+)/)[0][1] } check.dependsOn(integTest) // TODO: re-enable once randomizedtesting gradle code is published and removed from here licenseHeaders.enabled = false forbiddenPatterns { exclude '**/*.wav' // the file that actually defines nocommit exclude '**/ForbiddenPatternsTask.groovy' } namingConventions { testClass = 'org.elasticsearch.gradle.test.GradleUnitTestCase' integTestClass = 'org.elasticsearch.gradle.test.GradleIntegrationTestCase' } /* * We alread configure publication and we don't need or want this one that * comes from the java-gradle-plugin. */ afterEvaluate { generatePomFileForPluginMavenPublication.enabled = false } } // Define this here because we need it early. class VersionPropertiesLoader { static Properties loadBuildSrcVersion(File input) throws IOException { Properties props = new Properties(); InputStream is = new FileInputStream(input) try { props.load(is) } finally { is.close() } loadBuildSrcVersion(props, System.getProperties()) return props } protected static void loadBuildSrcVersion(Properties loadedProps, Properties systemProperties) { String elasticsearch = loadedProps.getProperty("elasticsearch") if (elasticsearch == null) { throw new IllegalStateException("Elasticsearch version is missing from properties.") } if (elasticsearch.matches("[0-9]+\\.[0-9]+\\.[0-9]+") == false) { throw new IllegalStateException( "Expected elasticsearch version to be numbers only of the form X.Y.Z but it was: " + elasticsearch ) } String qualifier = systemProperties.getProperty("build.version_qualifier", ""); if (qualifier.isEmpty() == false) { if (qualifier.matches("(alpha|beta|rc)\\d+") == false) { throw new IllegalStateException("Invalid qualifier: " + qualifier) } elasticsearch += "-" + qualifier } if ("true".equals(systemProperties.getProperty("build.snapshot", "true"))) { elasticsearch += "-SNAPSHOT" } loadedProps.put("elasticsearch", elasticsearch) } }