kuby-core 0.11.10 → 0.11.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0828619de266c13d61f0eafc6ce902d1500e07af158337439eba6f45415594c3'
4
- data.tar.gz: e296dc5858fe83e8eb9626d674a8c79a0e033559b168ee414d6afbf2f37f5b9e
3
+ metadata.gz: '03278595cc2f5eb23fcfb47a15fd8fea9aaf06546e3c9d92a71080953c3d10db'
4
+ data.tar.gz: 893a184f166b3bb453f96ef3529fbf65f8fef171f54a7268661645aa30834e99
5
5
  SHA512:
6
- metadata.gz: d215cfb16bdd4e784500c1c22364bdd086cf059c38a9696626ffc774158e803b9f72337de4eda09719b26d505c83e1bba533e8e49acc1dddd1304b27f3558d2b
7
- data.tar.gz: 6002bd6ee7a7cdd4d2568658fb8bdf8a9d8f42a19fa51ec846ceef5f35b458e9550d80e38aad168e2ce35e15bc91256570df160f1fec6d9cf763de362528ac04
6
+ metadata.gz: 0d0868b638c06e13db7b4353af14c6fa1d82bc143239cac4322ba3be4f723eca1a3a70c8e271ec5091afea24d088acd2b744e6b7af3347ceeddfff63eabbb285
7
+ data.tar.gz: f1a859ddf32f023f9c593345a50f9d11e998287ff05030117cf599920ed2c5b53ed8b54804080f7271be7b47ef9d7cfee8cfee168bf972226ec3e889e35dde60
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 0.11.15
2
+ * Copy over .npmrc and .yarnrc before running yarn install.
3
+
4
+ ## 0.11.14
5
+ * Don't include port in image host for registry secrets (no idea why)
6
+
7
+ ## 0.11.13
8
+ * Include port in image host.
9
+
10
+ ## 0.11.12
11
+ * Revamp Docker URL parsing
12
+ - Docker URLs shouldn't have a scheme.
13
+
14
+ ## 0.11.11
15
+ * Add support for a Docker registry running on localhost.
16
+ - Correctly parse and handle URLs with specific ports.
17
+ - Only perform a Docker login if a username is provided.
18
+
1
19
  ## 0.11.10
2
20
  * Fix spelling in error message.
3
21
 
data/Gemfile CHANGED
@@ -5,7 +5,8 @@ gemspec
5
5
  group :development, :test do
6
6
  gem 'pry-byebug'
7
7
  gem 'rake'
8
- gem 'sorbet', '~> 0.5'
8
+ # lock to a specific version to prevent breaking CI when new versions come out
9
+ gem 'sorbet', '= 0.5.6397'
9
10
  end
10
11
 
11
12
  group :test do
data/bin/kuby CHANGED
@@ -1,4 +1,6 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
+ $stdout.sync = true
4
+
3
5
  require 'kuby'
4
6
  exit Kuby::Commands.run(ARGV)
data/kuby-core.gemspec CHANGED
@@ -1,4 +1,4 @@
1
- $:.unshift File.join(File.dirname(__FILE__), 'lib')
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.1'
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)
@@ -52,7 +52,7 @@ module Kuby
52
52
  block: T.nilable(T.proc.returns(T.untyped))
53
53
  ).void
54
54
  }
55
- def fatal(progname_or_msg, &block)
55
+ def fatal(progname_or_msg = nil, &block)
56
56
  if block
57
57
  super(progname_or_msg) { ColorizedString[block.call].red }
58
58
  else
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: T.proc.params(cmd: String).void).void }
20
+ sig { params(block: BeforeCallback).void }
16
21
  def before_execute(&block)
17
- @before_execute = T.let(@before_execute, T.nilable(T::Array[T.proc.params(cmd: String).void]))
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: T.proc.params(cmd: String).void).void }
27
+ sig { params(block: AfterCallback).void }
23
28
  def after_execute(&block)
24
- @after_execute = T.let(@after_execute, T.nilable(T::Array[T.proc.params(cmd: String).void]))
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
@@ -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(URI::Generic))
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,17 +38,17 @@ module Kuby
40
38
 
