kuby-core 0.16.0 → 0.18.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 +58 -0
- data/Gemfile +6 -2
- data/Rakefile +5 -3
- data/bin/tapioca +29 -0
- data/kuby-core.gemspec +9 -11
- data/lib/kuby/basic_logger.rb +34 -34
- data/lib/kuby/cli_base.rb +43 -43
- data/lib/kuby/commands.rb +135 -21
- data/lib/kuby/definition.rb +12 -12
- data/lib/kuby/dependable.rb +20 -0
- data/lib/kuby/dependency.rb +14 -0
- data/lib/kuby/docker/alpine.rb +10 -10
- data/lib/kuby/docker/app_image.rb +11 -20
- data/lib/kuby/docker/app_phase.rb +36 -0
- data/lib/kuby/docker/assets_phase.rb +2 -2
- data/lib/kuby/docker/bundler_phase.rb +42 -40
- data/lib/kuby/docker/cli.rb +72 -37
- data/lib/kuby/docker/copy_phase.rb +7 -7
- data/lib/kuby/docker/credentials.rb +1 -0
- data/lib/kuby/docker/debian.rb +10 -10
- data/lib/kuby/docker/distro.rb +13 -13
- data/lib/kuby/docker/docker_uri.rb +20 -20
- data/lib/kuby/docker/dockerfile.rb +48 -39
- data/lib/kuby/docker/image.rb +66 -54
- data/lib/kuby/docker/inline_layer.rb +4 -4
- data/lib/kuby/docker/layer.rb +6 -6
- data/lib/kuby/docker/layer_stack.rb +35 -35
- data/lib/kuby/docker/local_tags.rb +16 -16
- data/lib/kuby/docker/package_list.rb +16 -16
- data/lib/kuby/docker/package_phase.rb +16 -16
- data/lib/kuby/docker/packages/managed_package.rb +13 -13
- data/lib/kuby/docker/packages/nodejs.rb +5 -5
- data/lib/kuby/docker/packages/package.rb +8 -8
- data/lib/kuby/docker/packages/simple_managed_package.rb +7 -7
- data/lib/kuby/docker/packages/yarn.rb +6 -6
- data/lib/kuby/docker/remote_tags.rb +16 -16
- data/lib/kuby/docker/setup_phase.rb +18 -20
- data/lib/kuby/docker/spec.rb +93 -72
- data/lib/kuby/docker/timestamp_tag.rb +16 -11
- data/lib/kuby/docker/timestamped_image.rb +64 -38
- data/lib/kuby/docker/webserver_phase.rb +20 -20
- data/lib/kuby/docker/yarn_phase.rb +29 -5
- data/lib/kuby/docker.rb +2 -1
- data/lib/kuby/kubernetes/bare_metal_provider.rb +12 -10
- data/lib/kuby/kubernetes/deployer.rb +22 -10
- data/lib/kuby/kubernetes/docker_config.rb +1 -0
- data/lib/kuby/kubernetes/provider.rb +1 -0
- data/lib/kuby/kubernetes/spec.rb +63 -13
- data/lib/kuby/plugin.rb +23 -1
- data/lib/kuby/plugin_registry.rb +15 -0
- data/lib/kuby/plugins/nginx_ingress.rb +8 -6
- data/lib/kuby/plugins/rails_app/assets.rb +16 -4
- data/lib/kuby/plugins/rails_app/assets_image.rb +18 -11
- data/lib/kuby/plugins/rails_app/crdb/plugin.rb +473 -0
- data/lib/kuby/plugins/rails_app/crdb.rb +9 -0
- data/lib/kuby/plugins/rails_app/database.rb +12 -8
- data/lib/kuby/plugins/rails_app/generators/kuby.rb +17 -16
- data/lib/kuby/plugins/rails_app/plugin.rb +37 -27
- data/lib/kuby/plugins/rails_app/sqlite.rb +7 -3
- data/lib/kuby/plugins/rails_app/tasks.rake +25 -12
- data/lib/kuby/plugins/rails_app.rb +1 -0
- data/lib/kuby/plugins/system.rb +16 -0
- data/lib/kuby/plugins.rb +1 -0
- data/lib/kuby/railtie.rb +31 -1
- data/lib/kuby/tasks.rb +91 -10
- data/lib/kuby/trailing_hash.rb +2 -2
- data/lib/kuby/utils/sem_ver/constraint.rb +68 -0
- data/lib/kuby/utils/sem_ver/constraint_set.rb +25 -0
- data/lib/kuby/utils/sem_ver/version.rb +49 -0
- data/lib/kuby/utils/sem_ver.rb +17 -0
- data/lib/kuby/utils/table.rb +35 -0
- data/lib/kuby/utils/which.rb +65 -0
- data/lib/kuby/utils.rb +11 -0
- data/lib/kuby/version.rb +1 -1
- data/lib/kuby.rb +37 -2
- data/rbi/kuby-core.rbi +2128 -0
- data/spec/docker/spec_spec.rb +50 -26
- data/spec/docker/timestamped_image_spec.rb +2 -2
- data/spec/dummy/app/channels/application_cable/channel.rb +2 -1
- data/spec/dummy/app/channels/application_cable/connection.rb +2 -1
- data/spec/dummy/app/controllers/application_controller.rb +2 -1
- data/spec/dummy/app/jobs/application_job.rb +2 -1
- data/spec/dummy/app/mailers/application_mailer.rb +2 -1
- data/spec/dummy/app/models/application_record.rb +2 -1
- data/spec/dummy/config/application.rb +2 -1
- data/spec/dummy/config/initializers/wrap_parameters.rb +2 -1
- data/spec/dummy/config/routes.rb +2 -1
- data/spec/dummy/test/application_system_test_case.rb +2 -1
- data/spec/dummy/test/channels/application_cable/connection_test.rb +2 -1
- data/spec/spec_helper.rb +13 -1
- metadata +46 -39
- data/lib/kuby/plugins/rails_app/mysql.rb +0 -158
- data/lib/kuby/plugins/rails_app/postgres.rb +0 -163
data/lib/kuby/docker/image.rb
CHANGED
@@ -3,137 +3,149 @@
|
|
3
3
|
module Kuby
|
4
4
|
module Docker
|
5
5
|
class Image
|
6
|
-
extend T::Sig
|
6
|
+
# extend T::Sig
|
7
7
|
|
8
|
-
sig { returns(T.nilable(String)) }
|
8
|
+
# T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
|
9
9
|
attr_reader :identifier
|
10
10
|
|
11
|
-
sig { returns(String) }
|
11
|
+
# T::Sig::WithoutRuntime.sig { returns(String) }
|
12
12
|
attr_reader :image_url
|
13
13
|
|
14
|
-
sig { returns(T.nilable(String)) }
|
14
|
+
# T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
|
15
15
|
attr_reader :registry_index_url
|
16
16
|
|
17
|
-
sig { returns(Credentials) }
|
17
|
+
# T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Credentials) }
|
18
18
|
attr_reader :credentials
|
19
19
|
|
20
|
-
sig { returns(T.nilable(String)) }
|
20
|
+
# T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
|
21
21
|
attr_reader :main_tag
|
22
22
|
|
23
|
-
sig { returns T::Array[String] }
|
23
|
+
# T::Sig::WithoutRuntime.sig { returns T::Array[String] }
|
24
24
|
attr_reader :alias_tags
|
25
25
|
|
26
|
-
sig {
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
}
|
26
|
+
# T::Sig::WithoutRuntime.sig {
|
27
|
+
# params(
|
28
|
+
# dockerfile: T.any(Dockerfile, T.proc.returns(Kuby::Docker::Dockerfile)),
|
29
|
+
# image_url: String,
|
30
|
+
# credentials: Kuby::Docker::Credentials,
|
31
|
+
# registry_index_url: T.nilable(String),
|
32
|
+
# main_tag: T.nilable(String),
|
33
|
+
# alias_tags: T::Array[String]
|
34
|
+
# ).void
|
35
|
+
# }
|
36
36
|
def initialize(dockerfile, image_url, credentials, registry_index_url = nil, main_tag = nil, alias_tags = [])
|
37
|
-
@dockerfile =
|
38
|
-
@image_url =
|
39
|
-
@registry_index_url =
|
40
|
-
@credentials =
|
41
|
-
@main_tag =
|
42
|
-
@alias_tags =
|
43
|
-
@identifier = T.let(@identifier, T.nilable(String))
|
44
|
-
|
45
|
-
@image_host = T.let(@image_host, T.nilable(String))
|
46
|
-
@image_hostname = T.let(@image_hostname, T.nilable(String))
|
47
|
-
@registry_index_host = T.let(@registry_index_host, T.nilable(String))
|
48
|
-
@registry_index_hostname = T.let(@registry_index_hostname, T.nilable(String))
|
49
|
-
@registry_index_uri = T.let(@registry_index_uri, T.nilable(DockerURI))
|
50
|
-
@image_repo = T.let(@image_repo, T.nilable(String))
|
51
|
-
@full_image_uri = T.let(@full_image_uri, T.nilable(DockerURI))
|
52
|
-
@docker_cli = T.let(@docker_cli, T.nilable(Docker::CLI))
|
53
|
-
end
|
54
|
-
|
55
|
-
sig { returns(Image) }
|
37
|
+
@dockerfile = dockerfile
|
38
|
+
@image_url = image_url
|
39
|
+
@registry_index_url = registry_index_url
|
40
|
+
@credentials = credentials
|
41
|
+
@main_tag = main_tag
|
42
|
+
@alias_tags = alias_tags
|
43
|
+
# @identifier = T.let(@identifier, T.nilable(String))
|
44
|
+
|
45
|
+
# @image_host = T.let(@image_host, T.nilable(String))
|
46
|
+
# @image_hostname = T.let(@image_hostname, T.nilable(String))
|
47
|
+
# @registry_index_host = T.let(@registry_index_host, T.nilable(String))
|
48
|
+
# @registry_index_hostname = T.let(@registry_index_hostname, T.nilable(String))
|
49
|
+
# @registry_index_uri = T.let(@registry_index_uri, T.nilable(DockerURI))
|
50
|
+
# @image_repo = T.let(@image_repo, T.nilable(String))
|
51
|
+
# @full_image_uri = T.let(@full_image_uri, T.nilable(DockerURI))
|
52
|
+
# @docker_cli = T.let(@docker_cli, T.nilable(Docker::CLI))
|
53
|
+
end
|
54
|
+
|
55
|
+
# T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Image) }
|
56
56
|
def new_version
|
57
57
|
raise NotImplementedError, 'please use a Docker::Image subclass'
|
58
58
|
end
|
59
59
|
|
60
|
-
sig { returns(Image) }
|
60
|
+
# T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Image) }
|
61
61
|
def current_version
|
62
62
|
raise NotImplementedError, 'please use a Docker::Image subclass'
|
63
63
|
end
|
64
64
|
|
65
|
-
sig { params(current_tag: T.nilable(String)).returns(Image) }
|
65
|
+
# T::Sig::WithoutRuntime.sig { params(current_tag: T.nilable(String)).returns(Image) }
|
66
66
|
def previous_version(current_tag = nil)
|
67
67
|
raise NotImplementedError, 'please use a Docker::Image subclass'
|
68
68
|
end
|
69
69
|
|
70
|
-
sig { returns(Dockerfile) }
|
70
|
+
# T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Dockerfile) }
|
71
71
|
def dockerfile
|
72
72
|
if @dockerfile.respond_to?(:call)
|
73
|
-
|
73
|
+
@dockerfile.call
|
74
74
|
else
|
75
|
-
|
75
|
+
@dockerfile
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
sig { returns(String) }
|
79
|
+
# T::Sig::WithoutRuntime.sig { returns(String) }
|
80
80
|
def image_host
|
81
81
|
@image_host ||= "#{image_uri.host}:#{image_uri.port}"
|
82
82
|
end
|
83
83
|
|
84
|
-
sig { returns(String) }
|
84
|
+
# T::Sig::WithoutRuntime.sig { returns(String) }
|
85
85
|
def registry_index_host
|
86
86
|
@registry_index_host ||= "#{registry_index_uri.host}:#{registry_index_uri.port}"
|
87
87
|
end
|
88
88
|
|
89
|
-
sig { returns(String) }
|
89
|
+
# T::Sig::WithoutRuntime.sig { returns(String) }
|
90
90
|
def registry_index_hostname
|
91
91
|
@registry_index_hostname ||= registry_index_uri.host
|
92
92
|
end
|
93
93
|
|
94
|
-
sig { returns(String) }
|
94
|
+
# T::Sig::WithoutRuntime.sig { returns(String) }
|
95
95
|
def image_hostname
|
96
96
|
@image_hostname ||= image_uri.host
|
97
97
|
end
|
98
98
|
|
99
|
-
sig { returns(String) }
|
99
|
+
# T::Sig::WithoutRuntime.sig { returns(String) }
|
100
100
|
def image_repo
|
101
101
|
@image_repo ||= image_uri.path
|
102
102
|
end
|
103
103
|
|
104
|
-
sig { returns(DockerURI) }
|
104
|
+
# T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::DockerURI) }
|
105
105
|
def image_uri
|
106
106
|
@full_image_uri ||= DockerURI.parse_uri(image_url)
|
107
107
|
end
|
108
108
|
|
109
|
-
sig { returns(DockerURI) }
|
109
|
+
# T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::DockerURI) }
|
110
110
|
def registry_index_uri
|
111
111
|
@registry_index_uri ||= DockerURI.parse_index_uri(registry_index_url || image_url)
|
112
112
|
end
|
113
113
|
|
114
|
-
sig { returns(T::Array[String]) }
|
114
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Array[String]) }
|
115
115
|
def tags
|
116
116
|
[main_tag, *alias_tags].compact
|
117
117
|
end
|
118
118
|
|
119
|
-
|
120
|
-
|
119
|
+
# T::Sig::WithoutRuntime.sig {
|
120
|
+
# params(
|
121
|
+
# build_args: T::Hash[String, String],
|
122
|
+
# docker_args: T::Array[String],
|
123
|
+
# context: T.nilable(String),
|
124
|
+
# cache_from: T.nilable(String)
|
125
|
+
# ).void
|
126
|
+
# }
|
127
|
+
def build(build_args = {}, docker_args = [], context: nil, cache_from: nil)
|
121
128
|
raise NotImplementedError, 'please use a Docker::Image subclass'
|
122
129
|
end
|
123
130
|
|
124
|
-
sig { params(tag: String).void }
|
131
|
+
# T::Sig::WithoutRuntime.sig { params(tag: String).void }
|
125
132
|
def push(tag)
|
126
133
|
raise NotImplementedError, 'please use a Docker::Image subclass'
|
127
134
|
end
|
128
135
|
|
129
|
-
sig {
|
136
|
+
# T::Sig::WithoutRuntime.sig { params(tag: String).void }
|
137
|
+
def pull(tag)
|
138
|
+
raise NotImplementedError, 'please use a Docker::Image subclass'
|
139
|
+
end
|
140
|
+
|
141
|
+
# T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::CLI) }
|
130
142
|
def docker_cli
|
131
143
|
@docker_cli ||= Docker::CLI.new
|
132
144
|
end
|
133
145
|
|
134
146
|
private
|
135
147
|
|
136
|
-
sig { params(main_tag: String, alias_tags: T::Array[String]).returns(Image) }
|
148
|
+
# T::Sig::WithoutRuntime.sig { params(main_tag: String, alias_tags: T::Array[String]).returns(Image) }
|
137
149
|
def duplicate_with_tags(main_tag, alias_tags)
|
138
150
|
self.class.new(dockerfile, image_url, credentials, registry_index_url, main_tag, alias_tags)
|
139
151
|
end
|
@@ -3,17 +3,17 @@
|
|
3
3
|
module Kuby
|
4
4
|
module Docker
|
5
5
|
class InlineLayer < Layer
|
6
|
-
extend T::Sig
|
6
|
+
# extend T::Sig
|
7
7
|
|
8
|
-
sig { returns(T.proc.params(df: Dockerfile).void) }
|
8
|
+
# T::Sig::WithoutRuntime.sig { returns(T.proc.params(df: Dockerfile).void) }
|
9
9
|
attr_reader :block
|
10
10
|
|
11
|
-
sig { params(block: T.proc.params(df: Dockerfile).void).void }
|
11
|
+
# T::Sig::WithoutRuntime.sig { params(block: T.proc.params(df: Dockerfile).void).void }
|
12
12
|
def initialize(block)
|
13
13
|
@block = block
|
14
14
|
end
|
15
15
|
|
16
|
-
sig { override.params(dockerfile: Dockerfile).void }
|
16
|
+
# T::Sig::WithoutRuntime.sig { override.params(dockerfile: Dockerfile).void }
|
17
17
|
def apply_to(dockerfile)
|
18
18
|
block.call(dockerfile)
|
19
19
|
end
|
data/lib/kuby/docker/layer.rb
CHANGED
@@ -3,20 +3,20 @@
|
|
3
3
|
module Kuby
|
4
4
|
module Docker
|
5
5
|
class Layer
|
6
|
-
extend T::Sig
|
7
|
-
extend T::Helpers
|
6
|
+
# extend T::Sig
|
7
|
+
# extend T::Helpers
|
8
8
|
|
9
|
-
abstract!
|
9
|
+
# abstract!
|
10
10
|
|
11
|
-
sig { returns(Environment) }
|
11
|
+
# T::Sig::WithoutRuntime.sig { returns(Environment) }
|
12
12
|
attr_reader :environment
|
13
13
|
|
14
|
-
sig { params(environment: Environment).void }
|
14
|
+
# T::Sig::WithoutRuntime.sig { params(environment: Environment).void }
|
15
15
|
def initialize(environment)
|
16
16
|
@environment = environment
|
17
17
|
end
|
18
18
|
|
19
|
-
sig { params(dockerfile: Dockerfile).void }
|
19
|
+
# T::Sig::WithoutRuntime.sig { params(dockerfile: Dockerfile).void }
|
20
20
|
def apply_to(dockerfile)
|
21
21
|
raise NotImplementedError,
|
22
22
|
"#{__method__} must be defined in derived classes"
|
@@ -3,44 +3,44 @@
|
|
3
3
|
module Kuby
|
4
4
|
module Docker
|
5
5
|
class LayerStack
|
6
|
-
extend T::Sig
|
7
|
-
extend T::Generic
|
6
|
+
# extend T::Sig
|
7
|
+
# extend T::Generic
|
8
8
|
|
9
|
-
Elem = type_member
|
9
|
+
# Elem = type_member { { fixed: Kuby::Docker::Layer } }
|
10
10
|
|
11
11
|
include Enumerable
|
12
12
|
|
13
|
-
sig { returns(T::Array[Symbol]) }
|
13
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Array[Symbol]) }
|
14
14
|
attr_reader :stack
|
15
15
|
|
16
|
-
sig { returns(T::Hash[Symbol, Layer]) }
|
16
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Hash[Symbol, Kuby::Docker::Layer]) }
|
17
17
|
attr_reader :layers
|
18
18
|
|
19
|
-
sig { void }
|
19
|
+
# T::Sig::WithoutRuntime.sig { void }
|
20
20
|
def initialize
|
21
|
-
@stack =
|
22
|
-
@layers =
|
21
|
+
@stack = []
|
22
|
+
@layers = {}
|
23
23
|
end
|
24
24
|
|
25
|
-
sig {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
}
|
25
|
+
# T::Sig::WithoutRuntime.sig {
|
26
|
+
# override.params(
|
27
|
+
# block: T.nilable(T.proc.params(layer: Kuby::Docker::Layer).void)
|
28
|
+
# )
|
29
|
+
# .void
|
30
|
+
# }
|
31
31
|
def each(&block)
|
32
|
-
return to_enum(
|
33
|
-
@stack.each { |name| yield
|
32
|
+
return to_enum(__method__) unless block_given?
|
33
|
+
@stack.each { |name| yield layers[name] }
|
34
34
|
end
|
35
35
|
|
36
|
-
sig {
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
}
|
36
|
+
# T::Sig::WithoutRuntime.sig {
|
37
|
+
# params(
|
38
|
+
# name: Symbol,
|
39
|
+
# layer: T.nilable(Layer),
|
40
|
+
# block: T.nilable(T.proc.params(df: Kuby::Docker::Dockerfile).void)
|
41
|
+
# )
|
42
|
+
# .void
|
43
|
+
# }
|
44
44
|
def use(name, layer = nil, &block)
|
45
45
|
stack << name
|
46
46
|
|
@@ -53,15 +53,15 @@ module Kuby
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
sig {
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
}
|
56
|
+
# T::Sig::WithoutRuntime.sig {
|
57
|
+
# params(
|
58
|
+
# name: Symbol,
|
59
|
+
# layer: T.nilable(T.any(Layer, T::Hash[Symbol, T.untyped])),
|
60
|
+
# options: T::Hash[Symbol, T.untyped],
|
61
|
+
# block: T.nilable(T.proc.params(df: Kuby::Docker::Dockerfile).void)
|
62
|
+
# )
|
63
|
+
# .void
|
64
|
+
# }
|
65
65
|
def insert(name, layer = nil, options = {}, &block)
|
66
66
|
# this is truly gross but it's the only way I can think of to be able
|
67
67
|
# to call insert these two ways:
|
@@ -94,13 +94,13 @@ module Kuby
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
-
sig { params(name: Symbol).void }
|
97
|
+
# T::Sig::WithoutRuntime.sig { params(name: Symbol).void }
|
98
98
|
def delete(name)
|
99
99
|
stack.delete(name)
|
100
100
|
layers.delete(name)
|
101
101
|
end
|
102
102
|
|
103
|
-
sig { params(name: Symbol).returns(T::Boolean) }
|
103
|
+
# T::Sig::WithoutRuntime.sig { params(name: Symbol).returns(T::Boolean) }
|
104
104
|
def includes?(name)
|
105
105
|
layers.include?(name)
|
106
106
|
end
|
@@ -3,34 +3,34 @@
|
|
3
3
|
module Kuby
|
4
4
|
module Docker
|
5
5
|
class LocalTags
|
6
|
-
extend T::Sig
|
6
|
+
# extend T::Sig
|
7
7
|
|
8
|
-
sig { returns CLI }
|
8
|
+
# T::Sig::WithoutRuntime.sig { returns Kuby::Docker::CLI }
|
9
9
|
attr_reader :cli
|
10
10
|
|
11
|
-
sig { returns(String) }
|
11
|
+
# T::Sig::WithoutRuntime.sig { returns(String) }
|
12
12
|
attr_reader :image_url
|
13
13
|
|
14
|
-
sig {
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
}
|
14
|
+
# T::Sig::WithoutRuntime.sig {
|
15
|
+
# params(
|
16
|
+
# cli: Kuby::Docker::CLI,
|
17
|
+
# image_url: String
|
18
|
+
# )
|
19
|
+
# .void
|
20
|
+
# }
|
21
21
|
def initialize(cli, image_url)
|
22
22
|
@cli = cli
|
23
23
|
@image_url = image_url
|
24
|
-
@latest_timestamp_tag = T.let(@latest_timestamp_tag, T.nilable(TimestampTag))
|
24
|
+
# @latest_timestamp_tag = T.let(@latest_timestamp_tag, T.nilable(TimestampTag))
|
25
25
|
end
|
26
26
|
|
27
|
-
sig { returns(T::Array[String]) }
|
27
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Array[String]) }
|
28
28
|
def tags
|
29
29
|
images = cli.images(image_url)
|
30
|
-
images.map { |image|
|
30
|
+
images.map { |image| image[:tag] }
|
31
31
|
end
|
32
32
|
|
33
|
-
sig { returns(T::Array[String]) }
|
33
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Array[String]) }
|
34
34
|
def latest_tags
|
35
35
|
# find "latest" tag
|
36
36
|
images = cli.images(image_url)
|
@@ -48,12 +48,12 @@ module Kuby
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
sig { returns(T::Array[TimestampTag]) }
|
51
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Array[Kuby::Docker::TimestampTag]) }
|
52
52
|
def timestamp_tags
|
53
53
|
tags.map { |t| TimestampTag.try_parse(t) }.compact
|
54
54
|
end
|
55
55
|
|
56
|
-
sig { returns(T.nilable(TimestampTag)) }
|
56
|
+
# T::Sig::WithoutRuntime.sig { returns(T.nilable(Kuby::Docker::TimestampTag)) }
|
57
57
|
def latest_timestamp_tag
|
58
58
|
@latest_timestamp_tag ||= timestamp_tags.sort.last
|
59
59
|
end
|
@@ -3,48 +3,48 @@
|
|
3
3
|
module Kuby
|
4
4
|
module Docker
|
5
5
|
class PackageList
|
6
|
-
extend T::Sig
|
7
|
-
extend T::Generic
|
6
|
+
# extend T::Sig
|
7
|
+
# extend T::Generic
|
8
8
|
|
9
|
-
Elem = type_member
|
9
|
+
# Elem = type_member { { fixed: Distro::PackageImpl } }
|
10
10
|
|
11
11
|
include Enumerable
|
12
12
|
|
13
|
-
sig { returns(T::Array[Distro::PackageImpl]) }
|
13
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Array[Distro::PackageImpl]) }
|
14
14
|
attr_reader :packages
|
15
15
|
|
16
|
-
sig { params(package_tuples: T::Array[[Symbol, T.nilable(String)]]).void }
|
16
|
+
# T::Sig::WithoutRuntime.sig { params(package_tuples: T::Array[[Symbol, T.nilable(String)]]).void }
|
17
17
|
def initialize(package_tuples)
|
18
|
-
@packages =
|
18
|
+
@packages = []
|
19
19
|
package_tuples.each { |name, version| add(name, version) }
|
20
20
|
end
|
21
21
|
|
22
|
-
sig { params(name: Symbol).returns(T.nilable(Distro::PackageImpl)) }
|
22
|
+
# T::Sig::WithoutRuntime.sig { params(name: Symbol).returns(T.nilable(Distro::PackageImpl)) }
|
23
23
|
def [](name)
|
24
24
|
packages.find { |pkg| pkg.name == name }
|
25
25
|
end
|
26
26
|
|
27
|
-
sig { params(name: Symbol, version: T.nilable(String)).void }
|
27
|
+
# T::Sig::WithoutRuntime.sig { params(name: Symbol, version: T.nilable(String)).void }
|
28
28
|
def add(name, version = nil)
|
29
29
|
packages << Packages::Package.new(name, version)
|
30
30
|
end
|
31
31
|
|
32
|
-
sig { params(name: String).void }
|
32
|
+
# T::Sig::WithoutRuntime.sig { params(name: String).void }
|
33
33
|
def delete(name)
|
34
34
|
packages.delete_if { |pkg| pkg.name == name }
|
35
35
|
end
|
36
36
|
|
37
|
-
sig {
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
}
|
37
|
+
# T::Sig::WithoutRuntime.sig {
|
38
|
+
# override.params(
|
39
|
+
# block: T.proc.params(package: Distro::PackageImpl).void
|
40
|
+
# )
|
41
|
+
# .void
|
42
|
+
# }
|
43
43
|
def each(&block)
|
44
44
|
packages.each(&block)
|
45
45
|
end
|
46
46
|
|
47
|
-
sig { returns(T::Boolean) }
|
47
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Boolean) }
|
48
48
|
def empty?
|
49
49
|
packages.empty?
|
50
50
|
end
|
@@ -3,31 +3,31 @@
|
|
3
3
|
module Kuby
|
4
4
|
module Docker
|
5
5
|
class PackagePhase < Layer
|
6
|
-
extend T::Sig
|
6
|
+
# extend T::Sig
|
7
7
|
|
8
|
-
Operation = T.type_alias { [Symbol, Symbol, T.nilable(String)] }
|
8
|
+
# Operation = T.type_alias { [Symbol, Symbol, T.nilable(String)] }
|
9
9
|
|
10
|
-
sig { returns(T::Array[Operation]) }
|
10
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Array[Operation]) }
|
11
11
|
attr_reader :operations
|
12
12
|
|
13
|
-
sig { params(environment: Environment).void }
|
13
|
+
# T::Sig::WithoutRuntime.sig { params(environment: Kuby::Environment).void }
|
14
14
|
def initialize(environment)
|
15
15
|
super
|
16
16
|
|
17
|
-
@operations =
|
17
|
+
@operations = []
|
18
18
|
end
|
19
19
|
|
20
|
-
sig { params(package_name: Symbol, version: T.nilable(String)).void }
|
20
|
+
# T::Sig::WithoutRuntime.sig { params(package_name: Symbol, version: T.nilable(String)).void }
|
21
21
|
def add(package_name, version = nil)
|
22
22
|
operations << [:add, package_name, version]
|
23
23
|
end
|
24
24
|
|
25
|
-
sig { params(package_name: Symbol).void }
|
25
|
+
# T::Sig::WithoutRuntime.sig { params(package_name: Symbol).void }
|
26
26
|
def remove(package_name)
|
27
27
|
operations << [:remove, package_name, nil]
|
28
28
|
end
|
29
29
|
|
30
|
-
sig { override.params(dockerfile: Dockerfile).void }
|
30
|
+
# T::Sig::WithoutRuntime.sig { override.params(dockerfile: Kuby::Docker::Dockerfile).void }
|
31
31
|
def apply_to(dockerfile)
|
32
32
|
packages = distro_spec.default_packages.dup
|
33
33
|
|
@@ -50,18 +50,18 @@ module Kuby
|
|
50
50
|
|
51
51
|
private
|
52
52
|
|
53
|
-
sig { returns(Distro) }
|
53
|
+
# T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Distro) }
|
54
54
|
def distro_spec
|
55
55
|
environment.docker.distro_spec
|
56
56
|
end
|
57
57
|
|
58
|
-
sig {
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
}
|
58
|
+
# T::Sig::WithoutRuntime.sig {
|
59
|
+
# params(
|
60
|
+
# package_name: Symbol,
|
61
|
+
# version: T.nilable(String)
|
62
|
+
# )
|
63
|
+
# .returns(Kuby::Docker::Distro::PackageImpl)
|
64
|
+
# }
|
65
65
|
def get_package(package_name, version)
|
66
66
|
if package = Kuby.packages[package_name]
|
67
67
|
package.with_version(version)
|
@@ -4,27 +4,27 @@ module Kuby
|
|
4
4
|
module Docker
|
5
5
|
module Packages
|
6
6
|
class ManagedPackage
|
7
|
-
extend T::Sig
|
7
|
+
# extend T::Sig
|
8
8
|
|
9
|
-
sig { returns(Symbol) }
|
9
|
+
# T::Sig::WithoutRuntime.sig { returns(Symbol) }
|
10
10
|
attr_reader :name
|
11
11
|
|
12
|
-
sig { returns(T::Hash[Symbol, String]) }
|
12
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Hash[Symbol, String]) }
|
13
13
|
attr_reader :names_per_distro
|
14
14
|
|
15
|
-
sig {
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}
|
15
|
+
# T::Sig::WithoutRuntime.sig {
|
16
|
+
# params(
|
17
|
+
# name: Symbol,
|
18
|
+
# names_per_distro: T::Hash[Symbol, String]
|
19
|
+
# )
|
20
|
+
# .void
|
21
|
+
# }
|
22
22
|
def initialize(name, names_per_distro)
|
23
23
|
@name = name
|
24
24
|
@names_per_distro = names_per_distro
|
25
25
|
end
|
26
26
|
|
27
|
-
sig { params(distro: Symbol).returns(String) }
|
27
|
+
# T::Sig::WithoutRuntime.sig { params(distro: Symbol).returns(String) }
|
28
28
|
def package_name_for(distro)
|
29
29
|
names_per_distro.fetch(distro) do
|
30
30
|
raise UnsupportedDistroError, "Couldn't install #{name} "\
|
@@ -32,12 +32,12 @@ module Kuby
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
sig { params(ver: String).returns(T.self_type) }
|
35
|
+
# T::Sig::WithoutRuntime.sig { params(ver: String).returns(T.self_type) }
|
36
36
|
def with_version(ver)
|
37
37
|
self
|
38
38
|
end
|
39
39
|
|
40
|
-
sig { returns(T::Boolean) }
|
40
|
+
# T::Sig::WithoutRuntime.sig { returns(T::Boolean) }
|
41
41
|
def managed?
|
42
42
|
true
|
43
43
|
end
|
@@ -4,26 +4,26 @@ module Kuby
|
|
4
4
|
module Docker
|
5
5
|
module Packages
|
6
6
|
class Nodejs < Package
|
7
|
-
extend T::Sig
|
7
|
+
# extend T::Sig
|
8
8
|
|
9
|
-
sig { params(dockerfile: Dockerfile).void }
|
9
|
+
# T::Sig::WithoutRuntime.sig { params(dockerfile: Dockerfile).void }
|
10
10
|
def install_on_debian(dockerfile)
|
11
11
|
install_from_image("node:#{version}", dockerfile)
|
12
12
|
end
|
13
13
|
|
14
|
-
sig { params(dockerfile: Dockerfile).void }
|
14
|
+
# T::Sig::WithoutRuntime.sig { params(dockerfile: Dockerfile).void }
|
15
15
|
def install_on_alpine(dockerfile)
|
16
16
|
install_from_image("node:#{version}-alpine", dockerfile)
|
17
17
|
end
|
18
18
|
|
19
|
-
sig { returns(String) }
|
19
|
+
# T::Sig::WithoutRuntime.sig { returns(String) }
|
20
20
|
def version
|
21
21
|
@version || 'current'
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
|
-
sig { params(image: String, dockerfile: Dockerfile).void }
|
26
|
+
# T::Sig::WithoutRuntime.sig { params(image: String, dockerfile: Dockerfile).void }
|
27
27
|
def install_from_image(image, dockerfile)
|
28
28
|
dockerfile.insert_at(0) do
|
29
29
|
dockerfile.from(image, as: 'nodejs')
|