import org.elasticsearch.gradle.BuildPlugin import org.elasticsearch.gradle.LoggedExec import org.elasticsearch.gradle.MavenFilteringHack import org.elasticsearch.gradle.VersionProperties apply plugin: 'base' apply plugin: 'elasticsearch.test.fixtures' configurations { dockerPlugins dockerSource ossDockerSource } dependencies { dockerSource project(path: ":distribution:archives:linux-tar") ossDockerSource project(path: ":distribution:archives:oss-linux-tar") } ext.expansions = { oss -> final String classifier = 'linux-x86_64' final String elasticsearch = oss ? "elasticsearch-oss-${VersionProperties.elasticsearch}-${classifier}.tar.gz" : "elasticsearch-${VersionProperties.elasticsearch}-${classifier}.tar.gz" return [ 'elasticsearch' : elasticsearch, 'license' : oss ? 'Apache-2.0' : 'Elastic License', 'source_elasticsearch': local() ? "COPY $elasticsearch /opt/" : "RUN cd /opt && curl --retry 8 -s -L -O https://artifacts.elastic.co/downloads/elasticsearch/${elasticsearch} && cd -", 'version' : VersionProperties.elasticsearch ] } /* * We need to be able to render a Dockerfile that references the official artifacts on https://artifacts.elastic.co. For this, we use a * substitution in the Dockerfile template where we can either replace source_elasticsearch with a COPY from the Docker build context, or * a RUN curl command to retrieve the artifact from https://artifacts.elastic.co. The system property build.docker.source, which can be * either "local" (default) or "remote" controls which version of the Dockerfile is produced. */ private static boolean local() { final String buildDockerSource = System.getProperty("build.docker.source") if (buildDockerSource == null || "local".equals(buildDockerSource)) { return true } else if ("remote".equals(buildDockerSource)) { return false } else { throw new IllegalArgumentException("expected build.docker.source to be [local] or [remote] but was [" + buildDockerSource + "]") } } private static String files(final boolean oss) { return "build/${ oss ? 'oss-' : ''}docker" } private static String taskName(final String prefix, final boolean oss, final String suffix) { return "${prefix}${oss ? 'Oss' : ''}${suffix}" } void addCopyDockerContextTask(final boolean oss) { task(taskName("copy", oss, "DockerContext"), type: Sync) { into files(oss) into('bin') { from 'src/docker/bin' } into('config') { from 'src/docker/config' } if (local()) { if (oss) { from configurations.ossDockerSource } else { from configurations.dockerSource } from configurations.dockerPlugins } } } void addCopyDockerfileTask(final boolean oss) { task(taskName("copy", oss, "Dockerfile"), type: Copy) { dependsOn taskName("copy", oss, "DockerContext") inputs.properties(expansions(oss)) // ensure task is run when ext.expansions is changed into files(oss) from('src/docker/Dockerfile') { MavenFilteringHack.filter(it, expansions(oss)) } } } preProcessFixture { dependsOn assemble } postProcessFixture.doLast { println "docker default distro is on port: ${ext."test.fixtures.elasticsearch-default.tcp.9200"}, " + "oss is on: ${ext."test.fixtures.elasticsearch-oss.tcp.9200"}" } // TODO: Add some actual tests, this will just check that the TPC port in the container is up check.dependsOn postProcessFixture void addBuildDockerImage(final boolean oss) { final Task buildDockerImageTask = task(taskName("build", oss, "DockerImage"), type: LoggedExec) { dependsOn taskName("copy", oss, "DockerContext") dependsOn taskName("copy", oss, "Dockerfile") List tags if (oss) { tags = [ "docker.elastic.co/elasticsearch/elasticsearch-oss:${VersionProperties.elasticsearch}", "elasticsearch-oss:test" ] } else { tags = [ "elasticsearch:${VersionProperties.elasticsearch}", "docker.elastic.co/elasticsearch/elasticsearch:${VersionProperties.elasticsearch}", "docker.elastic.co/elasticsearch/elasticsearch-full:${VersionProperties.elasticsearch}", "elasticsearch:test", ] } executable 'docker' final List dockerArgs = ['build', files(oss), '--pull', '--no-cache'] for (final String tag : tags) { dockerArgs.add('--tag') dockerArgs.add(tag) } args dockerArgs.toArray() } BuildPlugin.requireDocker(buildDockerImageTask) } for (final boolean oss : [false, true]) { addCopyDockerContextTask(oss) addCopyDockerfileTask(oss) addBuildDockerImage(oss) } assemble.dependsOn "buildOssDockerImage" assemble.dependsOn "buildDockerImage" // We build the images used in compose locally, but the pull command insists on using a repository // thus we must disable it to prevent it from doing so. // Everything will still be pulled since we will build the local images on a pull if (tasks.findByName("composePull")) { tasks.composePull.enabled = false }