import org.apache.tools.ant.taskdefs.condition.Os import org.elasticsearch.gradle.Version import java.util.regex.Matcher import org.elasticsearch.gradle.LoggedExec import org.elasticsearch.gradle.test.NodeInfo /** * Subdirectories of this project are dummy projects which does a local * checkout of the appropriate version's branch, and builds a snapshot. This * allows backcompat tests to test against the next unreleased versions * without relying on snapshots. */ subprojects { final Matcher match = project.name =~ /bwc-snapshot-(\d+\.(\d+|x))/ if (!match.matches()) { throw new InvalidUserDataException("Unsupport project name ${project.name}") } String bwcBranch = match.group(1) if (project.hasProperty('bwcVersion')) { Version bwcVersion = project.ext.bwcVersion apply plugin: 'distribution' // Not published so no need to assemble tasks.remove(assemble) build.dependsOn.remove('assemble') File esCheckoutDir = file("${buildDir}/bwc/checkout-es-${bwcBranch}") /* Delay building the path as the path will not exist during configuration which will * fail on Windows due to getting the short name requiring the path to already exist. */ Object esCheckoutPath = """${-> if (Os.isFamily(Os.FAMILY_WINDOWS)) { esCheckoutDir.mkdirs() NodeInfo.getShortPathName(esCheckoutDir.toString()) } else { esCheckoutDir.toString() } }""" File xpackCheckoutDir = file("${esCheckoutDir}-extra/x-pack-elasticsearch") Object xpackCheckoutPath = """${-> if (Os.isFamily(Os.FAMILY_WINDOWS)) { xpackCheckoutDir.mkdirs() NodeInfo.getShortPathName(xpackCheckoutDir.toString()) } else { xpackCheckoutDir.toString() } }""" final String remote = System.getProperty("tests.bwc.remote", "elastic") task createElasticsearchClone(type: LoggedExec) { onlyIf { esCheckoutDir.exists() == false } commandLine = ['git', 'clone', rootDir, esCheckoutPath] } task createXPackClone(type: LoggedExec) { onlyIf { xpackCheckoutDir.exists() == false } commandLine = ['git', 'clone', project(':x-pack-elasticsearch').projectDir, xpackCheckoutPath] } // we use regular Exec here to ensure we always get output, regardless of logging level task findElasticsearchRemote(type: Exec) { dependsOn createElasticsearchClone workingDir = esCheckoutDir commandLine = ['git', 'remote', '-v'] ignoreExitValue = true ByteArrayOutputStream output = new ByteArrayOutputStream() standardOutput = output doLast { if (execResult.exitValue != 0) { output.toString('UTF-8').eachLine { line -> logger.error(line) } execResult.assertNormalExitValue() } project.ext.esRemoteExists = false output.toString('UTF-8').eachLine { if (it.contains("${remote}\tgit@github.com:${remote}/elasticsearch.git")) { project.ext.esRemoteExists = true } } } } task findXPackRemote(type: Exec) { dependsOn createXPackClone workingDir = xpackCheckoutDir commandLine = ['git', 'remote', '-v'] ignoreExitValue = true ByteArrayOutputStream output = new ByteArrayOutputStream() standardOutput = output doLast { if (execResult.exitValue != 0) { output.toString('UTF-8').eachLine { line -> logger.error(line) } execResult.assertNormalExitValue() } project.ext.xpackRemoteExists = false output.toString('UTF-8').eachLine { if (it.contains("${remote}\tgit@github.com:${remote}/x-pack-elasticsearch.git")) { project.ext.xpackRemoteExists = true } } } } task addElasticsearchRemote(type: LoggedExec) { dependsOn findElasticsearchRemote onlyIf { project.ext.esRemoteExists == false } workingDir = esCheckoutDir commandLine = ['git', 'remote', 'add', "${remote}", "git@github.com:${remote}/elasticsearch.git"] } task addXPackRemote(type: LoggedExec) { dependsOn findXPackRemote onlyIf { project.ext.xpackRemoteExists == false } workingDir = xpackCheckoutDir commandLine = ['git', 'remote', 'add', "${remote}", "git@github.com:${remote}/x-pack-elasticsearch.git"] } task fetchElasticsearchLatest(type: LoggedExec) { dependsOn addElasticsearchRemote workingDir = esCheckoutDir commandLine = ['git', 'fetch', '--all'] } task fetchXPackLatest(type: LoggedExec) { dependsOn addXPackRemote workingDir = xpackCheckoutDir commandLine = ['git', 'fetch', '--all'] } String esBuildMetadataKey = "bwc_refspec_${project.path.substring(1)}_elasticsearch" task checkoutElasticsearchBwcBranch(type: LoggedExec) { dependsOn fetchElasticsearchLatest def String refspec = System.getProperty("tests.bwc.refspec", buildMetadata.get(esBuildMetadataKey, "${remote}/${bwcBranch}")) workingDir = esCheckoutDir commandLine = ['git', 'checkout', refspec] } String xpackBuildMetadataKey = "bwc_refspec_${project.path.substring(1)}_xpack" task checkoutXPackBwcBranch(type: LoggedExec) { dependsOn fetchXPackLatest def String refspec = System.getProperty("tests.bwc.refspec", buildMetadata.get(xpackBuildMetadataKey, "${remote}/${bwcBranch}")) workingDir = xpackCheckoutDir commandLine = ['git', 'checkout', refspec] } File esBuildMetadataFile = project.file("build/${project.name}_elasticsearch/build_metadata") task writeElasticsearchBuildMetadata(type: LoggedExec) { dependsOn checkoutElasticsearchBwcBranch workingDir = esCheckoutDir commandLine = ['git', 'rev-parse', 'HEAD'] ignoreExitValue = true ByteArrayOutputStream output = new ByteArrayOutputStream() standardOutput = output doLast { if (execResult.exitValue != 0) { output.toString('UTF-8').eachLine { line -> logger.error(line) } execResult.assertNormalExitValue() } project.mkdir(esBuildMetadataFile.parent) esBuildMetadataFile.setText("${esBuildMetadataKey}=${output.toString('UTF-8')}", 'UTF-8') } } File xpackBuildMetadataFile = project.file("build/${project.name}_xpack/build_metadata") task writeXPackBuildMetadata(type: LoggedExec) { dependsOn checkoutXPackBwcBranch workingDir = xpackCheckoutDir commandLine = ['git', 'rev-parse', 'HEAD'] ignoreExitValue = true ByteArrayOutputStream output = new ByteArrayOutputStream() standardOutput = output doLast { if (execResult.exitValue != 0) { output.toString('UTF-8').eachLine { line -> logger.error(line) } execResult.assertNormalExitValue() } project.mkdir(xpackBuildMetadataFile.parent) xpackBuildMetadataFile.setText("${xpackBuildMetadataKey}=${output.toString('UTF-8')}", 'UTF-8') } } File bwcZip = file("${xpackCheckoutDir}/plugin/build/distributions/x-pack-${bwcVersion}.zip") task buildBwcVersion(type: Exec) { dependsOn checkoutXPackBwcBranch, checkoutElasticsearchBwcBranch, writeElasticsearchBuildMetadata, writeXPackBuildMetadata workingDir = xpackCheckoutDir if (Os.isFamily(Os.FAMILY_WINDOWS)) { executable 'cmd' args '/C', 'call', new File(xpackCheckoutDir, 'gradlew').toString() } else { executable = new File(xpackCheckoutDir, 'gradlew').toString() } final ArrayList commandLineArgs = [":x-pack-elasticsearch:plugin:assemble", "-Dbuild.snapshot=${System.getProperty('build.snapshot') ?: 'true'}"] final LogLevel logLevel = gradle.startParameter.logLevel if ([LogLevel.QUIET, LogLevel.WARN, LogLevel.INFO, LogLevel.DEBUG].contains(logLevel)) { commandLineArgs << "--${logLevel.name().toLowerCase(Locale.ENGLISH)}" } final String showStacktraceName = gradle.startParameter.showStacktrace.name() assert ["INTERNAL_EXCEPTIONS", "ALWAYS", "ALWAYS_FULL"].contains(showStacktraceName) if (showStacktraceName.equals("ALWAYS")) { commandLineArgs << "--stacktrace" } else if (showStacktraceName.equals("ALWAYS_FULL")) { commandLineArgs << "--full-stacktrace" } args commandLineArgs } artifacts { 'default' file: bwcZip, name: 'x-pack', type: 'zip', builtBy: buildBwcVersion } } }