Skip to content

Commit

Permalink
Add tasks to build Docker build context artifacts (#41819)
Browse files Browse the repository at this point in the history
This commit adds some tasks to generate dedicated Docker build context
artifacts.
  • Loading branch information
jasontedor committed May 7, 2019
1 parent ece62c6 commit 3c7a75c
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 44 deletions.
68 changes: 24 additions & 44 deletions distribution/docker/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,17 @@ dependencies {
ossDockerSource project(path: ":distribution:archives:oss-linux-tar")
}

ext.expansions = { oss ->
ext.expansions = { oss, local ->
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 -",
'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"
}
Expand All @@ -53,39 +36,38 @@ private static String taskName(final String prefix, final boolean oss, final Str
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'
}
project.ext {
dockerBuildContext = { boolean oss, boolean local ->
copySpec {
into('bin') {
from project.projectDir.toPath().resolve("src/docker/bin")
}

if (local()) {
if (oss) {
from configurations.ossDockerSource
} else {
from configurations.dockerSource
into('config') {
from project.projectDir.toPath().resolve("src/docker/config")
}

from configurations.dockerPlugins
from(project.projectDir.toPath().resolve("src/docker/Dockerfile")) {
MavenFilteringHack.filter(it, expansions(oss, local))
}
}
}
}

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
void addCopyDockerContextTask(final boolean oss) {
task(taskName("copy", oss, "DockerContext"), type: Sync) {
inputs.properties(expansions(oss, true))
into files(oss)

from('src/docker/Dockerfile') {
MavenFilteringHack.filter(it, expansions(oss))
with dockerBuildContext(oss, true)

if (oss) {
from configurations.ossDockerSource
} else {
from configurations.dockerSource
}

from configurations.dockerPlugins
}
}

Expand All @@ -107,7 +89,6 @@ 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<String> tags
if (oss) {
tags = [ "docker.elastic.co/elasticsearch/elasticsearch-oss:${VersionProperties.elasticsearch}" ]
Expand All @@ -131,7 +112,6 @@ void addBuildDockerImage(final boolean oss) {

for (final boolean oss : [false, true]) {
addCopyDockerContextTask(oss)
addCopyDockerfileTask(oss)
addBuildDockerImage(oss)
}

Expand Down
11 changes: 11 additions & 0 deletions distribution/docker/docker-build-context/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apply plugin: 'base'

task buildDockerBuildContext(type: Tar) {
extension = 'tar.gz'
compression = Compression.GZIP
archiveClassifier = "docker-build-context"
archiveBaseName = "elasticsearch"
with dockerBuildContext(false, false)
}

assemble.dependsOn buildDockerBuildContext
11 changes: 11 additions & 0 deletions distribution/docker/oss-docker-build-context/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apply plugin: 'base'

task buildOssDockerBuildContext(type: Tar) {
extension = 'tar.gz'
compression = Compression.GZIP
archiveClassifier = "docker-build-context"
archiveBaseName = "elasticsearch-oss"
with dockerBuildContext(true, false)
}

assemble.dependsOn buildOssDockerBuildContext
2 changes: 2 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ List projects = [
'distribution:archives:oss-no-jdk-linux-tar',
'distribution:archives:no-jdk-linux-tar',
'distribution:docker',
'distribution:docker:oss-docker-build-context',
'distribution:docker:docker-build-context',
'distribution:packages:oss-deb',
'distribution:packages:deb',
'distribution:packages:oss-no-jdk-deb',
Expand Down

0 comments on commit 3c7a75c

Please sign in to comment.