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
@@ -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