kdep 0.5.0 → 0.6.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/lib/kdep/commands/apply.rb +5 -0
- data/lib/kdep/commands/bump.rb +11 -0
- data/lib/kdep/commands/helm_install.rb +7 -0
- data/lib/kdep/renderer.rb +71 -0
- data/lib/kdep/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0f5fd6a62da416ea9cdccd6d6370050509846001fec09b066b63ac8c79918106
|
|
4
|
+
data.tar.gz: a792a173492ad869938ad623743af357e1a1ee6a8d7c85d2f591bcde7511d378
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4640ab8f5039e3e5b4a9135a11afe42738659bf41376f38f0db463f13d1086317dc9c9631b2fb378157f86a1a255d7a29a58cdf816fcc0fe1d045c6b537d1d4a
|
|
7
|
+
data.tar.gz: bae5c85f87d19d2320cccbc169a0b08bb5f4b56b565dd81a1002c904c5e5a9d4ac570c053fc88ee6163534051809b72931a0395ff4cc0882127c32ad7126a068
|
data/lib/kdep/commands/apply.rb
CHANGED
|
@@ -71,6 +71,7 @@ module Kdep
|
|
|
71
71
|
writer = Kdep::Writer.new(output_dir)
|
|
72
72
|
writer.clean
|
|
73
73
|
renderer = Kdep::Renderer.new(config, deploy_dir, env: env)
|
|
74
|
+
Kdep::Renderer.preflight_secrets!(@ui, renderer, resources)
|
|
74
75
|
validator = Kdep::Validator.new
|
|
75
76
|
validation_errors = []
|
|
76
77
|
|
|
@@ -78,6 +79,10 @@ module Kdep
|
|
|
78
79
|
index = idx + 1
|
|
79
80
|
begin
|
|
80
81
|
content = renderer.render_resource(resource_name)
|
|
82
|
+
rescue Kdep::Renderer::MissingSecretsError => e
|
|
83
|
+
@ui.error("#{resource_name}: #{e.message}")
|
|
84
|
+
@ui.error("nada foi aplicado")
|
|
85
|
+
exit 1
|
|
81
86
|
rescue => e
|
|
82
87
|
@ui.error("#{resource_name}: #{e.message}")
|
|
83
88
|
next
|
data/lib/kdep/commands/bump.rb
CHANGED
|
@@ -121,6 +121,12 @@ module Kdep
|
|
|
121
121
|
registry_url = config["registry"]
|
|
122
122
|
repo_root = File.dirname(kdep_dir)
|
|
123
123
|
|
|
124
|
+
# O Secret é conferido ANTES do docker build/push: falha aqui não empurra imagem nem aplica nada.
|
|
125
|
+
unless @command_options[:"skip-apply"]
|
|
126
|
+
Kdep::Renderer.preflight_secrets!(@ui, Kdep::Renderer.new(config, deploy_dir, env: env),
|
|
127
|
+
Kdep::Preset.new(config["preset"], deploy_dir).resources)
|
|
128
|
+
end
|
|
129
|
+
|
|
124
130
|
begin
|
|
125
131
|
# Step 4: Increment minor version.
|
|
126
132
|
parsed = Kdep::VersionTagger.parse(current_tag)
|
|
@@ -233,6 +239,10 @@ module Kdep
|
|
|
233
239
|
end
|
|
234
240
|
end
|
|
235
241
|
|
|
242
|
+
rescue Kdep::Renderer::MissingSecretsError => e
|
|
243
|
+
@ui.error(e.message)
|
|
244
|
+
@ui.error("nada foi aplicado (a imagem pode já ter sido enviada ao registry)")
|
|
245
|
+
exit 1
|
|
236
246
|
rescue Kdep::Docker::Error => e
|
|
237
247
|
@ui.error(e.message)
|
|
238
248
|
exit 1
|
|
@@ -301,6 +311,7 @@ module Kdep
|
|
|
301
311
|
writer.clean
|
|
302
312
|
renderer = Kdep::Renderer.new(config, deploy_dir, env: env)
|
|
303
313
|
preset_resources = Kdep::Preset.new(config["preset"], deploy_dir).resources
|
|
314
|
+
Kdep::Renderer.preflight_secrets!(@ui, renderer, preset_resources)
|
|
304
315
|
|
|
305
316
|
preset_resources.each_with_index do |resource, idx|
|
|
306
317
|
content = renderer.render_resource(resource)
|
|
@@ -73,6 +73,10 @@ module Kdep
|
|
|
73
73
|
exit 1
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
+
# O Secret extra (preset helm: secret + ingress) é conferido ANTES do helm upgrade.
|
|
77
|
+
Kdep::Renderer.preflight_secrets!(@ui, Kdep::Renderer.new(config, @deploy_dir, env: @env),
|
|
78
|
+
Kdep::Preset.new("helm", @deploy_dir).resources)
|
|
79
|
+
|
|
76
80
|
# Load secrets for --set interpolation
|
|
77
81
|
@secrets = load_secrets(@deploy_dir)
|
|
78
82
|
|
|
@@ -277,6 +281,9 @@ module Kdep
|
|
|
277
281
|
index = next_index
|
|
278
282
|
begin
|
|
279
283
|
content = renderer.render_resource(resource_name)
|
|
284
|
+
rescue Kdep::Renderer::MissingSecretsError => e
|
|
285
|
+
@ui.error("#{resource_name}: #{e.message}")
|
|
286
|
+
exit 1
|
|
280
287
|
rescue => e
|
|
281
288
|
render_errors << "#{resource_name}: #{e.message}"
|
|
282
289
|
next
|
data/lib/kdep/renderer.rb
CHANGED
|
@@ -3,6 +3,22 @@ require "yaml"
|
|
|
3
3
|
|
|
4
4
|
module Kdep
|
|
5
5
|
class Renderer
|
|
6
|
+
# O app declara env_from para o Secret que o kdep renderiza, mas não há secrets.yml (ou está vazio):
|
|
7
|
+
# aplicar esse Secret sem `data` apagaria todas as chaves dele no cluster (incidente de 12/11/2026).
|
|
8
|
+
class MissingSecretsError < StandardError; end
|
|
9
|
+
|
|
10
|
+
# Preflight comum a bump/apply/helm: roda ANTES de qualquer build, helm upgrade ou apply.
|
|
11
|
+
# Erro -> mensagem + exit 1, nada aplicado. :skip -> aviso (o Secret do cluster fica intocado).
|
|
12
|
+
def self.preflight_secrets!(ui, renderer, resources)
|
|
13
|
+
return unless resources.include?("secret")
|
|
14
|
+
|
|
15
|
+
ui.warn(renderer.secret_skip_message) if renderer.check_secrets! == :skip
|
|
16
|
+
rescue MissingSecretsError => e
|
|
17
|
+
ui.error(e.message)
|
|
18
|
+
ui.error("nada foi aplicado")
|
|
19
|
+
exit 1
|
|
20
|
+
end
|
|
21
|
+
|
|
6
22
|
# Convention: Infisical project slug = K8s namespace stripped of -stage/-dev
|
|
7
23
|
# suffix; envSlug = stage/dev/prod derived from the same suffix.
|
|
8
24
|
NS_ENV_SUFFIXES = { "-stage" => "stage", "-staging" => "stage", "-dev" => "dev" }.freeze
|
|
@@ -39,6 +55,7 @@ module Kdep
|
|
|
39
55
|
return nil if secret_keys_for_env.empty?
|
|
40
56
|
effective_config = @config.merge("infisical" => infisical_render_context)
|
|
41
57
|
when "secret"
|
|
58
|
+
return nil if check_secrets! == :skip
|
|
42
59
|
secrets = legacy_load_secrets
|
|
43
60
|
end
|
|
44
61
|
|
|
@@ -179,5 +196,59 @@ module Kdep
|
|
|
179
196
|
content = File.read(secrets_path)
|
|
180
197
|
YAML.safe_load(content) || {}
|
|
181
198
|
end
|
|
199
|
+
|
|
200
|
+
public
|
|
201
|
+
|
|
202
|
+
# Decide o que fazer com o Secret nativo (kdep/<deploy>/secrets.yml). Nunca aplica um Secret que apague chaves:
|
|
203
|
+
# - secrets.yml com chaves, todas com valor -> :render
|
|
204
|
+
# - secrets.yml ausente ou vazio, env_from padrão -> :skip (não renderiza; o Secret do cluster fica intocado)
|
|
205
|
+
# - secrets.yml ausente ou vazio, env_from EXPLÍCITO para este Secret -> MissingSecretsError
|
|
206
|
+
# - alguma chave com valor nil ou "" -> MissingSecretsError (apagaria o valor no cluster)
|
|
207
|
+
# Incidente de 12/11/2026: o secret-mcp-leadfy-bi foi aplicado sem data e perdeu todas as chaves.
|
|
208
|
+
def check_secrets!
|
|
209
|
+
return :render if env_spec
|
|
210
|
+
|
|
211
|
+
secrets = legacy_load_secrets
|
|
212
|
+
unless secrets.is_a?(Hash)
|
|
213
|
+
raise MissingSecretsError, "#{secrets_path} não é um mapa CHAVE: valor"
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
if secrets.empty?
|
|
217
|
+
return :skip unless explicit_secret_ref?
|
|
218
|
+
|
|
219
|
+
state = File.exist?(secrets_path) ? "está vazio" : "não existe"
|
|
220
|
+
raise MissingSecretsError,
|
|
221
|
+
"#{secrets_path} #{state}, mas o app.yml tem env_from secret/#{secret_name}: " \
|
|
222
|
+
"aplicar o Secret sem data apagaria todas as chaves de #{secret_name} no cluster. " \
|
|
223
|
+
"Crie o secrets.yml com as chaves (ou tire o secret do env_from) antes de render/apply/bump."
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
vazias = secrets.select { |_k, v| v.nil? || v.to_s.empty? }.keys
|
|
227
|
+
unless vazias.empty?
|
|
228
|
+
raise MissingSecretsError,
|
|
229
|
+
"#{secrets_path}: chave(s) sem valor (#{vazias.join(", ")}). Aplicar assim apagaria o valor " \
|
|
230
|
+
"delas em #{secret_name} no cluster. Preencha ou remova antes de render/apply/bump."
|
|
231
|
+
end
|
|
232
|
+
:render
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def secret_skip_message
|
|
236
|
+
"#{secrets_path} não existe (ou está vazio): o Secret #{secret_name} não é renderizado nem aplicado; " \
|
|
237
|
+
"o que estiver no cluster fica intocado (se ele não existir, o pod falha ao subir)."
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
private
|
|
241
|
+
|
|
242
|
+
def secret_name
|
|
243
|
+
@config["secret_name"] || "secret-#{@config["name"]}"
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def secrets_path
|
|
247
|
+
File.join(@deploy_dir, "secrets.yml")
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def explicit_secret_ref?
|
|
251
|
+
Array(@config["env_from"]).map(&:to_s).include?("secret/#{secret_name}")
|
|
252
|
+
end
|
|
182
253
|
end
|
|
183
254
|
end
|
data/lib/kdep/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kdep
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Leadfy
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-11-12 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: envspec
|