krane 1.1.0 → 2.0.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.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +1 -0
- data/{ISSUE_TEMPLATE.md → .github/ISSUE_TEMPLATE.md} +0 -0
- data/{pull_request_template.md → .github/pull_request_template.md} +0 -0
- data/.rubocop-http---shopify-github-io-ruby-style-guide-rubocop-yml +24 -30
- data/.rubocop.yml +0 -12
- data/.shopify-build/krane.yml +20 -6
- data/1.0-Upgrade.md +2 -2
- data/CHANGELOG.md +61 -0
- data/CONTRIBUTING.md +2 -2
- data/README.md +14 -16
- data/bin/ci +1 -1
- data/bin/test +2 -2
- data/dev.yml +1 -1
- data/krane.gemspec +7 -5
- data/lib/krane/annotation.rb +11 -0
- data/lib/krane/cli/deploy_command.rb +3 -4
- data/lib/krane/cli/global_deploy_command.rb +3 -3
- data/lib/krane/cli/render_command.rb +3 -3
- data/lib/krane/cluster_resource_discovery.rb +10 -6
- data/lib/krane/concerns/template_reporting.rb +0 -6
- data/lib/krane/container_logs.rb +1 -1
- data/lib/krane/container_overrides.rb +33 -0
- data/lib/krane/deploy_task.rb +16 -13
- data/lib/krane/ejson_secret_provisioner.rb +1 -2
- data/lib/krane/global_deploy_task.rb +4 -7
- data/lib/krane/kubectl.rb +11 -1
- data/lib/krane/kubernetes_resource.rb +19 -46
- data/lib/krane/kubernetes_resource/custom_resource.rb +2 -2
- data/lib/krane/kubernetes_resource/custom_resource_definition.rb +13 -10
- data/lib/krane/kubernetes_resource/deployment.rb +5 -7
- data/lib/krane/kubernetes_resource/pod.rb +12 -8
- data/lib/krane/psych_k8s_compatibility.rb +36 -0
- data/lib/krane/render_task.rb +2 -2
- data/lib/krane/renderer.rb +2 -0
- data/lib/krane/resource_deployer.rb +7 -2
- data/lib/krane/resource_watcher.rb +1 -1
- data/lib/krane/restart_task.rb +2 -2
- data/lib/krane/runner_task.rb +16 -17
- data/lib/krane/statsd.rb +2 -2
- data/lib/krane/template_sets.rb +1 -1
- data/lib/krane/version.rb +1 -1
- metadata +27 -17
- data/lib/krane/kubernetes_resource/cloudsql.rb +0 -44
@@ -62,7 +62,7 @@ module Krane
|
|
62
62
|
kind
|
63
63
|
end
|
64
64
|
|
65
|
-
def validate_definition(
|
65
|
+
def validate_definition(*, **)
|
66
66
|
super
|
67
67
|
|
68
68
|
@crd.validate_rollout_conditions
|
@@ -70,7 +70,7 @@ module Krane
|
|
70
70
|
@validation_errors << "The CRD that specifies this resource is using invalid rollout conditions. " \
|
71
71
|
"Krane will not be able to continue until those rollout conditions are fixed.\n" \
|
72
72
|
"Rollout conditions can be found on the CRD that defines this resource (#{@crd.name}), " \
|
73
|
-
"under the annotation #{CustomResourceDefinition::ROLLOUT_CONDITIONS_ANNOTATION}.\n" \
|
73
|
+
"under the annotation #{Annotation.for(CustomResourceDefinition::ROLLOUT_CONDITIONS_ANNOTATION)}.\n" \
|
74
74
|
"Validation failed with: #{e}"
|
75
75
|
end
|
76
76
|
|
@@ -2,9 +2,8 @@
|
|
2
2
|
module Krane
|
3
3
|
class CustomResourceDefinition < KubernetesResource
|
4
4
|
TIMEOUT = 2.minutes
|
5
|
-
|
6
|
-
|
7
|
-
TIMEOUT_FOR_INSTANCE_ANNOTATION = "krane.shopify.io/instance-timeout"
|
5
|
+
ROLLOUT_CONDITIONS_ANNOTATION = "instance-rollout-conditions"
|
6
|
+
TIMEOUT_FOR_INSTANCE_ANNOTATION = "instance-timeout"
|
8
7
|
GLOBAL = true
|
9
8
|
|
10
9
|
def deploy_succeeded?
|
@@ -20,7 +19,7 @@ module Krane
|
|
20
19
|
end
|
21
20
|
|
22
21
|
def timeout_for_instance
|
23
|
-
timeout = krane_annotation_value(
|
22
|
+
timeout = krane_annotation_value(TIMEOUT_FOR_INSTANCE_ANNOTATION)
|
24
23
|
DurationParser.new(timeout).parse!.to_i
|
25
24
|
rescue DurationParser::ParsingError
|
26
25
|
nil
|
@@ -46,6 +45,10 @@ module Krane
|
|
46
45
|
@definition.dig("spec", "names", "kind")
|
47
46
|
end
|
48
47
|
|
48
|
+
def group
|
49
|
+
@definition.dig("spec", "group")
|
50
|
+
end
|
51
|
+
|
49
52
|
def prunable?
|
50
53
|
prunable = krane_annotation_value("prunable")
|
51
54
|
prunable == "true"
|
@@ -59,25 +62,25 @@ module Krane
|
|
59
62
|
def rollout_conditions
|
60
63
|
return @rollout_conditions if defined?(@rollout_conditions)
|
61
64
|
|
62
|
-
@rollout_conditions = if krane_annotation_value(
|
63
|
-
RolloutConditions.from_annotation(krane_annotation_value(
|
65
|
+
@rollout_conditions = if krane_annotation_value(ROLLOUT_CONDITIONS_ANNOTATION)
|
66
|
+
RolloutConditions.from_annotation(krane_annotation_value(ROLLOUT_CONDITIONS_ANNOTATION))
|
64
67
|
end
|
65
68
|
rescue RolloutConditionsError
|
66
69
|
@rollout_conditions = nil
|
67
70
|
end
|
68
71
|
|
69
|
-
def validate_definition(
|
72
|
+
def validate_definition(*, **)
|
70
73
|
super
|
71
74
|
|
72
75
|
validate_rollout_conditions
|
73
76
|
rescue RolloutConditionsError => e
|
74
|
-
@validation_errors << "Annotation #{
|
77
|
+
@validation_errors << "Annotation #{Annotation.for(ROLLOUT_CONDITIONS_ANNOTATION)} " \
|
75
78
|
"on #{name} is invalid: #{e}"
|
76
79
|
end
|
77
80
|
|
78
81
|
def validate_rollout_conditions
|
79
|
-
if krane_annotation_value(
|
80
|
-
conditions = RolloutConditions.from_annotation(krane_annotation_value(
|
82
|
+
if krane_annotation_value(ROLLOUT_CONDITIONS_ANNOTATION) && @rollout_conditions_validated.nil?
|
83
|
+
conditions = RolloutConditions.from_annotation(krane_annotation_value(ROLLOUT_CONDITIONS_ANNOTATION))
|
81
84
|
conditions.validate!
|
82
85
|
end
|
83
86
|
|
@@ -5,9 +5,7 @@ module Krane
|
|
5
5
|
class Deployment < KubernetesResource
|
6
6
|
TIMEOUT = 7.minutes
|
7
7
|
SYNC_DEPENDENCIES = %w(Pod ReplicaSet)
|
8
|
-
|
9
|
-
REQUIRED_ROLLOUT_ANNOTATION_DEPRECATED = "kubernetes-deploy.shopify.io/#{REQUIRED_ROLLOUT_ANNOTATION_SUFFIX}"
|
10
|
-
REQUIRED_ROLLOUT_ANNOTATION = "krane.shopify.io/#{REQUIRED_ROLLOUT_ANNOTATION_SUFFIX}"
|
8
|
+
REQUIRED_ROLLOUT_ANNOTATION = "required-rollout"
|
11
9
|
REQUIRED_ROLLOUT_TYPES = %w(maxUnavailable full none).freeze
|
12
10
|
DEFAULT_REQUIRED_ROLLOUT = 'full'
|
13
11
|
|
@@ -97,7 +95,7 @@ module Krane
|
|
97
95
|
progress_condition.present? ? deploy_failing_to_progress? : super
|
98
96
|
end
|
99
97
|
|
100
|
-
def validate_definition(
|
98
|
+
def validate_definition(*, **)
|
101
99
|
super
|
102
100
|
|
103
101
|
unless REQUIRED_ROLLOUT_TYPES.include?(required_rollout) || percent?(required_rollout)
|
@@ -106,7 +104,7 @@ module Krane
|
|
106
104
|
|
107
105
|
strategy = @definition.dig('spec', 'strategy', 'type').to_s
|
108
106
|
if required_rollout.downcase == 'maxunavailable' && strategy.present? && strategy.downcase != 'rollingupdate'
|
109
|
-
@validation_errors << "'#{
|
107
|
+
@validation_errors << "'#{Annotation.for(REQUIRED_ROLLOUT_ANNOTATION)}: #{required_rollout}' " \
|
110
108
|
"is incompatible with strategy '#{strategy}'"
|
111
109
|
end
|
112
110
|
|
@@ -151,7 +149,7 @@ module Krane
|
|
151
149
|
end
|
152
150
|
|
153
151
|
def rollout_annotation_err_msg
|
154
|
-
"'#{
|
152
|
+
"'#{Annotation.for(REQUIRED_ROLLOUT_ANNOTATION)}: #{required_rollout}' is invalid. " \
|
155
153
|
"Acceptable values: #{REQUIRED_ROLLOUT_TYPES.join(', ')}"
|
156
154
|
end
|
157
155
|
|
@@ -191,7 +189,7 @@ module Krane
|
|
191
189
|
def min_available_replicas
|
192
190
|
if percent?(required_rollout)
|
193
191
|
(desired_replicas * required_rollout.to_i / 100.0).ceil
|
194
|
-
elsif max_unavailable =~ /%/
|
192
|
+
elsif max_unavailable.is_a?(String) && max_unavailable =~ /%/
|
195
193
|
(desired_replicas * (100 - max_unavailable.to_i) / 100.0).ceil
|
196
194
|
else
|
197
195
|
desired_replicas - max_unavailable.to_i
|
@@ -219,14 +219,7 @@ module Krane
|
|
219
219
|
limbo_reason = @status.dig("state", "waiting", "reason")
|
220
220
|
limbo_message = @status.dig("state", "waiting", "message")
|
221
221
|
|
222
|
-
if
|
223
|
-
# ref: https://github.com/kubernetes/kubernetes/blob/562e721ece8a16e05c7e7d6bdd6334c910733ab2/pkg/kubelet/dockershim/docker_container.go#L353
|
224
|
-
exit_code = @status.dig('lastState', 'terminated', 'exitCode')
|
225
|
-
"Failed to start (exit #{exit_code}): #{@status.dig('lastState', 'terminated', 'message')}"
|
226
|
-
elsif @status.dig("state", "terminated", "reason") == "ContainerCannotRun"
|
227
|
-
exit_code = @status.dig('state', 'terminated', 'exitCode')
|
228
|
-
"Failed to start (exit #{exit_code}): #{@status.dig('state', 'terminated', 'message')}"
|
229
|
-
elsif limbo_reason == "CrashLoopBackOff"
|
222
|
+
if limbo_reason == "CrashLoopBackOff"
|
230
223
|
exit_code = @status.dig('lastState', 'terminated', 'exitCode')
|
231
224
|
"Crashing repeatedly (exit #{exit_code}). See logs for more information."
|
232
225
|
elsif limbo_reason == "ErrImagePull" && limbo_message.match(/not found/i)
|
@@ -234,6 +227,17 @@ module Krane
|
|
234
227
|
"Did you wait for it to be built and pushed to the registry before deploying?"
|
235
228
|
elsif limbo_reason == "CreateContainerConfigError"
|
236
229
|
"Failed to generate container configuration: #{limbo_message}"
|
230
|
+
elsif @status.dig("lastState", "terminated", "reason") == "ContainerCannotRun"
|
231
|
+
# ref: https://github.com/kubernetes/kubernetes/blob/562e721ece8a16e05c7e7d6bdd6334c910733ab2/pkg/kubelet/dockershim/docker_container.go#L353
|
232
|
+
exit_code = @status.dig('lastState', 'terminated', 'exitCode')
|
233
|
+
# We've observed failures here that are actually issues with the node or kube infra, and not with the
|
234
|
+
# container. These issues have been transient and result in a 128 exit code, so do not treat these as fatal.
|
235
|
+
return if exit_code == 128
|
236
|
+
"Failed to start (exit #{exit_code}): #{@status.dig('lastState', 'terminated', 'message')}"
|
237
|
+
elsif @status.dig("state", "terminated", "reason") == "ContainerCannotRun"
|
238
|
+
exit_code = @status.dig('state', 'terminated', 'exitCode')
|
239
|
+
return if exit_code == 128
|
240
|
+
"Failed to start (exit #{exit_code}): #{@status.dig('state', 'terminated', 'message')}"
|
237
241
|
end
|
238
242
|
end
|
239
243
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'psych'
|
4
|
+
|
5
|
+
module PsychK8sCompatibility
|
6
|
+
def self.massage_node(n)
|
7
|
+
if n.is_a?(Psych::Nodes::Scalar) &&
|
8
|
+
(n.style == Psych::Nodes::Scalar::PLAIN) &&
|
9
|
+
n.value.is_a?(String) &&
|
10
|
+
n.value =~ /\A[+-]?\d+(?:\.\d+)?[eE][+-]?\d+\z/
|
11
|
+
n.style = Psych::Nodes::Scalar::DOUBLE_QUOTED
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
refine Psych.singleton_class do
|
16
|
+
def dump(o, io = nil, options = {})
|
17
|
+
if io.is_a?(Hash)
|
18
|
+
options = io
|
19
|
+
io = nil
|
20
|
+
end
|
21
|
+
visitor = Psych::Visitors::YAMLTree.create(options)
|
22
|
+
visitor << o
|
23
|
+
visitor.tree.each { |n| PsychK8sCompatibility.massage_node(n) }
|
24
|
+
visitor.tree.yaml(io, options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def dump_stream(*objects)
|
28
|
+
visitor = Psych::Visitors::YAMLTree.create({})
|
29
|
+
objects.each do |o|
|
30
|
+
visitor << o
|
31
|
+
end
|
32
|
+
visitor.tree.each { |n| PsychK8sCompatibility.massage_node(n) }
|
33
|
+
visitor.tree.yaml
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/krane/render_task.rb
CHANGED
data/lib/krane/renderer.rb
CHANGED
@@ -46,8 +46,13 @@ module Krane
|
|
46
46
|
bare_pods.first.stream_logs = true
|
47
47
|
end
|
48
48
|
|
49
|
-
predeploy_sequence.each do |resource_type|
|
50
|
-
matching_resources = resource_list.select
|
49
|
+
predeploy_sequence.each do |resource_type, attributes|
|
50
|
+
matching_resources = resource_list.select do |r|
|
51
|
+
r.type == resource_type &&
|
52
|
+
(!attributes[:group] || r.group == attributes[:group])
|
53
|
+
end
|
54
|
+
StatsD.client.gauge('priority_resources.count', matching_resources.size, tags: statsd_tags)
|
55
|
+
|
51
56
|
next if matching_resources.empty?
|
52
57
|
deploy_resources(matching_resources, verify: true, record_summary: false)
|
53
58
|
|
data/lib/krane/restart_task.rb
CHANGED
data/lib/krane/runner_task.rb
CHANGED
@@ -9,6 +9,7 @@ require 'krane/resource_watcher'
|
|
9
9
|
require 'krane/kubernetes_resource'
|
10
10
|
require 'krane/kubernetes_resource/pod'
|
11
11
|
require 'krane/runner_task_config_validator'
|
12
|
+
require 'krane/container_overrides'
|
12
13
|
|
13
14
|
module Krane
|
14
15
|
# Run a pod that exits upon completing a task
|
@@ -34,8 +35,8 @@ module Krane
|
|
34
35
|
# Runs the task, returning a boolean representing success or failure
|
35
36
|
#
|
36
37
|
# @return [Boolean]
|
37
|
-
def run(
|
38
|
-
run!(
|
38
|
+
def run(**args)
|
39
|
+
run!(**args)
|
39
40
|
true
|
40
41
|
rescue DeploymentTimeoutError, FatalDeploymentError
|
41
42
|
false
|
@@ -50,7 +51,7 @@ module Krane
|
|
50
51
|
# @param verify_result [Boolean] Wait for completion and verify pod success
|
51
52
|
#
|
52
53
|
# @return [nil]
|
53
|
-
def run!(template:, command:, arguments:, env_vars: [], verify_result: true)
|
54
|
+
def run!(template:, command:, arguments:, env_vars: [], image_tag: nil, verify_result: true)
|
54
55
|
start = Time.now.utc
|
55
56
|
@logger.reset
|
56
57
|
|
@@ -59,8 +60,13 @@ module Krane
|
|
59
60
|
@logger.info("Validating configuration")
|
60
61
|
verify_config!(template)
|
61
62
|
@logger.info("Using namespace '#{@namespace}' in context '#{@context}'")
|
62
|
-
|
63
|
-
|
63
|
+
container_overrides = ContainerOverrides.new(
|
64
|
+
command: command,
|
65
|
+
arguments: arguments,
|
66
|
+
env_vars: env_vars,
|
67
|
+
image_tag: image_tag
|
68
|
+
)
|
69
|
+
pod = build_pod(template, container_overrides, verify_result)
|
64
70
|
validate_pod(pod)
|
65
71
|
|
66
72
|
@logger.phase_heading("Running pod")
|
@@ -98,11 +104,12 @@ module Krane
|
|
98
104
|
raise FatalDeploymentError, msg
|
99
105
|
end
|
100
106
|
|
101
|
-
def build_pod(template_name,
|
107
|
+
def build_pod(template_name, container_overrides, verify_result)
|
102
108
|
task_template = get_template(template_name)
|
103
109
|
@logger.info("Using template '#{template_name}'")
|
104
110
|
pod_template = build_pod_definition(task_template)
|
105
|
-
|
111
|
+
container = extract_task_runner_container(pod_template)
|
112
|
+
container_overrides.apply!(container)
|
106
113
|
ensure_valid_restart_policy!(pod_template, verify_result)
|
107
114
|
Pod.new(namespace: @namespace, context: @context, logger: @logger, stream_logs: true,
|
108
115
|
definition: pod_template.to_hash.deep_stringify_keys, statsd_tags: [])
|
@@ -165,7 +172,7 @@ module Krane
|
|
165
172
|
pod_definition
|
166
173
|
end
|
167
174
|
|
168
|
-
def
|
175
|
+
def extract_task_runner_container(pod_definition)
|
169
176
|
container = pod_definition.spec.containers.find { |cont| cont.name == 'task-runner' }
|
170
177
|
if container.nil?
|
171
178
|
message = "Pod spec does not contain a template container called 'task-runner'"
|
@@ -173,15 +180,7 @@ module Krane
|
|
173
180
|
raise TaskConfigurationError, message
|
174
181
|
end
|
175
182
|
|
176
|
-
container
|
177
|
-
container.args = args if args
|
178
|
-
|
179
|
-
env_args = env_vars.map do |env|
|
180
|
-
key, value = env.split('=', 2)
|
181
|
-
{ name: key, value: value }
|
182
|
-
end
|
183
|
-
container.env ||= []
|
184
|
-
container.env = container.env.map(&:to_h) + env_args
|
183
|
+
container
|
185
184
|
end
|
186
185
|
|
187
186
|
def ensure_valid_restart_policy!(template, verify)
|
data/lib/krane/statsd.rb
CHANGED
@@ -35,10 +35,10 @@ module Krane
|
|
35
35
|
end
|
36
36
|
|
37
37
|
metric ||= "#{method_name}.duration"
|
38
|
-
self::InstrumentationProxy.send(:define_method, method_name) do |*args, &block|
|
38
|
+
self::InstrumentationProxy.send(:define_method, method_name) do |*args, **kwargs, &block|
|
39
39
|
begin
|
40
40
|
start_time = Time.now.utc
|
41
|
-
super(*args, &block)
|
41
|
+
super(*args, **kwargs, &block)
|
42
42
|
rescue
|
43
43
|
error = true
|
44
44
|
raise
|
data/lib/krane/template_sets.rb
CHANGED
@@ -150,7 +150,7 @@ module Krane
|
|
150
150
|
|
151
151
|
if rendering_erb_disabled? && deploying_with_erb_files?
|
152
152
|
errors << "ERB template discovered with rendering disabled. If you were trying to render ERB and " \
|
153
|
-
"deploy the result, try piping the output of `krane render` to `krane-deploy
|
153
|
+
"deploy the result, try piping the output of `krane render` to `krane-deploy -f -`"
|
154
154
|
end
|
155
155
|
|
156
156
|
errors
|
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:
|
4
|
+
version: 2.0.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:
|
13
|
+
date: 2020-08-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -46,14 +46,14 @@ dependencies:
|
|
46
46
|
requirements:
|
47
47
|
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 0.8
|
49
|
+
version: '0.8'
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
54
|
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 0.8
|
56
|
+
version: '0.8'
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: ejson
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,16 +148,22 @@ dependencies:
|
|
148
148
|
name: thor
|
149
149
|
requirement: !ruby/object:Gem::Requirement
|
150
150
|
requirements:
|
151
|
-
- - "
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '1.0'
|
154
|
+
- - "<"
|
152
155
|
- !ruby/object:Gem::Version
|
153
|
-
version: 0
|
156
|
+
version: '2.0'
|
154
157
|
type: :runtime
|
155
158
|
prerelease: false
|
156
159
|
version_requirements: !ruby/object:Gem::Requirement
|
157
160
|
requirements:
|
158
|
-
- - "
|
161
|
+
- - ">="
|
159
162
|
- !ruby/object:Gem::Version
|
160
|
-
version: 0
|
163
|
+
version: '1.0'
|
164
|
+
- - "<"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '2.0'
|
161
167
|
- !ruby/object:Gem::Dependency
|
162
168
|
name: bundler
|
163
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,14 +212,14 @@ dependencies:
|
|
206
212
|
requirements:
|
207
213
|
- - "~>"
|
208
214
|
- !ruby/object:Gem::Version
|
209
|
-
version: '5.
|
215
|
+
version: '5.12'
|
210
216
|
type: :development
|
211
217
|
prerelease: false
|
212
218
|
version_requirements: !ruby/object:Gem::Requirement
|
213
219
|
requirements:
|
214
220
|
- - "~>"
|
215
221
|
- !ruby/object:Gem::Version
|
216
|
-
version: '5.
|
222
|
+
version: '5.12'
|
217
223
|
- !ruby/object:Gem::Dependency
|
218
224
|
name: minitest-stub-const
|
219
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -360,14 +366,14 @@ dependencies:
|
|
360
366
|
requirements:
|
361
367
|
- - "~>"
|
362
368
|
- !ruby/object:Gem::Version
|
363
|
-
version: 0.
|
369
|
+
version: 0.88.0
|
364
370
|
type: :development
|
365
371
|
prerelease: false
|
366
372
|
version_requirements: !ruby/object:Gem::Requirement
|
367
373
|
requirements:
|
368
374
|
- - "~>"
|
369
375
|
- !ruby/object:Gem::Version
|
370
|
-
version: 0.
|
376
|
+
version: 0.88.0
|
371
377
|
- !ruby/object:Gem::Dependency
|
372
378
|
name: codecov
|
373
379
|
requirement: !ruby/object:Gem::Requirement
|
@@ -392,7 +398,10 @@ extensions: []
|
|
392
398
|
extra_rdoc_files: []
|
393
399
|
files:
|
394
400
|
- ".buildkite/pipeline.nightly.yml"
|
401
|
+
- ".github/CODEOWNERS"
|
402
|
+
- ".github/ISSUE_TEMPLATE.md"
|
395
403
|
- ".github/probots.yml"
|
404
|
+
- ".github/pull_request_template.md"
|
396
405
|
- ".gitignore"
|
397
406
|
- ".rubocop-http---shopify-github-io-ruby-style-guide-rubocop-yml"
|
398
407
|
- ".rubocop.yml"
|
@@ -403,7 +412,6 @@ files:
|
|
403
412
|
- CODE_OF_CONDUCT.md
|
404
413
|
- CONTRIBUTING.md
|
405
414
|
- Gemfile
|
406
|
-
- ISSUE_TEMPLATE.md
|
407
415
|
- LICENSE.txt
|
408
416
|
- README.md
|
409
417
|
- Rakefile
|
@@ -415,6 +423,7 @@ files:
|
|
415
423
|
- exe/krane
|
416
424
|
- krane.gemspec
|
417
425
|
- lib/krane.rb
|
426
|
+
- lib/krane/annotation.rb
|
418
427
|
- lib/krane/bindings_parser.rb
|
419
428
|
- lib/krane/cli/deploy_command.rb
|
420
429
|
- lib/krane/cli/global_deploy_command.rb
|
@@ -428,6 +437,7 @@ files:
|
|
428
437
|
- lib/krane/concerns/template_reporting.rb
|
429
438
|
- lib/krane/concurrency.rb
|
430
439
|
- lib/krane/container_logs.rb
|
440
|
+
- lib/krane/container_overrides.rb
|
431
441
|
- lib/krane/deferred_summary_logging.rb
|
432
442
|
- lib/krane/delayed_exceptions.rb
|
433
443
|
- lib/krane/deploy_task.rb
|
@@ -441,7 +451,6 @@ files:
|
|
441
451
|
- lib/krane/kubeclient_builder.rb
|
442
452
|
- lib/krane/kubectl.rb
|
443
453
|
- lib/krane/kubernetes_resource.rb
|
444
|
-
- lib/krane/kubernetes_resource/cloudsql.rb
|
445
454
|
- lib/krane/kubernetes_resource/config_map.rb
|
446
455
|
- lib/krane/kubernetes_resource/cron_job.rb
|
447
456
|
- lib/krane/kubernetes_resource/custom_resource.rb
|
@@ -468,6 +477,7 @@ files:
|
|
468
477
|
- lib/krane/label_selector.rb
|
469
478
|
- lib/krane/oj.rb
|
470
479
|
- lib/krane/options_helper.rb
|
480
|
+
- lib/krane/psych_k8s_compatibility.rb
|
471
481
|
- lib/krane/remote_logs.rb
|
472
482
|
- lib/krane/render_task.rb
|
473
483
|
- lib/krane/renderer.rb
|
@@ -483,7 +493,6 @@ files:
|
|
483
493
|
- lib/krane/task_config_validator.rb
|
484
494
|
- lib/krane/template_sets.rb
|
485
495
|
- lib/krane/version.rb
|
486
|
-
- pull_request_template.md
|
487
496
|
- screenshots/deploy-demo.gif
|
488
497
|
- screenshots/migrate-logs.png
|
489
498
|
- screenshots/missing-secret-fail.png
|
@@ -492,7 +501,8 @@ files:
|
|
492
501
|
homepage: https://github.com/Shopify/krane
|
493
502
|
licenses:
|
494
503
|
- MIT
|
495
|
-
metadata:
|
504
|
+
metadata:
|
505
|
+
allowed_push_host: https://rubygems.org
|
496
506
|
post_install_message:
|
497
507
|
rdoc_options: []
|
498
508
|
require_paths:
|
@@ -501,7 +511,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
501
511
|
requirements:
|
502
512
|
- - ">="
|
503
513
|
- !ruby/object:Gem::Version
|
504
|
-
version: 2.
|
514
|
+
version: 2.5.0
|
505
515
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
506
516
|
requirements:
|
507
517
|
- - ">="
|