kuby-core 0.11.16 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/Gemfile +1 -2
  4. data/kuby-core.gemspec +1 -1
  5. data/lib/kuby.rb +2 -20
  6. data/lib/kuby/commands.rb +13 -67
  7. data/lib/kuby/docker.rb +27 -25
  8. data/lib/kuby/docker/alpine.rb +2 -1
  9. data/lib/kuby/docker/app_image.rb +19 -0
  10. data/lib/kuby/docker/cli.rb +4 -12
  11. data/lib/kuby/docker/docker_uri.rb +18 -7
  12. data/lib/kuby/docker/errors.rb +1 -19
  13. data/lib/kuby/docker/image.rb +115 -0
  14. data/lib/kuby/docker/layer.rb +0 -7
  15. data/lib/kuby/docker/local_tags.rb +9 -10
  16. data/lib/kuby/docker/package_phase.rb +0 -5
  17. data/lib/kuby/docker/packages.rb +1 -0
  18. data/lib/kuby/docker/remote_tags.rb +10 -5
  19. data/lib/kuby/docker/setup_phase.rb +17 -9
  20. data/lib/kuby/docker/spec.rb +29 -62
  21. data/lib/kuby/docker/timestamp_tag.rb +8 -1
  22. data/lib/kuby/docker/timestamped_image.rb +113 -0
  23. data/lib/kuby/environment.rb +1 -10
  24. data/lib/kuby/kubernetes/bare_metal_provider.rb +16 -4
  25. data/lib/kuby/kubernetes/deployer.rb +1 -1
  26. data/lib/kuby/kubernetes/docker_desktop_provider.rb +0 -15
  27. data/lib/kuby/kubernetes/spec.rb +21 -17
  28. data/lib/kuby/plugin.rb +2 -2
  29. data/lib/kuby/plugins/rails_app.rb +1 -0
  30. data/lib/kuby/plugins/rails_app/assets.rb +60 -70
  31. data/lib/kuby/plugins/rails_app/assets_image.rb +55 -0
  32. data/lib/kuby/plugins/rails_app/plugin.rb +53 -236
  33. data/lib/kuby/tasks.rb +30 -69
  34. data/lib/kuby/version.rb +1 -1
  35. data/spec/docker/spec_spec.rb +9 -118
  36. data/spec/docker/timestamped_image_spec.rb +123 -0
  37. data/spec/spec_helper.rb +10 -11
  38. metadata +9 -10
  39. data/lib/kuby/dev_setup.rb +0 -346
  40. data/lib/kuby/docker/dev_spec.rb +0 -202
  41. data/lib/kuby/docker/metadata.rb +0 -90
  42. data/lib/kuby/docker/tags.rb +0 -92
  43. data/lib/kuby/rails_commands.rb +0 -84
  44. data/spec/docker/metadata_spec.rb +0 -73
data/lib/kuby/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # typed: true
2
2
 
3
3
  module Kuby
4
- VERSION = '0.11.16'.freeze
4
+ VERSION = '0.12.0'.freeze
5
5
  end
@@ -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.to_dockerfile.to_s }
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.to_dockerfile.to_s }
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.to_dockerfile.to_s }
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.to_dockerfile.to_s }
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.to_dockerfile.to_s }
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")
@@ -111,7 +110,7 @@ describe Kuby::Docker::Spec do
111
110
  end
112
111
 
113
112
  describe '#package' do
114
- subject { spec.to_dockerfile.to_s }
113
+ subject { spec.image.dockerfile.to_s }
115
114
 
116
115
  it 'installs the given package' do
117
116
  # configured in spec_helper.rb
@@ -122,7 +121,7 @@ describe Kuby::Docker::Spec do
122
121
  end
123
122
 
124
123
  describe '#files' do
125
- subject { spec.to_dockerfile.to_s }
124
+ subject { spec.image.dockerfile.to_s }
126
125
 
127
126
  it 'copies the current directory contents by default' do
128
127
  expect(subject).to include("COPY ./ .\n")
@@ -142,7 +141,7 @@ describe Kuby::Docker::Spec do
142
141
  Kuby::Docker::WebserverPhase::DEFAULT_PORT
143
142
  end
144
143
 
145
- subject { spec.to_dockerfile.to_s }
144
+ subject { spec.image.dockerfile.to_s }
146
145
 
147
146
  it 'exposes the default port' do
148
147
  expect(subject).to include("EXPOSE #{default_port}\n")
@@ -157,116 +156,8 @@ describe Kuby::Docker::Spec do
157
156
  end
158
157
  end
159
158
 
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
159
  describe '#insert' do
269
- subject { spec.to_dockerfile.to_s }
160
+ subject { spec.image.dockerfile.to_s }
270
161
 
271
162
  context 'with a custom class-based build phase' do
272
163
  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.11.16
4
+ version: 0.12.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-05-04 00:00:00.000000000 Z
11
+ date: 2021-06-07 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.5'
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.5'
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,14 +282,13 @@ 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
293
  - spec/dummy/Gemfile.lock
295
294
  - spec/dummy/README.md