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