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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e1f1a30cdbd53c887f8cb3596553d8cadfd8c40a69654e233effb307d405bde
4
- data.tar.gz: de0c60773483b9b9203463d807cd61af12a4aacdee78f71c834522ef38538116
3
+ metadata.gz: 0f5fd6a62da416ea9cdccd6d6370050509846001fec09b066b63ac8c79918106
4
+ data.tar.gz: a792a173492ad869938ad623743af357e1a1ee6a8d7c85d2f591bcde7511d378
5
5
  SHA512:
6
- metadata.gz: 057d0b80e63baaae39146d5045ff33a1a152dcea0809aa27e59bf2e9e1bb08db846ef8146df7ce512b679612c05abf9777abd8c377156bee9cc2615d23000190
7
- data.tar.gz: 32378759cf7fec1f2f81f3d4896059fba2383e2c095e500adafeee43be6270a756a1d787ec89a3395ba66127de6e22afbe5dbd1d3d7d0d4de134bf498556f58e
6
+ metadata.gz: 4640ab8f5039e3e5b4a9135a11afe42738659bf41376f38f0db463f13d1086317dc9c9631b2fb378157f86a1a255d7a29a58cdf816fcc0fe1d045c6b537d1d4a
7
+ data.tar.gz: bae5c85f87d19d2320cccbc169a0b08bb5f4b56b565dd81a1002c904c5e5a9d4ac570c053fc88ee6163534051809b72931a0395ff4cc0882127c32ad7126a068
@@ -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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Kdep
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
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.5.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-10-10 00:00:00.000000000 Z
11
+ date: 2026-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: envspec