kuby-core 0.11.15 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/Gemfile +1 -2
- data/README.md +2 -1
- data/kuby-core.gemspec +1 -1
- data/lib/kuby/commands.rb +24 -72
- data/lib/kuby/docker/alpine.rb +2 -1
- data/lib/kuby/docker/app_image.rb +33 -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 +18 -7
- data/lib/kuby/docker/errors.rb +1 -19
- data/lib/kuby/docker/image.rb +119 -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 +29 -62
- data/lib/kuby/docker/timestamp_tag.rb +8 -1
- data/lib/kuby/docker/timestamped_image.rb +113 -0
- data/lib/kuby/docker/yarn_phase.rb +1 -4
- 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 +61 -70
- data/lib/kuby/plugins/rails_app/assets_image.rb +56 -0
- data/lib/kuby/plugins/rails_app/plugin.rb +53 -236
- data/lib/kuby/plugins/rails_app.rb +1 -0
- data/lib/kuby/tasks.rb +44 -70
- 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
data/lib/kuby/tasks.rb
CHANGED
@@ -9,65 +9,67 @@ module Kuby
|
|
9
9
|
@environment = environment
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
def print_dockerfiles(only = nil)
|
13
|
+
kubernetes.docker_images.each do |image|
|
14
|
+
next if only && image.identifier != only
|
15
|
+
|
16
|
+
image = image.current_version
|
17
|
+
identifier = image.identifier ? " ##{image.identifier}" : ""
|
18
|
+
Kuby.logger.info("Dockerfile for#{identifier} image #{image.image_url} with tags #{image.tags.join(', ')}")
|
19
|
+
theme = Rouge::Themes::Base16::Solarized.new
|
20
|
+
formatter = Rouge::Formatters::Terminal256.new(theme)
|
21
|
+
lexer = Rouge::Lexers::Docker.new
|
22
|
+
tokens = lexer.lex(image.dockerfile.to_s)
|
23
|
+
puts formatter.format(tokens)
|
24
|
+
end
|
18
25
|
end
|
19
26
|
|
20
27
|
def setup
|
21
28
|
environment.kubernetes.setup
|
22
29
|
end
|
23
30
|
|
24
|
-
def build
|
25
|
-
|
31
|
+
def build(build_args = {}, docker_args = [], only = nil)
|
32
|
+
kubernetes.docker_images.each do |image|
|
33
|
+
next if only && image.identifier != only
|
26
34
|
|
27
|
-
|
28
|
-
|
35
|
+
image = image.new_version
|
36
|
+
Kuby.logger.info("Building image #{image.image_url} with tags #{image.tags.join(', ')}")
|
37
|
+
image.build(build_args, docker_args)
|
29
38
|
end
|
30
|
-
|
31
|
-
docker.cli.build(
|
32
|
-
dockerfile: docker.to_dockerfile,
|
33
|
-
image_url: docker.metadata.image_url,
|
34
|
-
tags: docker.metadata.tags,
|
35
|
-
build_args: build_args
|
36
|
-
)
|
37
39
|
end
|
38
40
|
|
39
|
-
def push
|
40
|
-
|
41
|
-
|
42
|
-
end
|
41
|
+
def push(only = nil)
|
42
|
+
kubernetes.docker_images.each do |image|
|
43
|
+
next if only && image.identifier != only
|
43
44
|
|
44
|
-
|
45
|
+
image = image.current_version
|
46
|
+
Kuby.logger.info("Pushing image #{image.image_url} with tags #{image.tags.join(', ')}")
|
47
|
+
push_image(image)
|
48
|
+
end
|
49
|
+
end
|
45
50
|
|
46
|
-
|
47
|
-
|
51
|
+
def push_image(image)
|
52
|
+
if image.credentials.username && !image.docker_cli.auths.include?(image.image_host)
|
53
|
+
Kuby.logger.info("Attempting to log in to registry at #{image.image_host}")
|
48
54
|
|
49
55
|
begin
|
50
|
-
|
51
|
-
url:
|
52
|
-
username:
|
53
|
-
password:
|
56
|
+
image.docker_cli.login(
|
57
|
+
url: image.image_host,
|
58
|
+
username: image.credentials.username,
|
59
|
+
password: image.credentials.password
|
54
60
|
)
|
55
61
|
rescue Kuby::Docker::LoginError => e
|
56
|
-
Kuby.logger.fatal("Couldn't log in to the registry at #{
|
62
|
+
Kuby.logger.fatal("Couldn't log in to the registry at #{image.image_host}")
|
57
63
|
Kuby.logger.fatal(e.message)
|
58
64
|
return
|
59
65
|
end
|
60
66
|
end
|
61
67
|
|
62
|
-
image_url = docker.metadata.image_url
|
63
|
-
|
64
68
|
begin
|
65
|
-
|
66
|
-
docker.cli.push(image_url, tag)
|
67
|
-
end
|
69
|
+
image.tags.each { |tag| image.push(tag) }
|
68
70
|
rescue Kuby::Docker::MissingTagError => e
|
69
71
|
msg = "#{e.message} Run kuby build to build the "\
|
70
|
-
'Docker
|
72
|
+
'Docker images before running this task.'
|
71
73
|
|
72
74
|
Kuby.logger.fatal(msg)
|
73
75
|
Kuby.logger.fatal(e.message)
|
@@ -82,10 +84,16 @@ module Kuby
|
|
82
84
|
environment.kubernetes.rollback
|
83
85
|
end
|
84
86
|
|
85
|
-
def print_resources
|
87
|
+
def print_resources(kind = nil, name_pattern = nil)
|
86
88
|
kubernetes.before_deploy
|
87
89
|
|
90
|
+
name_rxp = Regexp.new(name_pattern) if name_pattern
|
91
|
+
|
88
92
|
kubernetes.resources.each do |res|
|
93
|
+
next if kind && res.kind_sym.to_s != kind
|
94
|
+
|
95
|
+
next if name_rxp && !name_rxp.match?(res.metadata.name)
|
96
|
+
|
89
97
|
puts res.to_resource.serialize.to_yaml
|
90
98
|
end
|
91
99
|
end
|
@@ -135,40 +143,6 @@ module Kuby
|
|
135
143
|
kubernetes_cli.restart_deployment(namespace, deployment)
|
136
144
|
end
|
137
145
|
|
138
|
-
def dev_deployment_ok
|
139
|
-
return true unless Kuby.environment.development?
|
140
|
-
|
141
|
-
deployments = kubernetes_cli.get_objects(
|
142
|
-
'deployments', namespace, match_labels.serialize
|
143
|
-
)
|
144
|
-
|
145
|
-
if deployments.empty?
|
146
|
-
puts 'No development environment detected.'
|
147
|
-
STDOUT.write('Set up development environment? (y/n): ')
|
148
|
-
answer = STDIN.gets.strip.downcase
|
149
|
-
return false unless answer =~ /ye?s?/
|
150
|
-
return DevSetup.new(environment).run
|
151
|
-
else
|
152
|
-
depl = deployments.first
|
153
|
-
deployed_checksum = depl.dig('metadata', 'annotations', 'getkuby.io/dockerfile-checksum')
|
154
|
-
current_checksum = docker.to_dockerfile.checksum
|
155
|
-
|
156
|
-
if deployed_checksum != current_checksum
|
157
|
-
puts "Development environment appears to be out-of-date."
|
158
|
-
puts "Environment checksum: #{deployed_checksum}"
|
159
|
-
puts "Current checksum: #{current_checksum}"
|
160
|
-
STDOUT.write('Update development environment? (y/n): ')
|
161
|
-
answer = STDIN.gets.strip.downcase
|
162
|
-
# return true here to prevent letting an out-of-date deployment
|
163
|
-
# stop us from running commands
|
164
|
-
return true unless answer =~ /ye?s?/
|
165
|
-
return DevSetup.new(environment).run
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
true
|
170
|
-
end
|
171
|
-
|
172
146
|
private
|
173
147
|
|
174
148
|
def get_first_pod
|
data/lib/kuby/version.rb
CHANGED
data/lib/kuby.rb
CHANGED
@@ -13,7 +13,6 @@ module Kuby
|
|
13
13
|
autoload :CLIBase, 'kuby/cli_base'
|
14
14
|
autoload :Commands, 'kuby/commands'
|
15
15
|
autoload :Definition, 'kuby/definition'
|
16
|
-
autoload :DevSetup, 'kuby/dev_setup'
|
17
16
|
autoload :Docker, 'kuby/docker'
|
18
17
|
autoload :Environment, 'kuby/environment'
|
19
18
|
autoload :Kubernetes, 'kuby/kubernetes'
|
@@ -21,7 +20,6 @@ module Kuby
|
|
21
20
|
autoload :Plugin, 'kuby/plugin'
|
22
21
|
autoload :PluginRegistry, 'kuby/plugin_registry'
|
23
22
|
autoload :Plugins, 'kuby/plugins'
|
24
|
-
autoload :RailsCommands, 'kuby/rails_commands'
|
25
23
|
autoload :Tasks, 'kuby/tasks'
|
26
24
|
autoload :TrailingHash, 'kuby/trailing_hash'
|
27
25
|
|
@@ -52,24 +50,6 @@ module Kuby
|
|
52
50
|
@definition = Definition.new(name.to_s)
|
53
51
|
@definition.instance_eval(&block)
|
54
52
|
|
55
|
-
# default development environment
|
56
|
-
@definition.environment(:development) do
|
57
|
-
kubernetes do
|
58
|
-
add_plugin(:rails_app) do
|
59
|
-
tls_enabled false
|
60
|
-
|
61
|
-
database do
|
62
|
-
if requires_credentials?
|
63
|
-
user(DEFAULT_DB_USER)
|
64
|
-
password(DEFAULT_DB_PASSWORD)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
provider :docker_desktop
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
53
|
@definition.environments.each do |_, env|
|
74
54
|
env.kubernetes.after_configuration
|
75
55
|
end
|
@@ -174,3 +154,5 @@ Kuby.register_package(:c_toolchain,
|
|
174
154
|
debian: 'build-essential',
|
175
155
|
alpine: 'build-base'
|
176
156
|
)
|
157
|
+
|
158
|
+
Kuby.register_package(:git, 'git')
|
data/spec/docker/spec_spec.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
# typed: false
|
2
2
|
require 'spec_helper'
|
3
|
-
require 'timecop'
|
4
3
|
|
5
4
|
describe Kuby::Docker::Spec do
|
6
5
|
let(:spec) { definition.environment.docker }
|
7
6
|
|
8
7
|
describe '#base_image' do
|
9
|
-
subject { spec.
|
8
|
+
subject { spec.image.dockerfile.to_s }
|
10
9
|
|
11
10
|
it 'uses the default base image for Debian' do
|
12
11
|
expect(subject).to include("FROM ruby:#{RUBY_VERSION}\n")
|
@@ -34,7 +33,7 @@ describe Kuby::Docker::Spec do
|
|
34
33
|
Kuby::Docker::SetupPhase::DEFAULT_WORKING_DIR
|
35
34
|
end
|
36
35
|
|
37
|
-
subject { spec.
|
36
|
+
subject { spec.image.dockerfile.to_s }
|
38
37
|
|
39
38
|
it 'uses the default working dir' do
|
40
39
|
expect(subject).to(
|
@@ -52,7 +51,7 @@ describe Kuby::Docker::Spec do
|
|
52
51
|
end
|
53
52
|
|
54
53
|
describe '#rails_env' do
|
55
|
-
subject { spec.
|
54
|
+
subject { spec.image.dockerfile.to_s }
|
56
55
|
|
57
56
|
it 'uses the name of the current Kuby environment' do
|
58
57
|
expect(subject).to include("ENV RAILS_ENV=#{spec.environment.name}\n")
|
@@ -73,7 +72,7 @@ describe Kuby::Docker::Spec do
|
|
73
72
|
end
|
74
73
|
|
75
74
|
describe '#bundler_version' do
|
76
|
-
subject { spec.
|
75
|
+
subject { spec.image.dockerfile.to_s }
|
77
76
|
|
78
77
|
it 'installs the current bundler version' do
|
79
78
|
expect(subject).to(
|
@@ -91,7 +90,7 @@ describe Kuby::Docker::Spec do
|
|
91
90
|
end
|
92
91
|
|
93
92
|
describe '#gemfile' do
|
94
|
-
subject { spec.
|
93
|
+
subject { spec.image.dockerfile.to_s }
|
95
94
|
|
96
95
|
it 'uses the default Gemfile' do
|
97
96
|
expect(subject).to include("COPY Gemfile .\n")
|
@@ -108,10 +107,22 @@ describe Kuby::Docker::Spec do
|
|
108
107
|
expect(subject).to match(/RUN bundle install .* --gemfile foo\/bar\/Gemfile/)
|
109
108
|
end
|
110
109
|
end
|
110
|
+
|
111
|
+
context 'when multiple gemfiles are specified' do
|
112
|
+
before { spec.bundler_phase.gemfiles('gemfiles/a.gemfile', 'gemfiles/b.gemfile') }
|
113
|
+
|
114
|
+
it 'uses all gemfiles including the default one' do
|
115
|
+
expect(subject).to include("COPY Gemfile .\n")
|
116
|
+
expect(subject).to include("COPY Gemfile.lock .\n")
|
117
|
+
expect(subject).to include("COPY gemfiles/a.gemfile gemfiles/a.gemfile\n")
|
118
|
+
expect(subject).to include("COPY gemfiles/b.gemfile gemfiles/b.gemfile\n")
|
119
|
+
expect(subject).to match(/RUN bundle install .* --gemfile Gemfile/)
|
120
|
+
end
|
121
|
+
end
|
111
122
|
end
|
112
123
|
|
113
124
|
describe '#package' do
|
114
|
-
subject { spec.
|
125
|
+
subject { spec.image.dockerfile.to_s }
|
115
126
|
|
116
127
|
it 'installs the given package' do
|
117
128
|
# configured in spec_helper.rb
|
@@ -122,7 +133,7 @@ describe Kuby::Docker::Spec do
|
|
122
133
|
end
|
123
134
|
|
124
135
|
describe '#files' do
|
125
|
-
subject { spec.
|
136
|
+
subject { spec.image.dockerfile.to_s }
|
126
137
|
|
127
138
|
it 'copies the current directory contents by default' do
|
128
139
|
expect(subject).to include("COPY ./ .\n")
|
@@ -142,7 +153,7 @@ describe Kuby::Docker::Spec do
|
|
142
153
|
Kuby::Docker::WebserverPhase::DEFAULT_PORT
|
143
154
|
end
|
144
155
|
|
145
|
-
subject { spec.
|
156
|
+
subject { spec.image.dockerfile.to_s }
|
146
157
|
|
147
158
|
it 'exposes the default port' do
|
148
159
|
expect(subject).to include("EXPOSE #{default_port}\n")
|
@@ -157,116 +168,8 @@ describe Kuby::Docker::Spec do
|
|
157
168
|
end
|
158
169
|
end
|
159
170
|
|
160
|
-
describe '#tag' do
|
161
|
-
let(:tag) { make_ts_tag(Time.now) }
|
162
|
-
|
163
|
-
subject { spec.tag }
|
164
|
-
|
165
|
-
context 'with no local or remote tags' do
|
166
|
-
it 'raises an error' do
|
167
|
-
expect { subject }.to raise_error(Kuby::Docker::MissingTagError)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
context 'with an available remote tag' do
|
172
|
-
before { docker_remote_client.tags << tag }
|
173
|
-
|
174
|
-
it { is_expected.to eq(tag) }
|
175
|
-
end
|
176
|
-
|
177
|
-
context 'with an available local tag' do
|
178
|
-
before do
|
179
|
-
docker_cli.build(
|
180
|
-
dockerfile: nil,
|
181
|
-
image_url: docker_image_url,
|
182
|
-
tags: [tag]
|
183
|
-
)
|
184
|
-
end
|
185
|
-
|
186
|
-
it { is_expected.to eq(tag) }
|
187
|
-
end
|
188
|
-
|
189
|
-
context 'with multiple remote tags' do
|
190
|
-
let(:time) { Time.now }
|
191
|
-
|
192
|
-
before do
|
193
|
-
docker_remote_client.tags +=
|
194
|
-
[time - 5, time + 10, time - 10, time + 15].map do |t|
|
195
|
-
make_ts_tag(t)
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
it { is_expected.to eq(make_ts_tag(time + 15)) }
|
200
|
-
end
|
201
|
-
|
202
|
-
context 'with multiple local and remote tags' do
|
203
|
-
let(:time) { Time.now }
|
204
|
-
|
205
|
-
before do
|
206
|
-
docker_remote_client.tags +=
|
207
|
-
[time - 5, time + 10, time - 10, time + 15].map do |t|
|
208
|
-
make_ts_tag(t)
|
209
|
-
end
|
210
|
-
|
211
|
-
docker_cli.build(
|
212
|
-
dockerfile: nil,
|
213
|
-
image_url: docker_image_url,
|
214
|
-
tags: [time - 3, time + 6, time - 6, time + 18].map do |t|
|
215
|
-
make_ts_tag(t)
|
216
|
-
end
|
217
|
-
)
|
218
|
-
end
|
219
|
-
|
220
|
-
it { is_expected.to eq(make_ts_tag(time + 18)) }
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
describe '#previous_tag' do
|
225
|
-
let(:time) { Time.now }
|
226
|
-
let(:current_tag) { make_ts_tag(time) }
|
227
|
-
|
228
|
-
before do
|
229
|
-
docker_remote_client.tags << current_tag
|
230
|
-
docker_cli.build(
|
231
|
-
dockerfile: nil,
|
232
|
-
image_url: docker_image_url,
|
233
|
-
tags: [current_tag]
|
234
|
-
)
|
235
|
-
end
|
236
|
-
|
237
|
-
subject { spec.previous_tag(current_tag) }
|
238
|
-
|
239
|
-
context 'with no previous local or remote tag' do
|
240
|
-
it 'raises an error' do
|
241
|
-
expect { subject }.to raise_error(Kuby::Docker::MissingTagError)
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
context 'with an available previous remote tag' do
|
246
|
-
let(:previous_tag) { make_ts_tag(time - 5) }
|
247
|
-
|
248
|
-
before { docker_remote_client.tags << previous_tag }
|
249
|
-
|
250
|
-
it { is_expected.to eq(previous_tag) }
|
251
|
-
end
|
252
|
-
|
253
|
-
context 'with an available previous local tag' do
|
254
|
-
let(:previous_tag) { make_ts_tag(time - 5) }
|
255
|
-
|
256
|
-
before do
|
257
|
-
docker_cli.build(
|
258
|
-
dockerfile: nil,
|
259
|
-
image_url: docker_image_url,
|
260
|
-
tags: [previous_tag]
|
261
|
-
)
|
262
|
-
end
|
263
|
-
|
264
|
-
it { is_expected.to eq(previous_tag) }
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
171
|
describe '#insert' do
|
269
|
-
subject { spec.
|
172
|
+
subject { spec.image.dockerfile.to_s }
|
270
173
|
|
271
174
|
context 'with a custom class-based build phase' do
|
272
175
|
before do
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Kuby::Docker::TimestampedImage do
|
5
|
+
let(:dockerfile) { Kuby::Docker::Dockerfile.new }
|
6
|
+
let(:image_url) { docker_image_url }
|
7
|
+
let(:credentials) do
|
8
|
+
Kuby::Docker::Credentials.new do
|
9
|
+
username 'foo'
|
10
|
+
password 'bar'
|
11
|
+
email 'foo@bar.com'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
let(:image) { described_class.new(dockerfile, image_url, credentials) }
|
15
|
+
|
16
|
+
describe '#current_version' do
|
17
|
+
let(:tag) { make_ts_tag(Time.now) }
|
18
|
+
|
19
|
+
subject { image.current_version&.main_tag }
|
20
|
+
|
21
|
+
context 'with no local or remote tags' do
|
22
|
+
it 'raises an error' do
|
23
|
+
expect { subject }.to raise_error(Kuby::Docker::MissingTagError)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with an available remote tag' do
|
28
|
+
before { docker_remote_client.tags << tag }
|
29
|
+
|
30
|
+
it { is_expected.to eq(tag) }
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with an available local tag' do
|
34
|
+
before do
|
35
|
+
docker_cli.build(
|
36
|
+
dockerfile: nil,
|
37
|
+
image_url: docker_image_url,
|
38
|
+
tags: [tag]
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
it { is_expected.to eq(tag) }
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with multiple remote tags' do
|
46
|
+
let(:time) { Time.now }
|
47
|
+
|
48
|
+
before do
|
49
|
+
docker_remote_client.tags +=
|
50
|
+
[time - 5, time + 10, time - 10, time + 15].map do |t|
|
51
|
+
make_ts_tag(t)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it { is_expected.to eq(make_ts_tag(time + 15)) }
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'with multiple local and remote tags' do
|
59
|
+
let(:time) { Time.now }
|
60
|
+
|
61
|
+
before do
|
62
|
+
docker_remote_client.tags +=
|
63
|
+
[time - 5, time + 10, time - 10, time + 15].map do |t|
|
64
|
+
make_ts_tag(t)
|
65
|
+
end
|
66
|
+
|
67
|
+
docker_cli.build(
|
68
|
+
dockerfile: nil,
|
69
|
+
image_url: docker_image_url,
|
70
|
+
tags: [time - 3, time + 6, time - 6, time + 18].map do |t|
|
71
|
+
make_ts_tag(t)
|
72
|
+
end
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
it { is_expected.to eq(make_ts_tag(time + 18)) }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '#previous_version' do
|
81
|
+
let(:time) { Time.now }
|
82
|
+
let(:current_tag) { make_ts_tag(time) }
|
83
|
+
|
84
|
+
before do
|
85
|
+
docker_remote_client.tags << current_tag
|
86
|
+
docker_cli.build(
|
87
|
+
dockerfile: nil,
|
88
|
+
image_url: docker_image_url,
|
89
|
+
tags: [current_tag]
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
subject { image.previous_version(current_tag)&.main_tag }
|
94
|
+
|
95
|
+
context 'with no previous local or remote tag' do
|
96
|
+
it 'raises an error' do
|
97
|
+
expect { subject }.to raise_error(Kuby::Docker::MissingTagError)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'with an available previous remote tag' do
|
102
|
+
let(:previous_tag) { make_ts_tag(time - 5) }
|
103
|
+
|
104
|
+
before { docker_remote_client.tags << previous_tag }
|
105
|
+
|
106
|
+
it { is_expected.to eq(previous_tag) }
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'with an available previous local tag' do
|
110
|
+
let(:previous_tag) { make_ts_tag(time - 5) }
|
111
|
+
|
112
|
+
before do
|
113
|
+
docker_cli.build(
|
114
|
+
dockerfile: nil,
|
115
|
+
image_url: docker_image_url,
|
116
|
+
tags: [previous_tag]
|
117
|
+
)
|
118
|
+
end
|
119
|
+
|
120
|
+
it { is_expected.to eq(previous_tag) }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -71,24 +71,23 @@ module SpecHelpers
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
74
|
-
|
75
|
-
environment(:development) do
|
76
|
-
kubernetes do
|
77
|
-
configure_plugin(:rails_app) do
|
78
|
-
root File.expand_path(File.join(*%w(. dummy)), __dir__)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
74
|
end
|
83
75
|
|
84
76
|
docker = definition.environment.docker
|
85
77
|
|
86
|
-
docker.instance_variable_set(:@remote_client, docker_remote_client)
|
87
|
-
docker.instance_variable_set(:@cli, docker_cli)
|
88
|
-
|
89
78
|
definition
|
90
79
|
end
|
91
80
|
|
81
|
+
before do
|
82
|
+
allow_any_instance_of(Kuby::Docker::TimestampedImage).to(
|
83
|
+
receive(:remote_client).and_return(docker_remote_client)
|
84
|
+
)
|
85
|
+
|
86
|
+
allow_any_instance_of(Kuby::Docker::Image).to(
|
87
|
+
receive(:docker_cli).and_return(docker_cli)
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
92
91
|
def make_ts_tag(time)
|
93
92
|
Kuby::Docker::TimestampTag.new(time).to_s
|
94
93
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kuby-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Dutro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.6'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.6'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: gli
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -219,25 +219,24 @@ files:
|
|
219
219
|
- lib/kuby/cli_base.rb
|
220
220
|
- lib/kuby/commands.rb
|
221
221
|
- lib/kuby/definition.rb
|
222
|
-
- lib/kuby/dev_setup.rb
|
223
222
|
- lib/kuby/docker.rb
|
224
223
|
- lib/kuby/docker/alpine.rb
|
224
|
+
- lib/kuby/docker/app_image.rb
|
225
225
|
- lib/kuby/docker/assets_phase.rb
|
226
226
|
- lib/kuby/docker/bundler_phase.rb
|
227
227
|
- lib/kuby/docker/cli.rb
|
228
228
|
- lib/kuby/docker/copy_phase.rb
|
229
229
|
- lib/kuby/docker/credentials.rb
|
230
230
|
- lib/kuby/docker/debian.rb
|
231
|
-
- lib/kuby/docker/dev_spec.rb
|
232
231
|
- lib/kuby/docker/distro.rb
|
233
232
|
- lib/kuby/docker/docker_uri.rb
|
234
233
|
- lib/kuby/docker/dockerfile.rb
|
235
234
|
- lib/kuby/docker/errors.rb
|
235
|
+
- lib/kuby/docker/image.rb
|
236
236
|
- lib/kuby/docker/inline_layer.rb
|
237
237
|
- lib/kuby/docker/layer.rb
|
238
238
|
- lib/kuby/docker/layer_stack.rb
|
239
239
|
- lib/kuby/docker/local_tags.rb
|
240
|
-
- lib/kuby/docker/metadata.rb
|
241
240
|
- lib/kuby/docker/package_list.rb
|
242
241
|
- lib/kuby/docker/package_phase.rb
|
243
242
|
- lib/kuby/docker/packages.rb
|
@@ -249,8 +248,8 @@ files:
|
|
249
248
|
- lib/kuby/docker/remote_tags.rb
|
250
249
|
- lib/kuby/docker/setup_phase.rb
|
251
250
|
- lib/kuby/docker/spec.rb
|
252
|
-
- lib/kuby/docker/tags.rb
|
253
251
|
- lib/kuby/docker/timestamp_tag.rb
|
252
|
+
- lib/kuby/docker/timestamped_image.rb
|
254
253
|
- lib/kuby/docker/webserver_phase.rb
|
255
254
|
- lib/kuby/docker/yarn_phase.rb
|
256
255
|
- lib/kuby/environment.rb
|
@@ -274,6 +273,7 @@ files:
|
|
274
273
|
- lib/kuby/plugins/rails_app.rb
|
275
274
|
- lib/kuby/plugins/rails_app/asset_copy_task.rb
|
276
275
|
- lib/kuby/plugins/rails_app/assets.rb
|
276
|
+
- lib/kuby/plugins/rails_app/assets_image.rb
|
277
277
|
- lib/kuby/plugins/rails_app/database.rb
|
278
278
|
- lib/kuby/plugins/rails_app/generators/kuby.rb
|
279
279
|
- lib/kuby/plugins/rails_app/mysql.rb
|
@@ -282,16 +282,14 @@ files:
|
|
282
282
|
- lib/kuby/plugins/rails_app/rewrite_db_config.rb
|
283
283
|
- lib/kuby/plugins/rails_app/sqlite.rb
|
284
284
|
- lib/kuby/plugins/rails_app/tasks.rake
|
285
|
-
- lib/kuby/rails_commands.rb
|
286
285
|
- lib/kuby/railtie.rb
|
287
286
|
- lib/kuby/tasks.rb
|
288
287
|
- lib/kuby/trailing_hash.rb
|
289
288
|
- lib/kuby/version.rb
|
290
|
-
- spec/docker/metadata_spec.rb
|
291
289
|
- spec/docker/spec_spec.rb
|
292
290
|
- spec/docker/timestamp_tag_spec.rb
|
291
|
+
- spec/docker/timestamped_image_spec.rb
|
293
292
|
- spec/dummy/Gemfile
|
294
|
-
- spec/dummy/Gemfile.lock
|
295
293
|
- spec/dummy/README.md
|
296
294
|
- spec/dummy/Rakefile
|
297
295
|
- spec/dummy/app/assets/config/manifest.js
|
@@ -335,7 +333,6 @@ files:
|
|
335
333
|
- spec/dummy/config/initializers/mime_types.rb
|
336
334
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
337
335
|
- spec/dummy/config/locales/en.yml
|
338
|
-
- spec/dummy/config/master.key
|
339
336
|
- spec/dummy/config/puma.rb
|
340
337
|
- spec/dummy/config/routes.rb
|
341
338
|
- spec/dummy/config/spring.rb
|
@@ -352,7 +349,6 @@ files:
|
|
352
349
|
- spec/dummy/test/application_system_test_case.rb
|
353
350
|
- spec/dummy/test/channels/application_cable/connection_test.rb
|
354
351
|
- spec/dummy/test/test_helper.rb
|
355
|
-
- spec/dummy/tmp/cache/bootsnap-load-path-cache
|
356
352
|
- spec/spec_helper.rb
|
357
353
|
- spec/support/docker/fake_cli.rb
|
358
354
|
- spec/support/docker/remote/fake_client.rb
|
@@ -375,7 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
375
371
|
- !ruby/object:Gem::Version
|
376
372
|
version: '0'
|
377
373
|
requirements: []
|
378
|
-
rubygems_version: 3.
|
374
|
+
rubygems_version: 3.2.22
|
379
375
|
signing_key:
|
380
376
|
specification_version: 4
|
381
377
|
summary: Deploy your Rails app onto Kubernetes the easy way.
|