krane 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -51,3 +51,4 @@ steps:
51
51
  env:
52
52
  LOGGING_LEVEL: "4"
53
53
  KUBERNETES_VERSION: v1.11-latest
54
+
@@ -7,7 +7,7 @@
7
7
  * There are breaking changes in the public API (such as the renaming of the `KubernetesDeploy` namespace to `Krane`, and the change in default values for different arguments of the public interface).
8
8
  * StatsD metrics will now be generated with the `krane` prefix.
9
9
  * `krane deploy` now considers all namespaced resources eligible for pruning, including
10
- custom resources. See [blacklist](https://github.com/Shopify/kubernetes-deploy/blob/master/lib/krane/cluster_resource_discovery.rb#L20) for exceptions.
10
+ custom resources. See [blacklist](https://github.com/Shopify/krane/blob/master/lib/krane/cluster_resource_discovery.rb#L20) for exceptions.
11
11
  * `kubernetes-deploy` (now `krane deploy`) / `DeployTask` can no longer deploy global (non-namespaced) resources. A new command called `krane global-deploy` and a related class called `GlobalDeployTask` were added to replace that feature.
12
12
  * `krane deploy` will not render erb templates. Use `krane render | krane deploy --stdin` to reproduce this functionality.
13
13
  * If you attempt to install two gems that have conflicting executables, `gem install` will warn you but the most recently installed one will win.
@@ -126,8 +126,7 @@ Old flag | New flag | Comments
126
126
  -h, --help | -h, --help |
127
127
  -v, --version | [none] | Replaced with `krane version`
128
128
  $ENVIRONMENT | [none] | Dropped in favour of `-f`
129
- $REVISION | --current-sha | The environment variable REVISION was dropped in favour of an explicit flag
130
- [none] | --render-erb | **Important:** the new CLI doesn't render ERB by default
129
+ $REVISION | [none] | The environment variable REVISION was dropped because deploy no longer renders.
131
130
  [none] | --stdin | Allow template filenames given from stdin stream
132
131
 
133
132
  #### krane restart
@@ -1,9 +1,17 @@
1
1
  ## next
2
2
 
3
+ ## 1.1.0
4
+
5
+ *Bug Fixes*
6
+ - Fix a bug causing secret generation from ejson to fail when decryption succeeded but a warning was also emitted. [#647](https://github.com/Shopify/krane/pull/647)
7
+
8
+ *Enhancements*
9
+ - Warm the ResourceCache before running resource.sync to improve sync performance. ([#603](https://github.com/Shopify/kubernetes-deploy/pull/603))
10
+
3
11
  # 1.0.0
4
12
 
5
13
  We've renamed the gem and cli to Krane.
6
- See our [migration guide](https://github.com/Shopify/kubernetes-deploy/blob/master/1.0-Upgrade.md) to help navigate the breaking changes.
14
+ See our [migration guide](https://github.com/Shopify/krane/blob/master/1.0-Upgrade.md) to help navigate the breaking changes.
7
15
 
8
16
  ## 1.0.0.pre.1
9
17
 
@@ -22,7 +22,7 @@ The following is a set of guidelines for contributing to krane. Please take a mo
22
22
  * [CI (External contributors)](#ci-external-contributors)
23
23
  ## Code of Conduct
24
24
 
25
- This project and everyone participating in it are governed by the [Code of Conduct](https://github.com/Shopify/kubernetes-deploy/blob/master/CODE_OF_CONDUCT.md).
25
+ This project and everyone participating in it are governed by the [Code of Conduct](https://github.com/Shopify/krane/blob/master/CODE_OF_CONDUCT.md).
26
26
  By participating, you are expected to uphold this code. Please report unacceptable
27
27
  behavior to [krane@shopify.com](mailto:krane@shopify.com).
28
28
 
@@ -97,9 +97,9 @@ This gem uses subclasses of `KubernetesResource` to implement custom success/fai
97
97
  * `deploy_failed?`
98
98
  3. Adjust the `TIMEOUT` constant to an appropriate value for this type.
99
99
  4. Add the new class to list of resources in
100
- [`deploy_task.rb`](https://github.com/Shopify/kubernetes-deploy/blob/master/lib/krane/deploy_task.rb#L8)
101
- 5. Add the new resource to the [prune whitelist](https://github.com/Shopify/kubernetes-deploy/blob/master/lib/krane/deploy_task.rb#L81)
102
- 6. Add a basic example of the type to the hello-cloud [fixture set](https://github.com/Shopify/kubernetes-deploy/tree/master/test/fixtures/hello-cloud) and appropriate assertions to `#assert_all_up` in [`hello_cloud.rb`](https://github.com/Shopify/kubernetes-deploy/blob/master/test/helpers/fixture_sets/hello_cloud.rb). This will get you coverage in several existing tests, such as `test_full_hello_cloud_set_deploy_succeeds`.
100
+ [`deploy_task.rb`](https://github.com/Shopify/krane/blob/master/lib/krane/deploy_task.rb#L8)
101
+ 5. Add the new resource to the [prune whitelist](https://github.com/Shopify/krane/blob/master/lib/krane/deploy_task.rb#L81)
102
+ 6. Add a basic example of the type to the hello-cloud [fixture set](https://github.com/Shopify/krane/tree/master/test/fixtures/hello-cloud) and appropriate assertions to `#assert_all_up` in [`hello_cloud.rb`](https://github.com/Shopify/krane/blob/master/test/helpers/fixture_sets/hello_cloud.rb). This will get you coverage in several existing tests, such as `test_full_hello_cloud_set_deploy_succeeds`.
103
103
  7. Add tests for any edge cases you foresee.
104
104
 
105
105
  ### Contributor License Agreement
data/Gemfile CHANGED
@@ -3,14 +3,3 @@ source 'https://rubygems.org'
3
3
 
4
4
  # Specify your gem's dependencies in krane.gemspec
5
5
  gemspec
6
-
7
- gem 'pry'
8
- gem 'pry-byebug'
9
- gem 'rubocop'
10
- gem 'timecop'
11
- gem 'byebug'
12
- gem 'codecov', require: false
13
- gem 'ruby-prof', require: false
14
- gem 'ruby-prof-flamegraph', require: false
15
- gem 'minitest-reporters'
16
- gem 'yard', require: false
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # krane [![Build status](https://badge.buildkite.com/61937e40a1fc69754d9d198be120543d6de310de2ba8d3cb0e.svg?branch=master)](https://buildkite.com/shopify/kubernetes-deploy) [![codecov](https://codecov.io/gh/Shopify/kubernetes-deploy/branch/master/graph/badge.svg)](https://codecov.io/gh/Shopify/kubernetes-deploy)
1
+ # krane [![Build status](https://badge.buildkite.com/35c56e797c3bbd6ba50053aefdded0715898cd8e8c86f7e462.svg)](https://buildkite.com/shopify/krane) [![codecov](https://codecov.io/gh/Shopify/kubernetes-deploy/branch/master/graph/badge.svg)](https://codecov.io/gh/Shopify/kubernetes-deploy)
2
2
 
3
- > This project used to be called `kubernetes-deploy`. Check out our [migration guide](https://github.com/Shopify/kubernetes-deploy/blob/master/1.0-Upgrade.md) for more information including details about breaking changes.
3
+ > This project used to be called `kubernetes-deploy`. Check out our [migration guide](https://github.com/Shopify/krane/blob/master/1.0-Upgrade.md) for more information including details about breaking changes.
4
4
 
5
5
 
6
6
  `krane` is a command line tool that helps you ship changes to a Kubernetes namespace and understand the result. At Shopify, we use it within our much-beloved, open-source [Shipit](https://github.com/Shopify/shipit-engine#kubernetes) deployment app.
@@ -40,7 +40,7 @@ If you need the ability to render dynamic values in templates before deploying,
40
40
  * [Prerequisites](#prerequisites)
41
41
  * [Installation](#installation)
42
42
  * [Usage](#usage)
43
- * [Using templates and variables](#using-templates-and-variables)
43
+ * [Using templates](#using-templates)
44
44
  * [Customizing behaviour with annotations](#customizing-behaviour-with-annotations)
45
45
  * [Running tasks at the beginning of a deploy](#running-tasks-at-the-beginning-of-a-deploy)
46
46
  * [Deploying Kubernetes secrets (from EJSON)](#deploying-kubernetes-secrets-from-ejson)
@@ -54,11 +54,11 @@ If you need the ability to render dynamic values in templates before deploying,
54
54
  * [Usage](#usage-2)
55
55
 
56
56
  **KRANE RUN**
57
- * [Prerequisites](#prerequisites-2)
57
+ * [Prerequisites](#prerequisites-1)
58
58
  * [Usage](#usage-3)
59
59
 
60
60
  **KRANE RENDER**
61
- * [Prerequisites](#prerequisites-3)
61
+ * [Prerequisites](#prerequisites-2)
62
62
  * [Usage](#usage-4)
63
63
 
64
64
  **CONTRIBUTING**
@@ -324,7 +324,7 @@ status:
324
324
 
325
325
  ### Deploy walkthrough
326
326
 
327
- Let's walk through what happens when you run the `deploy` task with [this directory of templates](https://github.com/Shopify/kubernetes-deploy/tree/master/test/fixtures/hello-cloud). This particular example uses ERB templates as well, so we'll use the [krane render](#krane-render) task to achieve that.
327
+ Let's walk through what happens when you run the `deploy` task with [this directory of templates](https://github.com/Shopify/krane/tree/master/test/fixtures/hello-cloud). This particular example uses ERB templates as well, so we'll use the [krane render](#krane-render) task to achieve that.
328
328
 
329
329
  You can test this out for yourself by running the following command:
330
330
 
@@ -391,7 +391,7 @@ In this phase, we:
391
391
 
392
392
  Just like in the previous phase, we essentially run `kubectl apply` on those templates and periodically check the cluster for the current status of each resource so we can display error or success information.
393
393
 
394
- If pruning is enabled (which, again, is the default), any [kind not listed in the blacklist](https://github.com/Shopify/kubernetes-deploy/blob/master/lib/krane/cluster_resource_discovery.rb#L20) that we can find in the namespace but not in the templates will be removed. A particular message about pruning will be printed in the next phase if any resource matches this criteria.
394
+ If pruning is enabled (which, again, is the default), any [kind not listed in the blacklist](https://github.com/Shopify/krane/blob/master/lib/krane/cluster_resource_discovery.rb#L20) that we can find in the namespace but not in the templates will be removed. A particular message about pruning will be printed in the next phase if any resource matches this criteria.
395
395
 
396
396
  #### Result
397
397
 
@@ -641,13 +641,13 @@ This is a limitation of the current implementation.
641
641
  # Contributing
642
642
 
643
643
  We :heart: contributors! To make it easier for you and us we've written a
644
- [Contributing Guide](https://github.com/Shopify/kubernetes-deploy/blob/master/CONTRIBUTING.md)
644
+ [Contributing Guide](https://github.com/Shopify/krane/blob/master/CONTRIBUTING.md)
645
645
 
646
646
 
647
647
  You can also reach out to us on our slack channel, #krane, at https://kubernetes.slack.com. All are welcome!
648
648
 
649
649
  ## Code of Conduct
650
- Everyone is expected to follow our [Code of Conduct](https://github.com/Shopify/kubernetes-deploy/blob/master/CODE_OF_CONDUCT.md).
650
+ Everyone is expected to follow our [Code of Conduct](https://github.com/Shopify/krane/blob/master/CODE_OF_CONDUCT.md).
651
651
 
652
652
 
653
653
  # License
data/dev.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: kubernetes-deploy
2
+ name: krane
3
3
  up:
4
4
  - ruby: 2.4.6 # Matches gemspec
5
5
  - bundler
@@ -11,8 +11,8 @@ up:
11
11
  meet: curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-hyperkit && sudo install -o root -g wheel -m 4755 docker-machine-driver-hyperkit /usr/local/bin/ && rm ./docker-machine-driver-hyperkit
12
12
  - custom:
13
13
  name: Minikube Cluster
14
- met?: test $(minikube status | grep Running | wc -l) -ge 2 && $(minikube status | grep -q 'Correctly Configured')
15
- meet: minikube start --kubernetes-version=v1.11.6 --vm-driver=hyperkit
14
+ met?: test $(minikube status | grep Running | wc -l) -ge 2 && $(minikube status | grep -q 'Configured')
15
+ meet: minikube start --kubernetes-version=v1.11.10 --vm-driver=hyperkit
16
16
  down: minikube stop
17
17
  commands:
18
18
  reset-minikube: minikube delete && rm -rf ~/.minikube
@@ -35,10 +35,25 @@ Gem::Specification.new do |spec|
35
35
  spec.add_dependency("jsonpath", "~> 0.9.6")
36
36
  spec.add_dependency("thor", "~> 0.20.3")
37
37
 
38
+ # Basics
38
39
  spec.add_development_dependency("bundler")
39
40
  spec.add_development_dependency("rake", "~> 10.0")
41
+ spec.add_development_dependency("yard")
42
+
43
+ # Test framework
40
44
  spec.add_development_dependency("minitest", "~> 5.0")
41
45
  spec.add_development_dependency("minitest-stub-const", "~> 0.6")
42
- spec.add_development_dependency("webmock", "~> 3.0")
46
+ spec.add_development_dependency("minitest-reporters")
43
47
  spec.add_development_dependency("mocha", "~> 1.5")
48
+ spec.add_development_dependency("webmock", "~> 3.0")
49
+ spec.add_development_dependency("timecop")
50
+
51
+ # Debugging and analysis
52
+ spec.add_development_dependency("pry")
53
+ spec.add_development_dependency("pry-byebug")
54
+ spec.add_development_dependency("byebug")
55
+ spec.add_development_dependency("ruby-prof")
56
+ spec.add_development_dependency("ruby-prof-flamegraph")
57
+ spec.add_development_dependency("rubocop", "~> 0.76.0")
58
+ spec.add_development_dependency("codecov")
44
59
  end
@@ -3,11 +3,11 @@ module Krane
3
3
  module Concurrency
4
4
  MAX_THREADS = 8
5
5
 
6
- def self.split_across_threads(all_work, &block)
6
+ def self.split_across_threads(all_work, max_threads: MAX_THREADS, &block)
7
7
  return if all_work.empty?
8
8
  raise ArgumentError, "Block of work is required" unless block_given?
9
9
 
10
- slice_size = ((all_work.length + MAX_THREADS - 1) / MAX_THREADS)
10
+ slice_size = ((all_work.length + max_threads - 1) / max_threads)
11
11
  threads = []
12
12
  all_work.each_slice(slice_size) do |work_group|
13
13
  threads << Thread.new { work_group.each(&block) }
@@ -216,6 +216,7 @@ module Krane
216
216
 
217
217
  def check_initial_status(resources)
218
218
  cache = ResourceCache.new(@task_config)
219
+ cache.prewarm(resources)
219
220
  Krane::Concurrency.split_across_threads(resources) { |r| r.sync(cache) }
220
221
  resources.each { |r| @logger.info(r.pretty_status) }
221
222
  end
@@ -134,10 +134,13 @@ module Krane
134
134
  end
135
135
 
136
136
  def decrypt_ejson(key_dir)
137
- # ejson seems to dump both errors and output to STDOUT
138
- out_err, st = Open3.capture2e("EJSON_KEYDIR=#{key_dir} ejson decrypt #{@ejson_file}")
139
- raise EjsonSecretError, out_err unless st.success?
140
- JSON.parse(out_err)
137
+ out, err, st = Open3.capture3("EJSON_KEYDIR=#{key_dir} ejson decrypt #{@ejson_file}")
138
+ unless st.success?
139
+ # older ejson versions dump some errors to STDOUT
140
+ msg = err.presence || out
141
+ raise EjsonSecretError, msg
142
+ end
143
+ JSON.parse(out)
141
144
  rescue JSON::ParserError
142
145
  raise EjsonSecretError, "Failed to parse decrypted ejson"
143
146
  end
@@ -202,6 +202,7 @@ module Krane
202
202
 
203
203
  def check_initial_status(resources)
204
204
  cache = ResourceCache.new(@task_config)
205
+ cache.prewarm(resources)
205
206
  Concurrency.split_across_threads(resources) { |r| r.sync(cache) }
206
207
  resources.each { |r| logger.info(r.pretty_status) }
207
208
  end
@@ -38,6 +38,7 @@ module Krane
38
38
  LAST_APPLIED_ANNOTATION = "kubectl.kubernetes.io/last-applied-configuration"
39
39
  SENSITIVE_TEMPLATE_CONTENT = false
40
40
  SERVER_DRY_RUNNABLE = false
41
+ SYNC_DEPENDENCIES = []
41
42
 
42
43
  class << self
43
44
  def build(namespace: nil, context:, definition:, logger:, statsd_tags:, crd: nil, global_names: [])
@@ -2,6 +2,7 @@
2
2
  module Krane
3
3
  class Cloudsql < KubernetesResource
4
4
  TIMEOUT = 10.minutes
5
+ SYNC_DEPENDENCIES = %w(Deployment Service)
5
6
 
6
7
  def sync(cache)
7
8
  super
@@ -3,6 +3,7 @@ require "krane/kubernetes_resource/pod_set_base"
3
3
  module Krane
4
4
  class DaemonSet < PodSetBase
5
5
  TIMEOUT = 5.minutes
6
+ SYNC_DEPENDENCIES = %w(Pod)
6
7
  attr_reader :pods
7
8
 
8
9
  def sync(cache)
@@ -4,6 +4,7 @@ require 'krane/kubernetes_resource/replica_set'
4
4
  module Krane
5
5
  class Deployment < KubernetesResource
6
6
  TIMEOUT = 7.minutes
7
+ SYNC_DEPENDENCIES = %w(Pod ReplicaSet)
7
8
  REQUIRED_ROLLOUT_ANNOTATION_SUFFIX = "required-rollout"
8
9
  REQUIRED_ROLLOUT_ANNOTATION_DEPRECATED = "kubernetes-deploy.shopify.io/#{REQUIRED_ROLLOUT_ANNOTATION_SUFFIX}"
9
10
  REQUIRED_ROLLOUT_ANNOTATION = "krane.shopify.io/#{REQUIRED_ROLLOUT_ANNOTATION_SUFFIX}"
@@ -4,6 +4,7 @@ require 'krane/kubernetes_resource/pod_set_base'
4
4
  module Krane
5
5
  class ReplicaSet < PodSetBase
6
6
  TIMEOUT = 5.minutes
7
+ SYNC_DEPENDENCIES = %w(Pod)
7
8
  attr_reader :pods
8
9
 
9
10
  def initialize(namespace:, context:, definition:, logger:, statsd_tags: nil,
@@ -17,7 +18,7 @@ module Krane
17
18
 
18
19
  def sync(cache)
19
20
  super
20
- @pods = fetch_pods_if_needed(cache) || []
21
+ @pods = exists? ? find_pods(cache) : []
21
22
  end
22
23
 
23
24
  def status
@@ -58,21 +59,6 @@ module Krane
58
59
  observed_generation != current_generation
59
60
  end
60
61
 
61
- def fetch_pods_if_needed(cache)
62
- # If the ReplicaSet doesn't exist, its pods won't either
63
- return unless exists?
64
- # If the status hasn't been updated yet, we're not going to make a determination anyway
65
- return if stale_status?
66
- # If we don't want any pods at all, we don't need to look for them
67
- return if desired_replicas == 0
68
- # We only need to fetch pods so that deploy_failed? can check that they aren't ALL bad.
69
- # If we can already tell some pods are ok from the RS data, don't bother fetching them (which can be expensive)
70
- # Lower numbers here make us more susceptible to being fooled by replicas without probes briefly appearing ready
71
- return if ready_replicas > 1
72
-
73
- find_pods(cache)
74
- end
75
-
76
62
  def rollout_data
77
63
  return { "replicas" => 0 } unless exists?
78
64
  { "replicas" => 0 }.merge(
@@ -4,16 +4,12 @@ require 'krane/kubernetes_resource/pod'
4
4
  module Krane
5
5
  class Service < KubernetesResource
6
6
  TIMEOUT = 7.minutes
7
+ SYNC_DEPENDENCIES = %w(Pod Deployment StatefulSet)
7
8
 
8
9
  def sync(cache)
9
10
  super
10
- if exists? && selector.present?
11
- @related_pods = cache.get_all(Pod.kind, selector)
12
- @related_workloads = fetch_related_workloads(cache)
13
- else
14
- @related_pods = []
15
- @related_workloads = []
16
- end
11
+ @related_pods = cache.get_all(Pod.kind, selector)
12
+ @related_workloads = fetch_related_workloads(cache)
17
13
  end
18
14
 
19
15
  def status
@@ -4,6 +4,7 @@ module Krane
4
4
  class StatefulSet < PodSetBase
5
5
  TIMEOUT = 10.minutes
6
6
  ONDELETE = 'OnDelete'
7
+ SYNC_DEPENDENCIES = %w(Pod)
7
8
  attr_reader :pods
8
9
 
9
10
  def sync(cache)
@@ -36,6 +36,12 @@ module Krane
36
36
  []
37
37
  end
38
38
 
39
+ def prewarm(resources)
40
+ sync_dependencies = resources.flat_map { |r| r.class.const_get(:SYNC_DEPENDENCIES) }
41
+ kinds = (resources.map(&:type) + sync_dependencies).uniq
42
+ Krane::Concurrency.split_across_threads(kinds, max_threads: kinds.count) { |kind| get_all(kind) }
43
+ end
44
+
39
45
  private
40
46
 
41
47
  def statsd_tags
@@ -53,6 +53,7 @@ module Krane
53
53
 
54
54
  def sync_resources(resources)
55
55
  cache = ResourceCache.new(@task_config)
56
+ cache.prewarm(resources)
56
57
  Krane::Concurrency.split_across_threads(resources) { |r| r.sync(cache) }
57
58
  resources.each(&:after_sync)
58
59
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Krane
3
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: krane
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Verey
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-11-18 00:00:00.000000000 Z
13
+ date: 2019-12-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -186,6 +186,20 @@ dependencies:
186
186
  - - "~>"
187
187
  - !ruby/object:Gem::Version
188
188
  version: '10.0'
189
+ - !ruby/object:Gem::Dependency
190
+ name: yard
191
+ requirement: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ type: :development
197
+ prerelease: false
198
+ version_requirements: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
189
203
  - !ruby/object:Gem::Dependency
190
204
  name: minitest
191
205
  requirement: !ruby/object:Gem::Requirement
@@ -214,6 +228,34 @@ dependencies:
214
228
  - - "~>"
215
229
  - !ruby/object:Gem::Version
216
230
  version: '0.6'
231
+ - !ruby/object:Gem::Dependency
232
+ name: minitest-reporters
233
+ requirement: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ type: :development
239
+ prerelease: false
240
+ version_requirements: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: '0'
245
+ - !ruby/object:Gem::Dependency
246
+ name: mocha
247
+ requirement: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - "~>"
250
+ - !ruby/object:Gem::Version
251
+ version: '1.5'
252
+ type: :development
253
+ prerelease: false
254
+ version_requirements: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - "~>"
257
+ - !ruby/object:Gem::Version
258
+ version: '1.5'
217
259
  - !ruby/object:Gem::Dependency
218
260
  name: webmock
219
261
  requirement: !ruby/object:Gem::Requirement
@@ -229,19 +271,117 @@ dependencies:
229
271
  - !ruby/object:Gem::Version
230
272
  version: '3.0'
231
273
  - !ruby/object:Gem::Dependency
232
- name: mocha
274
+ name: timecop
275
+ requirement: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: '0'
280
+ type: :development
281
+ prerelease: false
282
+ version_requirements: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - ">="
285
+ - !ruby/object:Gem::Version
286
+ version: '0'
287
+ - !ruby/object:Gem::Dependency
288
+ name: pry
289
+ requirement: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ type: :development
295
+ prerelease: false
296
+ version_requirements: !ruby/object:Gem::Requirement
297
+ requirements:
298
+ - - ">="
299
+ - !ruby/object:Gem::Version
300
+ version: '0'
301
+ - !ruby/object:Gem::Dependency
302
+ name: pry-byebug
303
+ requirement: !ruby/object:Gem::Requirement
304
+ requirements:
305
+ - - ">="
306
+ - !ruby/object:Gem::Version
307
+ version: '0'
308
+ type: :development
309
+ prerelease: false
310
+ version_requirements: !ruby/object:Gem::Requirement
311
+ requirements:
312
+ - - ">="
313
+ - !ruby/object:Gem::Version
314
+ version: '0'
315
+ - !ruby/object:Gem::Dependency
316
+ name: byebug
317
+ requirement: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - ">="
320
+ - !ruby/object:Gem::Version
321
+ version: '0'
322
+ type: :development
323
+ prerelease: false
324
+ version_requirements: !ruby/object:Gem::Requirement
325
+ requirements:
326
+ - - ">="
327
+ - !ruby/object:Gem::Version
328
+ version: '0'
329
+ - !ruby/object:Gem::Dependency
330
+ name: ruby-prof
331
+ requirement: !ruby/object:Gem::Requirement
332
+ requirements:
333
+ - - ">="
334
+ - !ruby/object:Gem::Version
335
+ version: '0'
336
+ type: :development
337
+ prerelease: false
338
+ version_requirements: !ruby/object:Gem::Requirement
339
+ requirements:
340
+ - - ">="
341
+ - !ruby/object:Gem::Version
342
+ version: '0'
343
+ - !ruby/object:Gem::Dependency
344
+ name: ruby-prof-flamegraph
345
+ requirement: !ruby/object:Gem::Requirement
346
+ requirements:
347
+ - - ">="
348
+ - !ruby/object:Gem::Version
349
+ version: '0'
350
+ type: :development
351
+ prerelease: false
352
+ version_requirements: !ruby/object:Gem::Requirement
353
+ requirements:
354
+ - - ">="
355
+ - !ruby/object:Gem::Version
356
+ version: '0'
357
+ - !ruby/object:Gem::Dependency
358
+ name: rubocop
233
359
  requirement: !ruby/object:Gem::Requirement
234
360
  requirements:
235
361
  - - "~>"
236
362
  - !ruby/object:Gem::Version
237
- version: '1.5'
363
+ version: 0.76.0
238
364
  type: :development
239
365
  prerelease: false
240
366
  version_requirements: !ruby/object:Gem::Requirement
241
367
  requirements:
242
368
  - - "~>"
243
369
  - !ruby/object:Gem::Version
244
- version: '1.5'
370
+ version: 0.76.0
371
+ - !ruby/object:Gem::Dependency
372
+ name: codecov
373
+ requirement: !ruby/object:Gem::Requirement
374
+ requirements:
375
+ - - ">="
376
+ - !ruby/object:Gem::Version
377
+ version: '0'
378
+ type: :development
379
+ prerelease: false
380
+ version_requirements: !ruby/object:Gem::Requirement
381
+ requirements:
382
+ - - ">="
383
+ - !ruby/object:Gem::Version
384
+ version: '0'
245
385
  description: A command line tool that helps you ship changes to a Kubernetes namespace
246
386
  and understand the result
247
387
  email:
@@ -254,9 +394,10 @@ files:
254
394
  - ".buildkite/pipeline.nightly.yml"
255
395
  - ".github/probots.yml"
256
396
  - ".gitignore"
397
+ - ".rubocop-http---shopify-github-io-ruby-style-guide-rubocop-yml"
257
398
  - ".rubocop.yml"
258
399
  - ".shopify-build/VERSION"
259
- - ".shopify-build/kubernetes-deploy.yml"
400
+ - ".shopify-build/krane.yml"
260
401
  - 1.0-Upgrade.md
261
402
  - CHANGELOG.md
262
403
  - CODE_OF_CONDUCT.md
@@ -348,7 +489,6 @@ files:
348
489
  - screenshots/missing-secret-fail.png
349
490
  - screenshots/success.png
350
491
  - screenshots/test-output.png
351
- - shipit.yml
352
492
  homepage: https://github.com/Shopify/krane
353
493
  licenses:
354
494
  - MIT