kuby-core 0.11.12 → 0.12.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/Gemfile +2 -2
  4. data/bin/kuby +2 -0
  5. data/kuby-core.gemspec +2 -2
  6. data/lib/kuby.rb +3 -20
  7. data/lib/kuby/basic_logger.rb +1 -1
  8. data/lib/kuby/cli_base.rb +9 -4
  9. data/lib/kuby/commands.rb +13 -67
  10. data/lib/kuby/docker.rb +27 -25
  11. data/lib/kuby/docker/alpine.rb +2 -1
  12. data/lib/kuby/docker/app_image.rb +19 -0
  13. data/lib/kuby/docker/bundler_phase.rb +0 -4
  14. data/lib/kuby/docker/cli.rb +4 -12
  15. data/lib/kuby/docker/docker_uri.rb +18 -7
  16. data/lib/kuby/docker/errors.rb +1 -19
  17. data/lib/kuby/docker/image.rb +115 -0
  18. data/lib/kuby/docker/layer.rb +0 -7
  19. data/lib/kuby/docker/local_tags.rb +9 -10
  20. data/lib/kuby/docker/package_phase.rb +0 -5
  21. data/lib/kuby/docker/packages.rb +1 -0
  22. data/lib/kuby/docker/remote_tags.rb +10 -5
  23. data/lib/kuby/docker/setup_phase.rb +17 -9
  24. data/lib/kuby/docker/spec.rb +29 -62
  25. data/lib/kuby/docker/timestamp_tag.rb +8 -1
  26. data/lib/kuby/docker/timestamped_image.rb +113 -0
  27. data/lib/kuby/docker/yarn_phase.rb +2 -2
  28. data/lib/kuby/environment.rb +1 -10
  29. data/lib/kuby/kubernetes.rb +1 -0
  30. data/lib/kuby/kubernetes/bare_metal_provider.rb +53 -0
  31. data/lib/kuby/kubernetes/deployer.rb +2 -1
  32. data/lib/kuby/kubernetes/docker_desktop_provider.rb +0 -15
  33. data/lib/kuby/kubernetes/spec.rb +21 -17
  34. data/lib/kuby/plugin.rb +2 -2
  35. data/lib/kuby/plugins/rails_app.rb +1 -0
  36. data/lib/kuby/plugins/rails_app/assets.rb +60 -70
  37. data/lib/kuby/plugins/rails_app/assets_image.rb +55 -0
  38. data/lib/kuby/plugins/rails_app/plugin.rb +54 -213
  39. data/lib/kuby/tasks.rb +30 -69
  40. data/lib/kuby/version.rb +1 -1
  41. data/spec/docker/spec_spec.rb +9 -118
  42. data/spec/docker/timestamped_image_spec.rb +123 -0
  43. data/spec/spec_helper.rb +10 -11
  44. metadata +10 -10
  45. data/lib/kuby/dev_setup.rb +0 -346
  46. data/lib/kuby/docker/dev_spec.rb +0 -202
  47. data/lib/kuby/docker/metadata.rb +0 -85
  48. data/lib/kuby/docker/tags.rb +0 -92
  49. data/lib/kuby/rails_commands.rb +0 -84
  50. data/spec/docker/metadata_spec.rb +0 -73
