kuby-core 0.11.11 → 0.11.16
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 +17 -0
- data/Gemfile +2 -1
- data/bin/kuby +2 -0
- data/kuby-core.gemspec +2 -2
- data/lib/kuby.rb +1 -0
- data/lib/kuby/basic_logger.rb +1 -1
- data/lib/kuby/cli_base.rb +9 -4
- data/lib/kuby/docker.rb +1 -0
- data/lib/kuby/docker/bundler_phase.rb +0 -4
- data/lib/kuby/docker/docker_uri.rb +34 -0
- data/lib/kuby/docker/metadata.rb +6 -24
- data/lib/kuby/docker/yarn_phase.rb +2 -2
- data/lib/kuby/kubernetes.rb +1 -0
- data/lib/kuby/kubernetes/bare_metal_provider.rb +41 -0
- data/lib/kuby/kubernetes/deployer.rb +1 -0
- data/lib/kuby/kubernetes/spec.rb +1 -1
- data/lib/kuby/plugins/rails_app/plugin.rb +24 -0
- data/lib/kuby/tasks.rb +4 -4
- data/lib/kuby/version.rb +1 -1
- data/spec/docker/metadata_spec.rb +4 -16
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01cc5428a8bc4bfc44143f4aa2c2e949405d3c7231831da50f33efa5a314fc29
|
4
|
+
data.tar.gz: c4e440506c9ad072449f3382bcfa7dd1f80c757e64426b5c49f1e20540c57ae8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5db95c1958618d58354ba4c87411a0cd52894ede6ba0fbd622479e66e327397967314979c7496806577115d6b22571582e17f76c720a8472c9568cb009682555
|
7
|
+
data.tar.gz: 2c1c1bd58fcbc7d29380e5e2ef2cf71b68f7073dbff26ca5d73333734b326dccc42243a559b3272502b4a6628db0c7513ea9b6586b5475e44108ba4a490734f5
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 0.11.16
|
2
|
+
* Fix yarn phase
|
3
|
+
- Apparently you have to copy at least one file, TIL.
|
4
|
+
|
5
|
+
## 0.11.15
|
6
|
+
* Copy over .npmrc and .yarnrc before running yarn install.
|
7
|
+
|
8
|
+
## 0.11.14
|
9
|
+
* Don't include port in image host for registry secrets (no idea why)
|
10
|
+
|
11
|
+
## 0.11.13
|
12
|
+
* Include port in image host.
|
13
|
+
|
14
|
+
## 0.11.12
|
15
|
+
* Revamp Docker URL parsing
|
16
|
+
- Docker URLs shouldn't have a scheme.
|
17
|
+
|
1
18
|
## 0.11.11
|
2
19
|
* Add support for a Docker registry running on localhost.
|
3
20
|
- Correctly parse and handle URLs with specific ports.
|
data/Gemfile
CHANGED
data/bin/kuby
CHANGED
data/kuby-core.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
$:.unshift File.
|
1
|
+
$:.unshift File.expand_path('lib', __dir__)
|
2
2
|
require 'kuby/version'
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.platform = Gem::Platform::RUBY
|
14
14
|
|
15
15
|
s.add_dependency 'colorize', '~> 0.8'
|
16
|
-
s.add_dependency 'docker-remote', '~> 0.
|
16
|
+
s.add_dependency 'docker-remote', '~> 0.5'
|
17
17
|
s.add_dependency 'gli', '~> 2.0'
|
18
18
|
s.add_dependency 'helm-cli', '~> 0.3'
|
19
19
|
# See: https://github.com/Shopify/krane/pull/720
|
data/lib/kuby.rb
CHANGED
@@ -153,6 +153,7 @@ end
|
|
153
153
|
|
154
154
|
# providers
|
155
155
|
Kuby.register_provider(:docker_desktop, Kuby::Kubernetes::DockerDesktopProvider)
|
156
|
+
Kuby.register_provider(:bare_metal, Kuby::Kubernetes::BareMetalProvider)
|
156
157
|
|
157
158
|
# plugins
|
158
159
|
Kuby.register_plugin(:rails_app, Kuby::Plugins::RailsApp::Plugin)
|
data/lib/kuby/basic_logger.rb
CHANGED
data/lib/kuby/cli_base.rb
CHANGED
@@ -7,21 +7,26 @@ module Kuby
|
|
7
7
|
class CLIBase
|
8
8
|
extend T::Sig
|
9
9
|
|
10
|
+
BeforeCallback = T.type_alias { T.proc.params(cmd: T::Array[String]).void }
|
11
|
+
AfterCallback = T.type_alias do
|
12
|
+
T.proc.params(cmd: T::Array[String], last_status: T.nilable(Process::Status)).void
|
13
|
+
end
|
14
|
+
|
10
15
|
sig { returns(T.nilable(Process::Status)) }
|
11
16
|
def last_status
|
12
17
|
Thread.current[status_key]
|
13
18
|
end
|
14
19
|
|
15
|
-
sig { params(block:
|
20
|
+
sig { params(block: BeforeCallback).void }
|
16
21
|
def before_execute(&block)
|
17
|
-
@before_execute = T.let(@before_execute, T.nilable(T::Array[
|
22
|
+
@before_execute = T.let(@before_execute, T.nilable(T::Array[BeforeCallback]))
|
18
23
|
@before_execute ||= []
|
19
24
|
@before_execute << block
|
20
25
|
end
|
21
26
|
|
22
|
-
sig { params(block:
|
27
|
+
sig { params(block: AfterCallback).void }
|
23
28
|
def after_execute(&block)
|
24
|
-
@after_execute = T.let(@after_execute, T.nilable(T::Array[
|
29
|
+
@after_execute = T.let(@after_execute, T.nilable(T::Array[AfterCallback]))
|
25
30
|
@after_execute ||= []
|
26
31
|
@after_execute << block
|
27
32
|
end
|
data/lib/kuby/docker.rb
CHANGED
@@ -14,6 +14,7 @@ module Kuby
|
|
14
14
|
autoload :DevSpec, 'kuby/docker/dev_spec'
|
15
15
|
autoload :Distro, 'kuby/docker/distro'
|
16
16
|
autoload :Dockerfile, 'kuby/docker/dockerfile'
|
17
|
+
autoload :DockerURI, 'kuby/docker/docker_uri'
|
17
18
|
autoload :InlineLayer, 'kuby/docker/inline_layer'
|
18
19
|
autoload :Layer, 'kuby/docker/layer'
|
19
20
|
autoload :LayerStack, 'kuby/docker/layer_stack'
|
@@ -51,10 +51,6 @@ module Kuby
|
|
51
51
|
dockerfile.copy(gf, '.')
|
52
52
|
dockerfile.copy(lf, '.')
|
53
53
|
|
54
|
-
# set bundle path so docker will cache the bundle
|
55
|
-
dockerfile.run('mkdir', './bundle')
|
56
|
-
dockerfile.env('BUNDLE_PATH=./bundle')
|
57
|
-
|
58
54
|
unless wo.empty?
|
59
55
|
dockerfile.env("BUNDLE_WITHOUT='#{wo.join(' ')}'")
|
60
56
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# typed: false
|
2
|
+
|
3
|
+
module Kuby
|
4
|
+
module Docker
|
5
|
+
class DockerURI
|
6
|
+
DEFAULT_REGISTRY_HOST = 'index.docker.io'.freeze
|
7
|
+
DEFAULT_REGISTRY_PORT = 443
|
8
|
+
|
9
|
+
def self.parse(url)
|
10
|
+
if idx = url.index('://')
|
11
|
+
url = url[(idx + 3)..-1] || ''
|
12
|
+
end
|
13
|
+
|
14
|
+
host_port, *path = url.split('/')
|
15
|
+
host, port, *path = if host_port =~ /[.:]/
|
16
|
+
hst, prt = host_port.split(':')
|
17
|
+
[hst, prt || DEFAULT_REGISTRY_PORT, *path]
|
18
|
+
else
|
19
|
+
[DEFAULT_REGISTRY_HOST, DEFAULT_REGISTRY_PORT, host_port, *path]
|
20
|
+
end
|
21
|
+
|
22
|
+
new(host, port.to_i, path.join('/'))
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :host, :port, :path
|
26
|
+
|
27
|
+
def initialize(host, port, path)
|
28
|
+
@host = host
|
29
|
+
@port = port
|
30
|
+
@path = path
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/kuby/docker/metadata.rb
CHANGED
@@ -8,8 +8,6 @@ module Kuby
|
|
8
8
|
extend T::Sig
|
9
9
|
|
10
10
|
DEFAULT_DISTRO = :debian
|
11
|
-
DEFAULT_REGISTRY_HOST = T.let('https://index.docker.io'.freeze, String)
|
12
|
-
DEFAULT_REGISTRY_SCHEME = T.let('https', String)
|
13
11
|
LATEST_TAG = T.let('latest'.freeze, String)
|
14
12
|
|
15
13
|
sig { params(image_url: String).void }
|
@@ -28,7 +26,7 @@ module Kuby
|
|
28
26
|
@image_hostname = T.let(@image_hostname, T.nilable(String))
|
29
27
|
@image_repo = T.let(@image_repo, T.nilable(String))
|
30
28
|
@distro = T.let(@distro, T.nilable(Symbol))
|
31
|
-
@full_image_uri = T.let(@full_image_uri, T.nilable(
|
29
|
+
@full_image_uri = T.let(@full_image_uri, T.nilable(DockerURI))
|
32
30
|
@default_image_url = T.let(@default_image_url, T.nilable(String))
|
33
31
|
@default_tags = T.let(@default_tags, T.nilable(T::Array[String]))
|
34
32
|
end
|
@@ -40,18 +38,17 @@ module Kuby
|
|
40
38
|
|
41
39
|
sig { returns(String) }
|
42
40
|
def image_host
|
43
|
-
|
44
|
-
@image_host ||= "#{uri.scheme}://#{uri.host}:#{uri.port}"
|
41
|
+
@image_host ||= "#{full_image_uri.host}:#{full_image_uri.port}"
|
45
42
|
end
|
46
43
|
|
47
44
|
sig { returns(String) }
|
48
45
|
def image_hostname
|
49
|
-
@image_hostname ||=
|
46
|
+
@image_hostname ||= full_image_uri.host
|
50
47
|
end
|
51
48
|
|
52
49
|
sig { returns(String) }
|
53
50
|
def image_repo
|
54
|
-
@image_repo ||=
|
51
|
+
@image_repo ||= full_image_uri.path
|
55
52
|
end
|
56
53
|
|
57
54
|
sig { returns(T::Array[String]) }
|
@@ -71,15 +68,9 @@ module Kuby
|
|
71
68
|
|
72
69
|
private
|
73
70
|
|
74
|
-
sig { returns(
|
71
|
+
sig { returns(DockerURI) }
|
75
72
|
def full_image_uri
|
76
|
-
@full_image_uri ||=
|
77
|
-
URI.parse(image_url)
|
78
|
-
elsif image_url =~ /\A[^.:]+[\.:][^\/]+\//
|
79
|
-
URI.parse("#{DEFAULT_REGISTRY_SCHEME}://#{image_url}")
|
80
|
-
else
|
81
|
-
URI.parse("#{DEFAULT_REGISTRY_HOST}/#{image_url.sub(/\A[\/]+/, '')}")
|
82
|
-
end
|
73
|
+
@full_image_uri ||= DockerURI.parse(image_url)
|
83
74
|
end
|
84
75
|
|
85
76
|
sig { returns(String) }
|
@@ -94,15 +85,6 @@ module Kuby
|
|
94
85
|
TimestampTag.new(Time.now).to_s, LATEST_TAG
|
95
86
|
]
|
96
87
|
end
|
97
|
-
|
98
|
-
sig { params(url: String).returns(URI::Generic) }
|
99
|
-
def parse_url(url)
|
100
|
-
uri = URI.parse(url)
|
101
|
-
return uri if uri.scheme
|
102
|
-
|
103
|
-
# force a scheme because URI.parse won't work properly without one
|
104
|
-
URI.parse("#{DEFAULT_REGISTRY_SCHEME}://#{url}")
|
105
|
-
end
|
106
88
|
end
|
107
89
|
end
|
108
90
|
end
|
@@ -7,8 +7,8 @@ module Kuby
|
|
7
7
|
|
8
8
|
sig { params(dockerfile: Dockerfile).void }
|
9
9
|
def apply_to(dockerfile)
|
10
|
-
|
11
|
-
dockerfile.copy('yarn.
|
10
|
+
# use character classes as a hack to only copy the files if they exist
|
11
|
+
dockerfile.copy('package.json yarn.loc[k] .npmr[c] .yarnr[c]', './')
|
12
12
|
dockerfile.run('yarn', 'install')
|
13
13
|
end
|
14
14
|
end
|
data/lib/kuby/kubernetes.rb
CHANGED
@@ -3,6 +3,7 @@ require 'kuby/kubernetes/errors'
|
|
3
3
|
|
4
4
|
module Kuby
|
5
5
|
module Kubernetes
|
6
|
+
autoload :BareMetalProvider, 'kuby/kubernetes/bare_metal_provider'
|
6
7
|
autoload :Deployer, 'kuby/kubernetes/deployer'
|
7
8
|
autoload :DeployTask, 'kuby/kubernetes/deploy_task'
|
8
9
|
autoload :DockerConfig, 'kuby/kubernetes/docker_config'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'kube-dsl'
|
3
|
+
|
4
|
+
module Kuby
|
5
|
+
module Kubernetes
|
6
|
+
class BareMetalProvider < Provider
|
7
|
+
STORAGE_CLASS_NAME = 'hostpath'.freeze
|
8
|
+
|
9
|
+
class Config
|
10
|
+
extend ::KubeDSL::ValueFields
|
11
|
+
|
12
|
+
value_fields :kubeconfig
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :config
|
16
|
+
|
17
|
+
def configure(&block)
|
18
|
+
config.instance_eval(&block) if block
|
19
|
+
end
|
20
|
+
|
21
|
+
def kubeconfig_path
|
22
|
+
config.kubeconfig
|
23
|
+
end
|
24
|
+
|
25
|
+
def storage_class_name
|
26
|
+
STORAGE_CLASS_NAME
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def after_initialize
|
32
|
+
@config = Config.new
|
33
|
+
|
34
|
+
configure do
|
35
|
+
# default kubeconfig path
|
36
|
+
kubeconfig File.join(ENV['HOME'], '.kube', 'config')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/kuby/kubernetes/spec.rb
CHANGED
@@ -152,7 +152,7 @@ module Kuby
|
|
152
152
|
end
|
153
153
|
|
154
154
|
docker_config do
|
155
|
-
registry_host spec.docker.metadata.
|
155
|
+
registry_host spec.docker.metadata.image_hostname
|
156
156
|
username spec.docker.credentials.username
|
157
157
|
password spec.docker.credentials.password
|
158
158
|
email spec.docker.credentials.email
|
@@ -380,11 +380,35 @@ module Kuby
|
|
380
380
|
init_container(:create_db) do
|
381
381
|
name "#{kube_spec.selector_app}-create-db"
|
382
382
|
command %w(bundle exec rake kuby:rails_app:db:create_unless_exists)
|
383
|
+
|
384
|
+
env_from do
|
385
|
+
config_map_ref do
|
386
|
+
name kube_spec.config_map.metadata.name
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
env_from do
|
391
|
+
secret_ref do
|
392
|
+
name kube_spec.app_secrets.metadata.name
|
393
|
+
end
|
394
|
+
end
|
383
395
|
end
|
384
396
|
|
385
397
|
init_container(:migrate_db) do
|
386
398
|
name "#{kube_spec.selector_app}-migrate-db"
|
387
399
|
command %w(bundle exec rake db:migrate)
|
400
|
+
|
401
|
+
env_from do
|
402
|
+
config_map_ref do
|
403
|
+
name kube_spec.config_map.metadata.name
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
env_from do
|
408
|
+
secret_ref do
|
409
|
+
name kube_spec.app_secrets.metadata.name
|
410
|
+
end
|
411
|
+
end
|
388
412
|
end
|
389
413
|
|
390
414
|
image_pull_secret do
|
data/lib/kuby/tasks.rb
CHANGED
@@ -41,10 +41,10 @@ module Kuby
|
|
41
41
|
fail 'Cannot push Docker images built for the development environment'
|
42
42
|
end
|
43
43
|
|
44
|
-
|
44
|
+
host = docker.metadata.image_host
|
45
45
|
|
46
|
-
if docker.credentials.username && !docker.cli.auths.include?(
|
47
|
-
Kuby.logger.info("Attempting to log in to registry at #{
|
46
|
+
if docker.credentials.username && !docker.cli.auths.include?(host)
|
47
|
+
Kuby.logger.info("Attempting to log in to registry at #{host}")
|
48
48
|
|
49
49
|
begin
|
50
50
|
docker.cli.login(
|
@@ -53,7 +53,7 @@ module Kuby
|
|
53
53
|
password: docker.credentials.password
|
54
54
|
)
|
55
55
|
rescue Kuby::Docker::LoginError => e
|
56
|
-
Kuby.logger.fatal("Couldn't log in to the registry at #{
|
56
|
+
Kuby.logger.fatal("Couldn't log in to the registry at #{host}")
|
57
57
|
Kuby.logger.fatal(e.message)
|
58
58
|
return
|
59
59
|
end
|
data/lib/kuby/version.rb
CHANGED
@@ -19,18 +19,18 @@ describe Kuby::Docker::Metadata do
|
|
19
19
|
describe '#image_host' do
|
20
20
|
subject { metadata.image_host }
|
21
21
|
|
22
|
-
it { is_expected.to eq("#{
|
22
|
+
it { is_expected.to eq("#{Kuby::Docker::DockerURI::DEFAULT_REGISTRY_HOST}:443") }
|
23
23
|
|
24
24
|
context 'when the image URL contains an explicit host' do
|
25
25
|
let(:docker_image_url) { 'registry.foo.com/foo/testapp' }
|
26
26
|
|
27
|
-
it { is_expected.to eq('
|
27
|
+
it { is_expected.to eq('registry.foo.com:443') }
|
28
28
|
end
|
29
29
|
|
30
|
-
context 'when the image URL contains an explicit host
|
30
|
+
context 'when the image URL contains an explicit host' do
|
31
31
|
let(:docker_image_url) { 'http://registry.foo.com/foo/testapp' }
|
32
32
|
|
33
|
-
it { is_expected.to eq('
|
33
|
+
it { is_expected.to eq('registry.foo.com:443') }
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -46,18 +46,6 @@ describe Kuby::Docker::Metadata do
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
describe '#image_hostname' do
|
50
|
-
subject { metadata.image_hostname }
|
51
|
-
|
52
|
-
it { is_expected.to eq('index.docker.io') }
|
53
|
-
|
54
|
-
context 'when the image URL contains an explicit host' do
|
55
|
-
let(:docker_image_url) { 'registry.foo.com/foo/testapp' }
|
56
|
-
|
57
|
-
it { is_expected.to eq('registry.foo.com') }
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
49
|
describe '#tags' do
|
62
50
|
subject { metadata.tags }
|
63
51
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kuby-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Dutro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.5'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: gli
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -230,6 +230,7 @@ files:
|
|
230
230
|
- lib/kuby/docker/debian.rb
|
231
231
|
- lib/kuby/docker/dev_spec.rb
|
232
232
|
- lib/kuby/docker/distro.rb
|
233
|
+
- lib/kuby/docker/docker_uri.rb
|
233
234
|
- lib/kuby/docker/dockerfile.rb
|
234
235
|
- lib/kuby/docker/errors.rb
|
235
236
|
- lib/kuby/docker/inline_layer.rb
|
@@ -254,6 +255,7 @@ files:
|
|
254
255
|
- lib/kuby/docker/yarn_phase.rb
|
255
256
|
- lib/kuby/environment.rb
|
256
257
|
- lib/kuby/kubernetes.rb
|
258
|
+
- lib/kuby/kubernetes/bare_metal_provider.rb
|
257
259
|
- lib/kuby/kubernetes/deploy_task.rb
|
258
260
|
- lib/kuby/kubernetes/deployer.rb
|
259
261
|
- lib/kuby/kubernetes/docker_config.rb
|