@@ -8,6 +8,27 @@ CLEAN.include("tmp")
8
8
9
9
RakeCompilerDock ::GemHelper . install_tasks
10
10
11
+ def build_mri_images ( platforms , host_platforms , output : )
12
+ plats = host_platforms . map ( &:first ) . join ( "," )
13
+ platforms . each do |platform , _ |
14
+ sdf = "tmp/docker/Dockerfile.mri.#{ platform } .#{ host_platforms . first [ 1 ] } "
15
+ image_name = RakeCompilerDock ::Starter . container_image_name ( platform : platform )
16
+
17
+ RakeCompilerDock . docker_build ( sdf , tag : image_name , platform : plats , output : output )
18
+
19
+ if image_name . include? ( "linux-gnu" )
20
+ RakeCompilerDock . docker_build ( sdf , tag : image_name . sub ( "linux-gnu" , "linux" ) , platform : plats , output : output )
21
+ end
22
+ end
23
+ end
24
+
25
+ def build_jruby_images ( host_platforms , output : )
26
+ image_name = RakeCompilerDock ::Starter . container_image_name ( rubyvm : "jruby" )
27
+ plats = host_platforms . map ( &:first ) . join ( "," )
28
+ sdf = "tmp/docker/Dockerfile.jruby.#{ host_platforms . first [ 1 ] } "
29
+ RakeCompilerDock . docker_build ( sdf , tag : image_name , platform : plats , output : output )
30
+ end
31
+
11
32
platforms = [
12
33
# tuple is [platform, target]
13
34
[ "aarch64-linux-gnu" , "aarch64-linux-gnu" ] ,
@@ -25,47 +46,84 @@ platforms = [
25
46
[ "x86_64-linux-musl" , "x86_64-unknown-linux-musl" ] ,
26
47
]
27
48
49
+ host_platforms = [
50
+ # tuple is [docker platform, rake task, RUBY_PLATFORM matcher]
51
+ [ "linux/amd64" , "x86" , /^x86_64|^x64|^amd64/ ] ,
52
+ [ "linux/arm64" , "arm" , /^aarch64|arm64/ ] ,
53
+ ]
54
+ local_platform = host_platforms . find { |_ , _ , reg | reg =~ RUBY_PLATFORM } or
55
+ raise ( "RUBY_PLATFORM #{ RUBY_PLATFORM } is not supported as host" )
56
+
28
57
namespace :build do
29
58
30
- platforms . each do |platform , target |
31
- sdf = "Dockerfile.mri.#{ platform } "
59
+ mkdir_p "tmp/docker"
60
+
61
+ host_platforms . each do |docker_platform , rake_platform |
62
+ namespace rake_platform do
32
63
33
- desc "Build image for platform #{ platform } "
34
- task platform => sdf
35
- task sdf do
36
- image_name = RakeCompilerDock ::Starter . container_image_name ( platform : platform )
37
- sh ( *RakeCompilerDock . docker_build_cmd ( platform ) , "-t" , image_name , "-f" , "Dockerfile.mri.#{ platform } " , "." )
38
- if image_name . include? ( "linux-gnu" )
39
- sh ( "docker" , "tag" , image_name , image_name . sub ( "linux-gnu" , "linux" ) )
64
+ platforms . each do |platform , target |
65
+ sdf = "tmp/docker/Dockerfile.mri.#{ platform } .#{ rake_platform } "
66
+ df = ERB . new ( File . read ( "Dockerfile.mri.erb" ) , trim_mode : ">" ) . result ( binding )
67
+ File . write ( sdf , df )
68
+ CLEAN . include ( sdf )
69
+ end
70
+ sdf = "tmp/docker/Dockerfile.jruby.#{ rake_platform } "
71
+ df = File . read ( "Dockerfile.jruby" )
72
+ File . write ( sdf , df )
73
+
74
+ builder = RakeCompilerDock ::ParallelDockerBuild . new ( platforms . map { |pl , _ | "tmp/docker/Dockerfile.mri.#{ pl } .#{ rake_platform } " } + [ "tmp/docker/Dockerfile.jruby.#{ rake_platform } " ] , workdir : "tmp/docker" , task_prefix : "common-#{ rake_platform } -" , platform : docker_platform )
75
+
76
+ platforms . each do |platform , target |
77
+ sdf = "tmp/docker/Dockerfile.mri.#{ platform } .#{ rake_platform } "
78
+
79
+ if docker_platform == local_platform [ 0 ]
80
+ # Load image after build on local platform only
81
+ desc "Build and load image for platform #{ platform } on #{ docker_platform } "
82
+ task platform => sdf do
83
+ build_mri_images ( [ platform ] , [ local_platform ] , output : 'load' )
84
+ end
85
+ else
86
+ desc "Build image for platform #{ platform } on #{ docker_platform } "
87
+ task platform => sdf
88
+ end
89
+ multitask :all => platform
40
90
end
41
- end
42
91
43
- df = ERB . new ( File . read ( "Dockerfile.mri.erb" ) , trim_mode : ">" ) . result ( binding )
44
- File . write ( sdf , df )
45
- CLEAN . include ( sdf )
92
+ sdf = "tmp/docker/Dockerfile.jruby.#{ rake_platform } "
93
+ if docker_platform == local_platform [ 0 ]
94
+ # Load image after build on local platform only
95
+ desc "Build and load image for JRuby on #{ docker_platform } "
96
+ task :jruby => sdf do
97
+ build_jruby_images ( [ local_platform ] , output : 'load' )
98
+ end
99
+ else
100
+ desc "Build image for JRuby on #{ docker_platform } "
101
+ task :jruby => sdf
102
+ end
103
+ multitask :all => :jruby
104
+ end
105
+ desc "Build all images on #{ docker_platform } in parallel"
106
+ task rake_platform => "#{ rake_platform } :all"
46
107
end
47
108
48
- desc "Build image for JRuby"
49
- task :jruby => "Dockerfile.jruby"
50
- task "Dockerfile.jruby" do
51
- image_name = RakeCompilerDock ::Starter . container_image_name ( rubyvm : "jruby" )
52
- sh ( *RakeCompilerDock . docker_build_cmd ( "jruby" ) , "-t" , image_name , "-f" , "Dockerfile.jruby" , "." )
109
+ all_mri_images = host_platforms . flat_map do |_ , rake_platform |
110
+ platforms . map do |platform , |
111
+ "#{ rake_platform } :#{ platform } "
112
+ end
53
113
end
54
-
55
- RakeCompilerDock ::ParallelDockerBuild . new ( platforms . map { |pl , _ | "Dockerfile.mri.#{ pl } " } + [ "Dockerfile.jruby" ] , workdir : "tmp/docker" )
56
-
57
- desc "Build images for all MRI platforms in parallel"
114
+ desc "Build images for all MRI platforms and hosts in parallel"
58
115
if ENV [ 'RCD_USE_BUILDX_CACHE' ]
59
- task :mri => platforms . map ( & :first )
116
+ task :mri => all_mri_images
60
117
else
61
- multitask :mri => platforms . map ( & :first )
118
+ multitask :mri => all_mri_images
62
119
end
63
120
64
- desc "Build images for all platforms in parallel"
121
+ all_images = all_mri_images + host_platforms . map { |_ , pl | "#{ pl } :jruby" }
122
+ desc "Build images for all platforms and hosts in parallel"
65
123
if ENV [ 'RCD_USE_BUILDX_CACHE' ]
66
- task :all => platforms . map ( & :first ) + [ "jruby" ]
124
+ task :all => all_images
67
125
else
68
- multitask :all => platforms . map ( & :first ) + [ "jruby" ]
126
+ multitask :all => all_images
69
127
end
70
128
end
71
129
@@ -115,18 +173,9 @@ task :update_lists do
115
173
end
116
174
117
175
namespace :release do
118
- desc "push all docker images"
119
- task :images do
120
- image_name = RakeCompilerDock ::Starter . container_image_name ( rubyvm : "jruby" )
121
- sh ( "docker" , "push" , image_name )
122
-
123
- platforms . each do |platform , _ |
124
- image_name = RakeCompilerDock ::Starter . container_image_name ( platform : platform )
125
- sh ( "docker" , "push" , image_name )
126
-
127
- if image_name . include? ( "linux-gnu" )
128
- sh ( "docker" , "push" , image_name . sub ( "linux-gnu" , "linux" ) )
129
- end
130
- end
176
+ desc "Push all docker images on #{ host_platforms . map ( &:first ) . join ( "," ) } "
177
+ task :images => "build:all" do
178
+ build_jruby_images ( host_platforms , output : 'push' )
179
+ build_mri_images ( platforms , host_platforms , output : 'push' )
131
180
end
132
181
end
0 commit comments