krane 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -3
- data/.rubocop-http---shopify-github-io-ruby-style-guide-rubocop-yml +1027 -0
- data/.shopify-build/{kubernetes-deploy.yml → krane.yml} +1 -0
- data/1.0-Upgrade.md +2 -3
- data/CHANGELOG.md +9 -1
- data/CONTRIBUTING.md +4 -4
- data/Gemfile +0 -11
- data/README.md +9 -9
- data/dev.yml +3 -3
- data/krane.gemspec +16 -1
- data/lib/krane/concurrency.rb +2 -2
- data/lib/krane/deploy_task.rb +1 -0
- data/lib/krane/ejson_secret_provisioner.rb +7 -4
- data/lib/krane/global_deploy_task.rb +1 -0
- data/lib/krane/kubernetes_resource.rb +1 -0
- data/lib/krane/kubernetes_resource/cloudsql.rb +1 -0
- data/lib/krane/kubernetes_resource/daemon_set.rb +1 -0
- data/lib/krane/kubernetes_resource/deployment.rb +1 -0
- data/lib/krane/kubernetes_resource/replica_set.rb +2 -16
- data/lib/krane/kubernetes_resource/service.rb +3 -7
- data/lib/krane/kubernetes_resource/stateful_set.rb +1 -0
- data/lib/krane/resource_cache.rb +6 -0
- data/lib/krane/resource_watcher.rb +1 -0
- data/lib/krane/version.rb +1 -1
- metadata +147 -7
- data/shipit.yml +0 -4
data/1.0-Upgrade.md
CHANGED
@@ -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/
|
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 |
|
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
|
data/CHANGELOG.md
CHANGED
@@ -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/
|
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
|
|
data/CONTRIBUTING.md
CHANGED
@@ -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/
|
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/
|
101
|
-
5. Add the new resource to the [prune whitelist](https://github.com/Shopify/
|
102
|
-
6. Add a basic example of the type to the hello-cloud [fixture set](https://github.com/Shopify/
|
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/
|
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/
|
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
|
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-
|
57
|
+
* [Prerequisites](#prerequisites-1)
|
58
58
|
* [Usage](#usage-3)
|
59
59
|
|
60
60
|
**KRANE RENDER**
|
61
|
-
* [Prerequisites](#prerequisites-
|
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/
|
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/
|
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/
|
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/
|
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:
|
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 '
|
15
|
-
meet: minikube start --kubernetes-version=v1.11.
|
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
|
data/krane.gemspec
CHANGED
@@ -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("
|
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
|
data/lib/krane/concurrency.rb
CHANGED
@@ -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 +
|
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) }
|
data/lib/krane/deploy_task.rb
CHANGED
@@ -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
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
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: [])
|
@@ -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 =
|
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
|
-
|
11
|
-
|
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
|
data/lib/krane/resource_cache.rb
CHANGED
@@ -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
|
data/lib/krane/version.rb
CHANGED
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.
|
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-
|
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:
|
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:
|
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:
|
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/
|
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
|