kuby-core 0.11.16 → 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 (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
@@ -1,90 +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}:#{full_image_uri.port}"
42
- end
43
-
44
- sig { returns(String) }
45
- def image_hostname
46
- @image_hostname ||= full_image_uri.host
47
- end
48
-
49
- sig { returns(String) }
50
- def image_repo
51
- @image_repo ||= full_image_uri.path
52
- end
53
-
54
- sig { returns(T::Array[String]) }
55
- def tags
56
- @tags.empty? ? default_tags : @tags
57
- end
58
-
59
- sig { returns(Symbol) }
60
- def distro
61
- @distro || DEFAULT_DISTRO
62
- end
63
-
64
- sig { params(distro_name: Symbol).void }
65
- def distro=(distro_name)
66
- @distro = distro_name
67
- end
68
-
69
- private
70
-
71
- sig { returns(DockerURI) }
72
- def full_image_uri
73
- @full_image_uri ||= DockerURI.parse(image_url)
74
- end
75
-
76
- sig { returns(String) }
77
- def default_image_url
78
- # assuming dockerhub by not specifying full url
79
- @default_image_url ||= environment.app_name.downcase
80
- end
81
-
82
- sig { returns(T::Array[String]) }
83
- def default_tags
84
- @default_tags ||= [
85
- TimestampTag.new(Time.now).to_s, LATEST_TAG
86
- ]
87
- end
88
- end
89
- end
90
- 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}:443") }
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:443') }
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:443') }
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