krane 1.0.0 → 1.1.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.
@@ -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