kuby-core 0.11.16 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/Gemfile +1 -2
- data/README.md +2 -1
- data/kuby-core.gemspec +1 -1
- data/lib/kuby/commands.rb +25 -73
- data/lib/kuby/docker/alpine.rb +2 -1
- data/lib/kuby/docker/app_image.rb +34 -0
- data/lib/kuby/docker/bundler_phase.rb +10 -0
- data/lib/kuby/docker/cli.rb +7 -13
- data/lib/kuby/docker/docker_uri.rb +50 -9
- data/lib/kuby/docker/errors.rb +1 -19
- data/lib/kuby/docker/image.rb +142 -0
- data/lib/kuby/docker/layer.rb +0 -7
- data/lib/kuby/docker/local_tags.rb +9 -10
- data/lib/kuby/docker/package_phase.rb +0 -5
- data/lib/kuby/docker/packages.rb +1 -0
- data/lib/kuby/docker/remote_tags.rb +10 -5
- data/lib/kuby/docker/setup_phase.rb +17 -9
- data/lib/kuby/docker/spec.rb +38 -62
- data/lib/kuby/docker/timestamp_tag.rb +8 -1
- data/lib/kuby/docker/timestamped_image.rb +114 -0
- data/lib/kuby/docker.rb +27 -25
- data/lib/kuby/environment.rb +1 -10
- data/lib/kuby/kubernetes/bare_metal_provider.rb +16 -4
- data/lib/kuby/kubernetes/deployer.rb +1 -1
- data/lib/kuby/kubernetes/docker_desktop_provider.rb +0 -15
- data/lib/kuby/kubernetes/spec.rb +21 -17
- data/lib/kuby/plugin.rb +2 -2
- data/lib/kuby/plugins/rails_app/assets.rb +62 -70
- data/lib/kuby/plugins/rails_app/assets_image.rb +57 -0
- data/lib/kuby/plugins/rails_app/generators/kuby.rb +31 -9
- data/lib/kuby/plugins/rails_app/plugin.rb +53 -236
- data/lib/kuby/plugins/rails_app.rb +1 -0
- data/lib/kuby/tasks.rb +98 -69
- data/lib/kuby/version.rb +1 -1
- data/lib/kuby.rb +2 -20
- data/spec/docker/spec_spec.rb +21 -118
- data/spec/docker/timestamped_image_spec.rb +123 -0
- data/spec/spec_helper.rb +10 -11
- metadata +10 -14
- data/lib/kuby/dev_setup.rb +0 -346
- data/lib/kuby/docker/dev_spec.rb +0 -202
- data/lib/kuby/docker/metadata.rb +0 -90
- data/lib/kuby/docker/tags.rb +0 -92
- data/lib/kuby/rails_commands.rb +0 -84
- data/spec/docker/metadata_spec.rb +0 -73
- data/spec/dummy/Gemfile.lock +0 -223
- data/spec/dummy/config/master.key +0 -1
- data/spec/dummy/tmp/cache/bootsnap-load-path-cache +0 -0
@@ -8,37 +8,36 @@ module Kuby
|
|
8
8
|
sig { returns CLI }
|
9
9
|
attr_reader :cli
|
10
10
|
|
11
|
-
sig { returns(
|
12
|
-
attr_reader :
|
11
|
+
sig { returns(String) }
|
12
|
+
attr_reader :image_url
|
13
13
|
|
14
14
|
sig {
|
15
15
|
params(
|
16
16
|
cli: CLI,
|
17
|
-
|
17
|
+
image_url: String
|
18
18
|
)
|
19
19
|
.void
|
20
20
|
}
|
21
|
-
def initialize(cli,
|
21
|
+
def initialize(cli, image_url)
|
22
22
|
@cli = cli
|
23
|
-
@
|
24
|
-
|
23
|
+
@image_url = image_url
|
25
24
|
@latest_timestamp_tag = T.let(@latest_timestamp_tag, T.nilable(TimestampTag))
|
26
25
|
end
|
27
26
|
|
28
27
|
sig { returns(T::Array[String]) }
|
29
28
|
def tags
|
30
|
-
images = cli.images(
|
29
|
+
images = cli.images(image_url)
|
31
30
|
images.map { |image| T.must(image[:tag]) }
|
32
31
|
end
|
33
32
|
|
34
33
|
sig { returns(T::Array[String]) }
|
35
34
|
def latest_tags
|
36
35
|
# find "latest" tag
|
37
|
-
images = cli.images(
|
38
|
-
latest = images.find { |image| image[:tag] ==
|
36
|
+
images = cli.images(image_url)
|
37
|
+
latest = images.find { |image| image[:tag] == Kuby::Docker::LATEST_TAG }
|
39
38
|
|
40
39
|
unless latest
|
41
|
-
raise MissingTagError
|
40
|
+
raise MissingTagError, "could not find tag #{Kuby::Docker::LATEST_TAG}"
|
42
41
|
end
|
43
42
|
|
44
43
|
# find all tags that point to the same image as 'latest'
|
data/lib/kuby/docker/packages.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# typed: strict
|
2
2
|
|
3
|
+
require 'docker/remote'
|
4
|
+
|
3
5
|
module Kuby
|
4
6
|
module Docker
|
5
7
|
class RemoteTags
|
@@ -8,24 +10,27 @@ module Kuby
|
|
8
10
|
sig { returns(::Docker::Remote::Client) }
|
9
11
|
attr_reader :remote_client
|
10
12
|
|
11
|
-
sig { returns(
|
12
|
-
attr_reader :
|
13
|
+
sig { returns(String) }
|
14
|
+
attr_reader :image_url
|
13
15
|
|
14
16
|
sig {
|
15
17
|
params(
|
16
18
|
remote_client: ::Docker::Remote::Client,
|
17
|
-
|
19
|
+
image_url: String
|
18
20
|
)
|
19
21
|
.void
|
20
22
|
}
|
21
|
-
def initialize(remote_client,
|
23
|
+
def initialize(remote_client, image_url)
|
22
24
|
@remote_client = remote_client
|
23
|
-
@
|
25
|
+
@image_url = image_url
|
24
26
|
end
|
25
27
|
|
26
28
|
sig { returns(T::Array[String]) }
|
27
29
|
def tags
|
28
30
|
remote_client.tags
|
31
|
+
rescue ::Docker::Remote::UnknownRepoError
|
32
|
+
# this can happen if we've never pushed to the repo before
|
33
|
+
[]
|
29
34
|
end
|
30
35
|
|
31
36
|
sig { returns(T::Array[String]) }
|
@@ -7,9 +7,6 @@ module Kuby
|
|
7
7
|
|
8
8
|
DEFAULT_WORKING_DIR = T.let('/usr/src/app'.freeze, String)
|
9
9
|
|
10
|
-
sig { returns(T.nilable(String)) }
|
11
|
-
attr_reader :base_image
|
12
|
-
|
13
10
|
sig { params(base_image: String).void }
|
14
11
|
attr_writer :base_image
|
15
12
|
|
@@ -25,35 +22,46 @@ module Kuby
|
|
25
22
|
sig { params(rails_env: String).void }
|
26
23
|
attr_writer :rails_env
|
27
24
|
|
28
|
-
sig {
|
29
|
-
|
30
|
-
|
25
|
+
sig { returns(T.nilable(Docker::Spec)) }
|
26
|
+
attr_reader :docker_spec
|
27
|
+
|
28
|
+
sig { params(environment: Environment, docker_spec: Docker::Spec).void }
|
29
|
+
def initialize(environment, docker_spec)
|
30
|
+
super(environment)
|
31
31
|
|
32
32
|
@base_image = T.let(@base_image, T.nilable(String))
|
33
33
|
@working_dir = T.let(@working_dir, T.nilable(String))
|
34
34
|
@rails_env = T.let(@rails_env, T.nilable(String))
|
35
|
+
@docker_spec = T.let(docker_spec, T.nilable(Docker::Spec))
|
35
36
|
end
|
36
37
|
|
37
38
|
sig { override.params(dockerfile: Dockerfile).void }
|
38
39
|
def apply_to(dockerfile)
|
39
|
-
dockerfile.from(base_image
|
40
|
+
dockerfile.from(base_image)
|
40
41
|
dockerfile.workdir(working_dir || DEFAULT_WORKING_DIR)
|
41
42
|
dockerfile.env("RAILS_ENV=#{rails_env || Kuby.env}")
|
42
43
|
dockerfile.env("KUBY_ENV=#{Kuby.env}")
|
43
44
|
dockerfile.arg('RAILS_MASTER_KEY')
|
44
45
|
end
|
45
46
|
|
47
|
+
sig { returns(String) }
|
48
|
+
def base_image
|
49
|
+
@base_image || default_base_image
|
50
|
+
end
|
51
|
+
|
46
52
|
private
|
47
53
|
|
48
54
|
sig { returns(String) }
|
49
55
|
def default_base_image
|
50
|
-
|
56
|
+
spec = T.must(docker_spec)
|
57
|
+
|
58
|
+
case spec.distro_name
|
51
59
|
when :debian
|
52
60
|
"ruby:#{RUBY_VERSION}"
|
53
61
|
when :alpine
|
54
62
|
"ruby:#{RUBY_VERSION}-alpine"
|
55
63
|
else
|
56
|
-
raise MissingDistroError, "distro '#{
|
64
|
+
raise MissingDistroError, "distro '#{spec.distro_name}' hasn't been registered"
|
57
65
|
end
|
58
66
|
end
|
59
67
|
end
|
data/lib/kuby/docker/spec.rb
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
# typed: strict
|
2
2
|
|
3
|
-
require 'docker/remote'
|
4
|
-
|
5
3
|
module Kuby
|
6
4
|
module Docker
|
7
5
|
class Spec
|
8
6
|
extend T::Sig
|
9
7
|
|
8
|
+
DEFAULT_DISTRO = :debian
|
9
|
+
|
10
10
|
sig { returns(Environment) }
|
11
11
|
attr_reader :environment
|
12
12
|
|
13
|
+
sig { returns(T.nilable(String)) }
|
14
|
+
attr_reader :image_url_str
|
15
|
+
|
16
|
+
sig { returns(T.nilable(String)) }
|
17
|
+
attr_reader :registry_index_url_str
|
18
|
+
|
13
19
|
sig { params(environment: Environment).void }
|
14
20
|
def initialize(environment)
|
15
21
|
@environment = environment
|
@@ -22,13 +28,19 @@ module Kuby
|
|
22
28
|
@copy_phase = T.let(@copy_phase, T.nilable(CopyPhase))
|
23
29
|
@assets_phase = T.let(@assets_phase, T.nilable(AssetsPhase))
|
24
30
|
@webserver_phase = T.let(@webserver_phase, T.nilable(WebserverPhase))
|
25
|
-
@metadata = T.let(@metadata, T.nilable(Metadata))
|
26
31
|
|
32
|
+
@distro_name = T.let(@distro_name, T.nilable(Symbol))
|
27
33
|
@distro_spec = T.let(@distro_spec, T.nilable(Distro))
|
28
|
-
@cli = T.let(@cli, T.nilable(CLI))
|
29
|
-
@remote_client = T.let(@remote_client, T.nilable(::Docker::Remote::Client))
|
30
|
-
@tags = T.let(@tags, T.nilable(Tags))
|
31
34
|
@layer_stack = T.let(@layer_stack, T.nilable(Kuby::Docker::LayerStack))
|
35
|
+
|
36
|
+
@image_url_str = T.let(@image_url_str, T.nilable(String))
|
37
|
+
@registry_index_url_str = T.let(@registry_index_url_str, T.nilable(String))
|
38
|
+
@image = T.let(@image, T.nilable(Docker::AppImage))
|
39
|
+
end
|
40
|
+
|
41
|
+
sig { returns(Symbol) }
|
42
|
+
def distro_name
|
43
|
+
@distro_name || DEFAULT_DISTRO
|
32
44
|
end
|
33
45
|
|
34
46
|
sig { params(image_url: String).void }
|
@@ -69,7 +81,7 @@ module Kuby
|
|
69
81
|
|
70
82
|
sig { params(distro_name: Symbol).void }
|
71
83
|
def distro(distro_name)
|
72
|
-
|
84
|
+
@distro_name = distro_name
|
73
85
|
@distro_spec = nil
|
74
86
|
end
|
75
87
|
|
@@ -85,7 +97,12 @@ module Kuby
|
|
85
97
|
|
86
98
|
sig { params(url: String).void }
|
87
99
|
def image_url(url)
|
88
|
-
|
100
|
+
@image_url_str = url
|
101
|
+
end
|
102
|
+
|
103
|
+
sig { params(url: String).void }
|
104
|
+
def registry_index_url(url)
|
105
|
+
@registry_index_url_str = url
|
89
106
|
end
|
90
107
|
|
91
108
|
sig {
|
@@ -132,16 +149,22 @@ module Kuby
|
|
132
149
|
@credentials
|
133
150
|
end
|
134
151
|
|
135
|
-
sig { returns(
|
136
|
-
def
|
137
|
-
|
138
|
-
|
152
|
+
sig { returns(Docker::AppImage) }
|
153
|
+
def image
|
154
|
+
@image ||= begin
|
155
|
+
dockerfile = Dockerfile.new.tap do |df|
|
156
|
+
layer_stack.each { |layer| layer.apply_to(df) }
|
157
|
+
end
|
158
|
+
|
159
|
+
Docker::AppImage.new(
|
160
|
+
dockerfile, T.must(image_url_str), credentials, registry_index_url_str
|
161
|
+
)
|
139
162
|
end
|
140
163
|
end
|
141
164
|
|
142
165
|
sig { returns(SetupPhase) }
|
143
166
|
def setup_phase
|
144
|
-
@setup_phase ||= SetupPhase.new(environment)
|
167
|
+
@setup_phase ||= SetupPhase.new(environment, self)
|
145
168
|
end
|
146
169
|
|
147
170
|
sig { returns(PackagePhase) }
|
@@ -174,62 +197,15 @@ module Kuby
|
|
174
197
|
@webserver_phase ||= WebserverPhase.new(environment)
|
175
198
|
end
|
176
199
|
|
177
|
-
sig { returns(Metadata) }
|
178
|
-
def metadata
|
179
|
-
@metadata ||= Metadata.new(environment)
|
180
|
-
end
|
181
|
-
|
182
|
-
sig { returns(String) }
|
183
|
-
def tag
|
184
|
-
t = ENV.fetch('KUBY_DOCKER_TAG') do
|
185
|
-
tags.latest_timestamp_tag
|
186
|
-
end
|
187
|
-
|
188
|
-
unless t
|
189
|
-
raise MissingTagError, 'could not find latest timestamped tag'
|
190
|
-
end
|
191
|
-
|
192
|
-
t.to_s
|
193
|
-
end
|
194
|
-
|
195
|
-
sig { params(current_tag: String).returns(String) }
|
196
|
-
def previous_tag(current_tag)
|
197
|
-
t = tags.previous_timestamp_tag(current_tag)
|
198
|
-
|
199
|
-
unless t
|
200
|
-
raise MissingTagError, 'could not find previous timestamped tag'
|
201
|
-
end
|
202
|
-
|
203
|
-
t.to_s
|
204
|
-
end
|
205
|
-
|
206
|
-
sig { returns(CLI) }
|
207
|
-
def cli
|
208
|
-
@cli ||= Docker::CLI.new
|
209
|
-
end
|
210
|
-
|
211
|
-
sig { returns(::Docker::Remote::Client) }
|
212
|
-
def remote_client
|
213
|
-
@remote_client ||= ::Docker::Remote::Client.new(
|
214
|
-
metadata.image_host, metadata.image_repo,
|
215
|
-
credentials.username, credentials.password,
|
216
|
-
)
|
217
|
-
end
|
218
|
-
|
219
200
|
sig { returns(Distro) }
|
220
201
|
def distro_spec
|
221
|
-
@distro_spec ||= if distro_klass = Kuby.distros[
|
202
|
+
@distro_spec ||= if distro_klass = Kuby.distros[distro_name]
|
222
203
|
distro_klass.new(self)
|
223
204
|
else
|
224
|
-
raise MissingDistroError, "distro '#{
|
205
|
+
raise MissingDistroError, "distro '#{distro_name}' hasn't been registered"
|
225
206
|
end
|
226
207
|
end
|
227
208
|
|
228
|
-
sig { returns(Tags) }
|
229
|
-
def tags
|
230
|
-
@tags ||= Tags.new(cli, remote_client, metadata)
|
231
|
-
end
|
232
|
-
|
233
209
|
private
|
234
210
|
|
235
211
|
sig { returns(Kuby::Docker::LayerStack) }
|
@@ -9,8 +9,15 @@ module Kuby
|
|
9
9
|
|
10
10
|
FORMAT = T.let('%Y%m%d%H%M%S'.freeze, String)
|
11
11
|
|
12
|
-
sig { params(str: String).returns(T.nilable(TimestampTag)) }
|
12
|
+
sig { params(str: T.nilable(String)).returns(T.nilable(TimestampTag)) }
|
13
13
|
def self.try_parse(str)
|
14
|
+
return nil unless str
|
15
|
+
|
16
|
+
# The strptime function stops scanning after the pattern has been matched, so
|
17
|
+
# we check for all numbers here to prevent things like 20210424165405-assets
|
18
|
+
# from being treated as a timestamp tag.
|
19
|
+
return nil unless str =~ /\A\d+\z/
|
20
|
+
|
14
21
|
time = begin
|
15
22
|
Time.strptime(str, FORMAT)
|
16
23
|
rescue ArgumentError
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require 'docker/remote'
|
4
|
+
|
5
|
+
module Kuby
|
6
|
+
module Docker
|
7
|
+
class TimestampedImage < Image
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig {
|
11
|
+
params(
|
12
|
+
dockerfile: T.any(Dockerfile, T.proc.returns(Dockerfile)),
|
13
|
+
image_url: String,
|
14
|
+
credentials: Credentials,
|
15
|
+
registry_index_url_str: T.nilable(String),
|
16
|
+
main_tag: T.nilable(String),
|
17
|
+
alias_tags: T::Array[String]
|
18
|
+
).void
|
19
|
+
}
|
20
|
+
def initialize(dockerfile, image_url, credentials, registry_index_url_str = nil, main_tag = nil, alias_tags = [])
|
21
|
+
@new_version = T.let(@new_version, T.nilable(Image))
|
22
|
+
@current_version = T.let(@current_version, T.nilable(Image))
|
23
|
+
@previous_version = T.let(@previous_version, T.nilable(Image))
|
24
|
+
|
25
|
+
@remote_client = T.let(@remote_client, T.nilable(::Docker::Remote::Client))
|
26
|
+
@local = T.let(@local, T.nilable(LocalTags))
|
27
|
+
@remote = T.let(@remote, T.nilable(RemoteTags))
|
28
|
+
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
sig { returns(Image) }
|
33
|
+
def new_version
|
34
|
+
@new_version ||= duplicate_with_tags(
|
35
|
+
TimestampTag.new(Time.now).to_s, [Kuby::Docker::LATEST_TAG]
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
sig { returns(Image) }
|
40
|
+
def current_version
|
41
|
+
@current_version ||= duplicate_with_tags(
|
42
|
+
latest_timestamp_tag.to_s, [Kuby::Docker::LATEST_TAG]
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
sig { params(current_tag: T.nilable(String)).returns(Image) }
|
47
|
+
def previous_version(current_tag = nil)
|
48
|
+
@previous_version ||= duplicate_with_tags(
|
49
|
+
previous_timestamp_tag(current_tag).to_s, []
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
sig { params(current_tag: T.nilable(String)).returns(TimestampTag) }
|
54
|
+
def previous_timestamp_tag(current_tag = nil)
|
55
|
+
current_tag = TimestampTag.try_parse(current_tag || latest_timestamp_tag.to_s)
|
56
|
+
raise MissingTagError, 'could not find current timestamp tag' unless current_tag
|
57
|
+
|
58
|
+
all_tags = timestamp_tags.sort
|
59
|
+
|
60
|
+
idx = all_tags.index do |tag|
|
61
|
+
tag.time == current_tag.time
|
62
|
+
end
|
63
|
+
|
64
|
+
idx ||= 0
|
65
|
+
raise MissingTagError, 'could not find previous timestamp tag' unless idx > 0
|
66
|
+
|
67
|
+
T.must(all_tags[idx - 1])
|
68
|
+
end
|
69
|
+
|
70
|
+
sig { returns(TimestampTag) }
|
71
|
+
def latest_timestamp_tag
|
72
|
+
tag = timestamp_tags.sort.last
|
73
|
+
raise MissingTagError, 'could not find latest timestamp tag' unless tag
|
74
|
+
tag
|
75
|
+
end
|
76
|
+
|
77
|
+
sig { params(build_args: T::Hash[String, String], docker_args: T::Array[String]).void }
|
78
|
+
def build(build_args = {}, docker_args = [])
|
79
|
+
docker_cli.build(new_version, build_args: build_args, docker_args: docker_args)
|
80
|
+
@current_version = new_version
|
81
|
+
@new_version = nil
|
82
|
+
end
|
83
|
+
|
84
|
+
sig { params(tag: String).void }
|
85
|
+
def push(tag)
|
86
|
+
docker_cli.push(image_url, tag)
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
sig { returns(::Docker::Remote::Client) }
|
92
|
+
def remote_client
|
93
|
+
@remote_client ||= ::Docker::Remote::Client.new(
|
94
|
+
registry_index_host, image_repo, credentials.username, credentials.password,
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
sig { returns(T::Array[TimestampTag]) }
|
99
|
+
def timestamp_tags
|
100
|
+
(local.timestamp_tags + remote.timestamp_tags).uniq
|
101
|
+
end
|
102
|
+
|
103
|
+
sig { returns(LocalTags) }
|
104
|
+
def local
|
105
|
+
@local ||= LocalTags.new(docker_cli, image_url)
|
106
|
+
end
|
107
|
+
|
108
|
+
sig { returns(RemoteTags) }
|
109
|
+
def remote
|
110
|
+
@remote ||= RemoteTags.new(remote_client, registry_index_host)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
data/lib/kuby/docker.rb
CHANGED
@@ -4,30 +4,32 @@ require 'kuby/docker/errors'
|
|
4
4
|
|
5
5
|
module Kuby
|
6
6
|
module Docker
|
7
|
-
|
8
|
-
|
9
|
-
autoload :
|
10
|
-
autoload :
|
11
|
-
autoload :
|
12
|
-
autoload :
|
13
|
-
autoload :
|
14
|
-
autoload :
|
15
|
-
autoload :
|
16
|
-
autoload :
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :
|
20
|
-
autoload :
|
21
|
-
autoload :
|
22
|
-
autoload :
|
23
|
-
autoload :
|
24
|
-
autoload :
|
25
|
-
autoload :
|
26
|
-
autoload :
|
27
|
-
autoload :
|
28
|
-
autoload :
|
29
|
-
autoload :
|
30
|
-
autoload :
|
31
|
-
autoload :
|
7
|
+
LATEST_TAG = T.let('latest'.freeze, String)
|
8
|
+
|
9
|
+
autoload :Alpine, 'kuby/docker/alpine'
|
10
|
+
autoload :AppImage, 'kuby/docker/app_image'
|
11
|
+
autoload :AssetsPhase, 'kuby/docker/assets_phase'
|
12
|
+
autoload :BundlerPhase, 'kuby/docker/bundler_phase'
|
13
|
+
autoload :CLI, 'kuby/docker/cli'
|
14
|
+
autoload :CopyPhase, 'kuby/docker/copy_phase'
|
15
|
+
autoload :Credentials, 'kuby/docker/credentials'
|
16
|
+
autoload :Debian, 'kuby/docker/debian'
|
17
|
+
autoload :Distro, 'kuby/docker/distro'
|
18
|
+
autoload :Dockerfile, 'kuby/docker/dockerfile'
|
19
|
+
autoload :DockerURI, 'kuby/docker/docker_uri'
|
20
|
+
autoload :Image, 'kuby/docker/image'
|
21
|
+
autoload :InlineLayer, 'kuby/docker/inline_layer'
|
22
|
+
autoload :Layer, 'kuby/docker/layer'
|
23
|
+
autoload :LayerStack, 'kuby/docker/layer_stack'
|
24
|
+
autoload :LocalTags, 'kuby/docker/local_tags'
|
25
|
+
autoload :Packages, 'kuby/docker/packages'
|
26
|
+
autoload :PackagePhase, 'kuby/docker/package_phase'
|
27
|
+
autoload :RemoteTags, 'kuby/docker/remote_tags'
|
28
|
+
autoload :SetupPhase, 'kuby/docker/setup_phase'
|
29
|
+
autoload :Spec, 'kuby/docker/spec'
|
30
|
+
autoload :TimestampedImage, 'kuby/docker/timestamped_image'
|
31
|
+
autoload :TimestampTag, 'kuby/docker/timestamp_tag'
|
32
|
+
autoload :WebserverPhase, 'kuby/docker/webserver_phase'
|
33
|
+
autoload :YarnPhase, 'kuby/docker/yarn_phase'
|
32
34
|
end
|
33
35
|
end
|
data/lib/kuby/environment.rb
CHANGED
@@ -12,12 +12,7 @@ module Kuby
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def docker(&block)
|
15
|
-
@docker ||=
|
16
|
-
Docker::DevSpec.new(self)
|
17
|
-
else
|
18
|
-
Docker::Spec.new(self)
|
19
|
-
end
|
20
|
-
|
15
|
+
@docker ||= Docker::Spec.new(self)
|
21
16
|
@docker.instance_eval(&block) if block
|
22
17
|
@docker
|
23
18
|
end
|
@@ -31,9 +26,5 @@ module Kuby
|
|
31
26
|
def app_name
|
32
27
|
definition.app_name
|
33
28
|
end
|
34
|
-
|
35
|
-
def development?
|
36
|
-
name == 'development'
|
37
|
-
end
|
38
29
|
end
|
39
30
|
end
|
@@ -1,10 +1,13 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
|
+
|
2
3
|
require 'kube-dsl'
|
3
4
|
|
4
5
|
module Kuby
|
5
6
|
module Kubernetes
|
6
7
|
class BareMetalProvider < Provider
|
7
|
-
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
STORAGE_CLASS_NAME = T.let('hostpath'.freeze, String)
|
8
11
|
|
9
12
|
class Config
|
10
13
|
extend ::KubeDSL::ValueFields
|
@@ -12,25 +15,34 @@ module Kuby
|
|
12
15
|
value_fields :kubeconfig
|
13
16
|
end
|
14
17
|
|
18
|
+
sig { returns(Config) }
|
15
19
|
attr_reader :config
|
16
20
|
|
21
|
+
sig { params(environment: Environment).void }
|
22
|
+
def initialize(environment)
|
23
|
+
@config = T.let(Config.new, Config)
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
sig { params(block: T.proc.void).void }
|
17
28
|
def configure(&block)
|
18
29
|
config.instance_eval(&block) if block
|
19
30
|
end
|
20
31
|
|
32
|
+
sig { returns(String) }
|
21
33
|
def kubeconfig_path
|
22
34
|
config.kubeconfig
|
23
35
|
end
|
24
36
|
|
37
|
+
sig { returns(String) }
|
25
38
|
def storage_class_name
|
26
39
|
STORAGE_CLASS_NAME
|
27
40
|
end
|
28
41
|
|
29
42
|
private
|
30
43
|
|
44
|
+
sig { void }
|
31
45
|
def after_initialize
|
32
|
-
@config = Config.new
|
33
|
-
|
34
46
|
configure do
|
35
47
|
# default kubeconfig path
|
36
48
|
kubeconfig File.join(ENV['HOME'], '.kube', 'config')
|
@@ -102,7 +102,7 @@ module Kuby
|
|
102
102
|
|
103
103
|
def restart_rails_deployment_if_necessary
|
104
104
|
deployed_image = nil
|
105
|
-
current_image = "#{docker.
|
105
|
+
current_image = "#{docker.image.image_url}:#{kubernetes.tag}"
|
106
106
|
|
107
107
|
if rails_app = kubernetes.plugin(:rails_app)
|
108
108
|
deployment_name = rails_app.deployment.metadata.name
|
@@ -18,21 +18,6 @@ module Kuby
|
|
18
18
|
config.instance_eval(&block) if block
|
19
19
|
end
|
20
20
|
|
21
|
-
def after_configuration
|
22
|
-
if rails_app = spec.plugin(:rails_app)
|
23
|
-
# Remove ingress and change service type from ClusterIP to
|
24
|
-
# LoadBalancer. No need to set up ingress for Docker Desktop
|
25
|
-
# since it handles all the localhost mapping, etc if you set
|
26
|
-
# up a service LB.
|
27
|
-
rails_app.resources.delete(rails_app.ingress)
|
28
|
-
rails_app.service.spec { type 'LoadBalancer' }
|
29
|
-
end
|
30
|
-
|
31
|
-
if assets = spec.plugin(:rails_assets)
|
32
|
-
assets.service.spec { type 'LoadBalancer' }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
21
|
def kubeconfig_path
|
37
22
|
config.kubeconfig
|
38
23
|
end
|