1
+ import org.elasticsearch.gradle.Architecture
1
2
import org.elasticsearch.gradle.ElasticsearchDistribution.Flavor
2
3
import org.elasticsearch.gradle.LoggedExec
3
4
import org.elasticsearch.gradle.VersionProperties
@@ -13,38 +14,51 @@ testFixtures.useFixture()
13
14
14
15
configurations {
15
16
dockerPlugins
17
+ aarch64DockerSource
16
18
dockerSource
19
+ aarch64OssDockerSource
17
20
ossDockerSource
18
21
}
19
22
20
23
dependencies {
24
+ aarch64DockerSource project(path : " :distribution:archives:linux-aarch64-tar" )
21
25
dockerSource project(path : " :distribution:archives:linux-tar" )
26
+ aarch64OssDockerSource project(path : " :distribution:archives:oss-linux-aarch64-tar" )
22
27
ossDockerSource project(path : " :distribution:archives:oss-linux-tar" )
23
28
}
24
29
25
- ext. expansions = { oss , local ->
26
- final String classifier = ' linux-x86_64'
30
+ ext. expansions = { architecture , oss , local ->
31
+ switch (architecture) {
32
+ case " aarch64" :
33
+ case " x64" :
34
+ break ;
35
+ default :
36
+ throw new IllegalArgumentException (" unrecongized architecture [" + architecture + " ], must be one of (aarch64|x64)" )
37
+ }
38
+ final String classifier = " aarch64" . equals(architecture) ? " linux-aarch64" : " linux-x86_64"
27
39
final String elasticsearch = oss ? " elasticsearch-oss-${ VersionProperties.elasticsearch} -${ classifier} .tar.gz" : " elasticsearch-${ VersionProperties.elasticsearch} -${ classifier} .tar.gz"
28
40
return [
41
+ ' base_image' : " aarch64" . equals(architecture) ? " arm64v8/centos:7" : " centos:7" ,
29
42
' build_date' : BuildParams . buildDate,
30
43
' elasticsearch' : elasticsearch,
31
44
' git_revision' : BuildParams . gitRevision,
32
45
' license' : oss ? ' Apache-2.0' : ' Elastic-License' ,
33
46
' source_elasticsearch' : local ? " COPY $elasticsearch /opt/" : " RUN cd /opt && curl --retry 8 -s -L -O https://artifacts.elastic.co/downloads/elasticsearch/${ elasticsearch} && cd -" ,
47
+ ' tini_suffix' : " aarch64" . equals(architecture) ? " -arm64" : " " ,
34
48
' version' : VersionProperties . elasticsearch
35
49
]
36
50
}
37
51
38
- private static String buildPath (final boolean oss ) {
39
- return " build/${ oss ? 'oss-' : ''} docker"
52
+ private static String buildPath (final String architecture , final boolean oss ) {
53
+ return " build/${ "aarch64".equals(architecture) ? 'aarch64-' : '' }${ oss ? 'oss-' : ''} docker"
40
54
}
41
55
42
- private static String taskName (final String prefix , final boolean oss , final String suffix ) {
43
- return " ${ prefix}${ oss ? 'Oss' : ''}${ suffix} "
56
+ private static String taskName (final String prefix , final String architecture , final boolean oss , final String suffix ) {
57
+ return " ${ prefix}${ "aarch64".equals(architecture) ? 'Aarch64' : '' }${ oss ? 'Oss' : ''}${ suffix} "
44
58
}
45
59
46
60
project. ext {
47
- dockerBuildContext = { boolean oss , boolean local ->
61
+ dockerBuildContext = { String architecture , boolean oss , boolean local ->
48
62
copySpec {
49
63
into(' bin' ) {
50
64
from project. projectDir. toPath(). resolve(" src/docker/bin" )
@@ -62,25 +76,33 @@ project.ext {
62
76
}
63
77
64
78
from(project. projectDir. toPath(). resolve(" src/docker/Dockerfile" )) {
65
- expand(expansions(oss, local))
79
+ expand(expansions(architecture, oss, local))
66
80
}
67
81
}
68
82
}
69
83
}
70
84
71
- void addCopyDockerContextTask (final boolean oss ) {
72
- task(taskName(" copy" , oss, " DockerContext" ), type : Sync ) {
73
- expansions(oss, true ). findAll { it. key != ' build_date' }. each { k , v ->
85
+ void addCopyDockerContextTask (final String architecture , final boolean oss ) {
86
+ task(taskName(" copy" , architecture, oss, " DockerContext" ), type : Sync ) {
87
+ expansions(architecture, oss, true ). findAll { it. key != ' build_date' }. each { k , v ->
74
88
inputs. property(k, { v. toString() })
75
89
}
76
- into buildPath(oss)
90
+ into buildPath(architecture, oss)
77
91
78
- with dockerBuildContext(oss, true )
92
+ with dockerBuildContext(architecture, oss, true )
79
93
80
- if (oss) {
81
- from configurations. ossDockerSource
94
+ if (" aarch64" . equals(architecture)) {
95
+ if (oss) {
96
+ from configurations. aarch64OssDockerSource
97
+ } else {
98
+ from configurations. aarch64DockerSource
99
+ }
82
100
} else {
83
- from configurations. dockerSource
101
+ if (oss) {
102
+ from configurations. ossDockerSource
103
+ } else {
104
+ from configurations. dockerSource
105
+ }
84
106
}
85
107
86
108
from configurations. dockerPlugins
@@ -149,9 +171,9 @@ task integTest(type: Test) {
149
171
150
172
check. dependsOn integTest
151
173
152
- void addBuildDockerImage (final boolean oss ) {
153
- final Task buildDockerImageTask = task(taskName(" build" , oss, " DockerImage" ), type : DockerBuildTask ) {
154
- TaskProvider<Sync > copyContextTask = tasks. named(taskName(" copy" , oss, " DockerContext" ))
174
+ void addBuildDockerImage (final String architecture , final boolean oss ) {
175
+ final Task buildDockerImageTask = task(taskName(" build" , architecture, oss, " DockerImage" ), type : DockerBuildTask ) {
176
+ TaskProvider<Sync > copyContextTask = tasks. named(taskName(" copy" , architecture, oss, " DockerContext" ))
155
177
dependsOn(copyContextTask)
156
178
dockerContext. fileProvider(copyContextTask. map { it. destinationDir })
157
179
@@ -170,11 +192,14 @@ void addBuildDockerImage(final boolean oss) {
170
192
}
171
193
}
172
194
assemble. dependsOn(buildDockerImageTask)
195
+ buildDockerImageTask. enabled = Architecture . current(). name(). toLowerCase(). equals(architecture)
173
196
}
174
197
175
- for (final boolean oss : [false , true ]) {
176
- addCopyDockerContextTask(oss)
177
- addBuildDockerImage(oss)
198
+ for (final String architecture : [" aarch64" , " x64" ]) {
199
+ for (final boolean oss : [false , true ]) {
200
+ addCopyDockerContextTask(architecture, oss)
201
+ addBuildDockerImage(architecture, oss)
202
+ }
178
203
}
179
204
180
205
// We build the images used in compose locally, but the pull command insists on using a repository
@@ -192,11 +217,12 @@ subprojects { Project subProject ->
192
217
if (subProject. name. contains(' docker-export' )) {
193
218
apply plugin : ' distribution'
194
219
220
+ final String architecture = subProject. name. contains(' aarch64-' ) ? ' aarch64' : ' x64'
195
221
final boolean oss = subProject. name. contains(' oss-' )
196
222
197
- def exportTaskName = taskName(" export" , oss, " DockerImage" )
198
- def buildTaskName = taskName(" build" , oss, " DockerImage" )
199
- def tarFile = " ${ parent.projectDir} /build/elasticsearch${ oss ? '-oss' : ''} _test.${ VersionProperties.elasticsearch} .docker.tar"
223
+ def exportTaskName = taskName(" export" , architecture, oss, " DockerImage" )
224
+ def buildTaskName = taskName(" build" , architecture, oss, " DockerImage" )
225
+ def tarFile = " ${ parent.projectDir} /build/elasticsearch${ "aarch64".equals(architecture) ? '-aarch64' : '' }${ oss ? '-oss' : ''} _test.${ VersionProperties.elasticsearch} .docker.tar"
200
226
201
227
final Task exportDockerImageTask = task(exportTaskName, type : LoggedExec ) {
202
228
inputs. file(" ${ parent.projectDir} /build/markers/${ buildTaskName} .marker" )
@@ -212,7 +238,7 @@ subprojects { Project subProject ->
212
238
213
239
artifacts. add(' default' , file(tarFile)) {
214
240
type ' tar'
215
- name " elasticsearch${ oss ? '-oss' : ''} "
241
+ name " elasticsearch${ "aarch64".equals(architecture) ? '-aarch64' : '' }${ oss ? '-oss' : ''} "
216
242
builtBy exportTaskName
217
243
}
218
244
0 commit comments