41
39
  sig { returns(String) }
42
40
  def image_host
43
- @image_host ||= "#{full_image_uri.scheme}://#{full_image_uri.host}"
41
+ @image_host ||= "#{full_image_uri.host}:#{full_image_uri.port}"
44
42
  end
45
43
 
46
44
  sig { returns(String) }
47
45
  def image_hostname
48
- @image_hostname ||= T.must(URI(image_host).host)
46
+ @image_hostname ||= full_image_uri.host
49
47
  end
50
48
 
51
49
  sig { returns(String) }
52
50
  def image_repo
53
- @image_repo ||= T.must(full_image_uri.path).sub(/\A[\/]+/, '')
51
+ @image_repo ||= full_image_uri.path
54
52
  end
55
53
 
56
54
  sig { returns(T::Array[String]) }
@@ -70,15 +68,9 @@ module Kuby
70
68
 
71
69
  private
72
70
 
73
- sig { returns(URI::Generic) }
71
+ sig { returns(DockerURI) }
74
72
  def full_image_uri
75
- @full_image_uri ||= if image_url.include?('://')
76
- URI.parse(image_url)
77
- elsif image_url =~ /\A[^.]+\.[^\/]+\//
78
- URI.parse("#{DEFAULT_REGISTRY_SCHEME}://#{image_url}")
79
- else
80
- URI.parse("#{DEFAULT_REGISTRY_HOST}/#{image_url.sub(/\A[\/]+/, '')}")
81
- end
73
+ @full_image_uri ||= DockerURI.parse(image_url)
82
74
  end
83
75
 
84
76
  sig { returns(String) }
@@ -93,15 +85,6 @@ module Kuby
93
85
  TimestampTag.new(Time.now).to_s, LATEST_TAG
94
86
  ]
95
87
  end
96
-
97
- sig { params(url: String).returns(URI::Generic) }
98
- def parse_url(url)
99
- uri = URI.parse(url)
100
- return uri if uri.scheme
101
-
102
- # force a scheme because URI.parse won't work properly without one
103
- URI.parse("#{DEFAULT_REGISTRY_SCHEME}://#{url}")
104
- end
105
88
  end
106
89
  end
107
90
  end
@@ -8,7 +8,10 @@ module Kuby
8
8
  sig { params(dockerfile: Dockerfile).void }
9
9
  def apply_to(dockerfile)
10
10
  dockerfile.copy('package.json', '.')
11
- dockerfile.copy('yarn.lock*', '.')
11
+ # use character classes as a hack to only copy the files if they exist
12
+ dockerfile.copy('yarn.loc[k]', '.')
13
+ dockerfile.copy('.npmr[c]', '.')
14
+ dockerfile.copy('.yarnr[c]', '.')
12
15
  dockerfile.run('yarn', 'install')
13
16
  end
14
17
  end
@@ -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
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'fileutils'
4
4
  require 'securerandom'
5
+ require 'tmpdir'
5
6
  require 'yaml'
6
7
 
7
8
  module Kuby
@@ -152,7 +152,7 @@ module Kuby
152
152
  end
153
153
 
154
154
  docker_config do
155
- registry_host spec.docker.metadata.image_host
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
- hostname = docker.metadata.image_hostname
44
+ host = docker.metadata.image_host
45
45
 
46
- unless docker.cli.auths.include?(hostname)
47
- Kuby.logger.info("Attempting to log in to registry at #{hostname}")
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 #{hostname}")
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
@@ -1,5 +1,5 @@
1
1
  # typed: true
2
2
 
3
3
  module Kuby
4
- VERSION = '0.11.10'.freeze
4
+ VERSION = '0.11.15'.freeze
5
5
  end
@@ -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(described_class::DEFAULT_REGISTRY_HOST) }
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('https://registry.foo.com') }
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 with scheme' do
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('http://registry.foo.com') }
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.10
4
+ version: 0.11.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Dutro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-01 00:00:00.000000000 Z
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.1'
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.1'
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