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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/Gemfile +1 -2
- data/kuby-core.gemspec +1 -1
- data/lib/kuby.rb +2 -20
- data/lib/kuby/commands.rb +13 -67
- data/lib/kuby/docker.rb +27 -25
- data/lib/kuby/docker/alpine.rb +2 -1
- data/lib/kuby/docker/app_image.rb +19 -0
- data/lib/kuby/docker/cli.rb +4 -12
- data/lib/kuby/docker/docker_uri.rb +18 -7
- data/lib/kuby/docker/errors.rb +1 -19
- data/lib/kuby/docker/image.rb +115 -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/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.rb +1 -0
- data/lib/kuby/plugins/rails_app/assets.rb +60 -70
- data/lib/kuby/plugins/rails_app/assets_image.rb +55 -0
- data/lib/kuby/plugins/rails_app/plugin.rb +53 -236
- data/lib/kuby/tasks.rb +30 -69
- data/lib/kuby/version.rb +1 -1
- data/spec/docker/spec_spec.rb +9 -118
- data/spec/docker/timestamped_image_spec.rb +123 -0
- data/spec/spec_helper.rb +10 -11
- metadata +9 -10
- 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/lib/kuby/docker/metadata.rb
DELETED
@@ -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
|
data/lib/kuby/docker/tags.rb
DELETED
@@ -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
|
data/lib/kuby/rails_commands.rb
DELETED
@@ -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
|