@@ -1,85 +0,0 @@
1
- # typed: strict
2
-
3
- require 'uri'
4
-
5
- module Kuby
6
- module Docker
7
- class Metadata
8
- extend T::Sig
9
-
10
- DEFAULT_DISTRO = :debian
11
- LATEST_TAG = T.let('latest'.freeze, String)
12
-
13
- sig { params(image_url: String).void }
14
- attr_writer :image_url
15
-
16
- sig { returns(Environment) }
17
- attr_reader :environment
18
-
19
- sig { params(environment: Environment).void }
20
- def initialize(environment)
21
- @environment = environment
22
- @tags = T.let([], T::Array[String])
23
-
24
- @image_url = T.let(@image_url, T.nilable(String))
25
- @image_host = T.let(@image_host, T.nilable(String))
26
- @image_hostname = T.let(@image_hostname, T.nilable(String))
27
- @image_repo = T.let(@image_repo, T.nilable(String))
28
- @distro = T.let(@distro, T.nilable(Symbol))
29
- @full_image_uri = T.let(@full_image_uri, T.nilable(DockerURI))
30
- @default_image_url = T.let(@default_image_url, T.nilable(String))
31
- @default_tags = T.let(@default_tags, T.nilable(T::Array[String]))
32
- end
33
-
34
- sig { returns(String) }
35
- def image_url
36
- @image_url || default_image_url
37
- end
38
-
39
- sig { returns(String) }
40
- def image_host
41
- @image_host ||= full_image_uri.host
42
- end
43
-
44
- sig { returns(String) }
45
- def image_repo
46
- @image_repo ||= full_image_uri.path
47
- end
48
-
49
- sig { returns(T::Array[String]) }
50
- def tags
51
- @tags.empty? ? default_tags : @tags
52
- end
53
-
54
- sig { returns(Symbol) }
55
- def distro
56
- @distro || DEFAULT_DISTRO
57
- end
58
-
59
- sig { params(distro_name: Symbol).void }
60
- def distro=(distro_name)
61
- @distro = distro_name
62
- end
63
-
64
- private
65
-
66
- sig { returns(DockerURI) }
67
- def full_image_uri
68
- @full_image_uri ||= DockerURI.parse(image_url)
69
- end
70
-
71
- sig { returns(String) }
72
- def default_image_url
73
- # assuming dockerhub by not specifying full url
74
- @default_image_url ||= environment.app_name.downcase
75
- end
76
-
77
- sig { returns(T::Array[String]) }
78
- def default_tags
79
- @default_tags ||= [
80
- TimestampTag.new(Time.now).to_s, LATEST_TAG
81
- ]
82
- end
83
- end
84
- end
85
- end
@@ -1,92 +0,0 @@
1
- # typed: strict
2
-
3
- module Kuby
4
- module Docker
5
- class Tags
6
- extend T::Sig
7
-
8
- LATEST = Metadata::LATEST_TAG
9
-
10
- sig { returns(CLI) }
11
- attr_reader :cli
12
-
13
- sig { returns(::Docker::Remote::Client) }
14
- attr_reader :remote_client
15
-
16
- sig { returns Metadata }
17
- attr_reader :metadata
18
-
19
- sig {
20
- params(
21
- cli: CLI,
22
- remote_client: ::Docker::Remote::Client,
23
- metadata: Metadata
24
- )
25
- .void
26
- }
27
- def initialize(cli, remote_client, metadata)
28
- @cli = cli
29
- @remote_client = remote_client
30
- @metadata = metadata
31
-
32
- @local = T.let(@local, T.nilable(LocalTags))
33
- @remote = T.let(@remote, T.nilable(RemoteTags))
34
- @latest_timestamp_tag = T.let(@latest_timestamp_tag, T.nilable(TimestampTag))
35
- end
36
-
37
- sig { returns(T::Array[String]) }
38
- def tags
39
- (local.tags + remote.tags).uniq
40
- end
41
-
42
- sig { returns(T::Array[String]) }
43
- def latest_tags
44
- (local.latest_tags + remote.latest_tags).uniq
45
- end
46
-
47
- sig {
48
- params(current_tag: String).returns(T.nilable(TimestampTag))
49
- }
50
- def previous_timestamp_tag(current_tag)
51
- current_tag = TimestampTag.try_parse(current_tag)
52
- return nil unless current_tag
53
-
54
- all_tags = timestamp_tags.sort
55
-
56
- idx = all_tags.index do |tag|
57
- tag.time == current_tag.time
58
- end
59
-
60
- idx ||= 0
61
- return nil unless idx > 0
62
-
63
- all_tags[idx - 1]
64
- end
65
-
66
- sig { returns(T::Array[TimestampTag]) }
67
- def timestamp_tags
68
- (local.timestamp_tags + remote.timestamp_tags).uniq
69
- end
70
-
71
- sig { returns(T.nilable(TimestampTag)) }
72
- def latest_timestamp_tag
73
- @latest_timestamp_tag ||= timestamp_tags.sort.last
74
- end
75
-
76
- sig { returns(T.self_type) }
77
- def all
78
- self
79
- end
80
-
81
- sig { returns(LocalTags) }
82
- def local
83
- @local ||= LocalTags.new(cli, metadata)
84
- end
85
-
86
- sig { returns(RemoteTags) }
87
- def remote
88
- @remote ||= RemoteTags.new(remote_client, metadata)
89
- end
90
- end
91
- end
92
- end
@@ -1,84 +0,0 @@
1
- # typed: true
2
- module Kuby
3
- class Args
4
- attr_reader :args, :flag_aliases
5
-
6
- def initialize(args, flag_aliases = [])
7
- @args = args
8
- @flag_aliases = flag_aliases
9
- end
10
-
11
- def [](flag)
12
- idx = find_arg_index(flag)
13
- idx ? args[idx] : nil
14
- end
15
-
16
- def []=(flag, new_value)
17
- idx = find_arg_index(flag)
18
-
19
- if idx
20
- args[idx] = new_value
21
- else
22
- @args += [flag, new_value]
23
- end
24
- end
25
-
26
- private
27
-
28
- def find_arg_index(flag)
29
- idx = args.find_index do |arg|
30
- flag_aliases.any? { |fas| fas.include?(arg) && fas.include?(flag) }
31
- end
32
-
33
- idx ? idx + 1 : nil
34
- end
35
- end
36
-
37
- class RailsCommands
38
- PREFIX = %w(bundle exec).freeze
39
- SERVER_ARG_ALIASES = [['--binding', '-b'], ['-p', '--port']].freeze
40
-
41
- class << self
42
- def run(args = ARGV)
43
- command = args[0]
44
-
45
- if command == 'rails'
46
- subcommand = args[1]
47
- arglist = nil
48
-
49
- case subcommand
50
- when 'server', 's'
51
- arglist = Args.new([*PREFIX, *args], SERVER_ARG_ALIASES)
52
- arglist['-b'] ||= '0.0.0.0'
53
- arglist['-p'] ||= '3000'
54
- end
55
- end
56
-
57
- setup
58
-
59
- arglist ||= Args.new([*PREFIX, *args])
60
- tasks = Kuby::Tasks.new(environment)
61
- tasks.remote_exec(arglist.args)
62
- end
63
-
64
- private
65
-
66
- def setup
67
- require 'kuby'
68
- Kuby.load!
69
- end
70
-
71
- def kubernetes_cli
72
- kubernetes.provider.kubernetes.cli
73
- end
74
-
75
- def kubernetes
76
- environment.kubernetes
77
- end
78
-
79
- def environment
80
- Kuby.definition.environment
81
- end
82
- end
83
- end
84
- end
@@ -1,73 +0,0 @@
1
- # typed: false
2
- require 'spec_helper'
3
- require 'timecop'
4
-
5
- describe Kuby::Docker::Metadata do
6
- let(:metadata) { definition.environment.docker.metadata }
7
-
8
- describe '#image_url' do
9
- subject { metadata.image_url }
10
-
11
- it { is_expected.to eq(docker_image_url) }
12
-
13
- context 'when no image URL is configured' do
14
- let(:docker_image_url) { nil }
15
- it { is_expected.to eq(definition.app_name) }
16
- end
17
- end
18
-
19
- describe '#image_host' do
20
- subject { metadata.image_host }
21
-
22
- it { is_expected.to eq(Kuby::Docker::DockerURI::DEFAULT_REGISTRY_HOST) }
23
-
24
- context 'when the image URL contains an explicit host' do
25
- let(:docker_image_url) { 'registry.foo.com/foo/testapp' }
26
-
27
- it { is_expected.to eq('registry.foo.com') }
28
- end
29
-
30
- context 'when the image URL contains an explicit host' do
31
- let(:docker_image_url) { 'http://registry.foo.com/foo/testapp' }
32
-
33
- it { is_expected.to eq('registry.foo.com') }
34
- end
35
- end
36
-
37
- describe '#image_repo' do
38
- subject { metadata.image_repo }
39
-
40
- it { is_expected.to eq('foo/testapp') }
41
-
42
- context 'when the image URL contains an explicit host' do
43
- let(:docker_image_url) { 'registry.foo.com/foo/testapp' }
44
-
45
- it { is_expected.to eq('foo/testapp') }
46
- end
47
- end
48
-
49
- describe '#tags' do
50
- subject { metadata.tags }
51
-
52
- it 'specifies the current timestamp tag and the default tag' do
53
- Timecop.freeze do
54
- expect(subject).to eq([
55
- Time.now.strftime('%Y%m%d%H%M%S'),
56
- Kuby::Docker::Metadata::LATEST_TAG
57
- ])
58
- end
59
- end
60
- end
61
-
62
- describe '#distro' do
63
- subject { metadata.distro }
64
-
65
- it { is_expected.to eq(Kuby::Docker::Metadata::DEFAULT_DISTRO) }
66
-
67
- context 'with a distro set manually' do
68
- before { metadata.distro = :alpine }
69
-
70
- it { is_expected.to eq(:alpine) }
71
- end
72
- end
73
- end