kamal 1.3.1 → 1.5.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kamal/cli/accessory.rb +38 -29
  3. data/lib/kamal/cli/app/boot.rb +67 -0
  4. data/lib/kamal/cli/app/prepare_assets.rb +24 -0
  5. data/lib/kamal/cli/app.rb +25 -67
  6. data/lib/kamal/cli/base.rb +23 -8
  7. data/lib/kamal/cli/env.rb +3 -5
  8. data/lib/kamal/cli/main.rb +7 -4
  9. data/lib/kamal/cli/prune.rb +6 -2
  10. data/lib/kamal/cli/server.rb +3 -1
  11. data/lib/kamal/cli/templates/deploy.yml +5 -1
  12. data/lib/kamal/cli/templates/sample_hooks/docker-setup.sample +7 -0
  13. data/lib/kamal/cli/traefik.rb +16 -13
  14. data/lib/kamal/commander/specifics.rb +49 -0
  15. data/lib/kamal/commander.rb +9 -33
  16. data/lib/kamal/commands/accessory.rb +2 -2
  17. data/lib/kamal/commands/app/assets.rb +12 -12
  18. data/lib/kamal/commands/app/cord.rb +4 -4
  19. data/lib/kamal/commands/app/execution.rb +10 -8
  20. data/lib/kamal/commands/app/images.rb +1 -1
  21. data/lib/kamal/commands/app/logging.rb +2 -2
  22. data/lib/kamal/commands/app.rb +38 -18
  23. data/lib/kamal/commands/auditor.rb +1 -1
  24. data/lib/kamal/commands/base.rb +12 -0
  25. data/lib/kamal/commands/builder/base.rb +22 -5
  26. data/lib/kamal/commands/builder/multiarch.rb +17 -9
  27. data/lib/kamal/commands/builder/native/cached.rb +7 -6
  28. data/lib/kamal/commands/builder/native/remote.rb +9 -9
  29. data/lib/kamal/commands/builder/native.rb +8 -7
  30. data/lib/kamal/commands/docker.rb +10 -1
  31. data/lib/kamal/commands/healthcheck.rb +0 -1
  32. data/lib/kamal/commands/hook.rb +1 -1
  33. data/lib/kamal/commands/lock.rb +19 -9
  34. data/lib/kamal/commands/prune.rb +4 -4
  35. data/lib/kamal/commands/registry.rb +4 -1
  36. data/lib/kamal/commands/server.rb +1 -1
  37. data/lib/kamal/commands/traefik.rb +10 -16
  38. data/lib/kamal/configuration/accessory.rb +10 -20
  39. data/lib/kamal/configuration/boot.rb +1 -1
  40. data/lib/kamal/configuration/builder.rb +11 -3
  41. data/lib/kamal/configuration/env.rb +40 -0
  42. data/lib/kamal/configuration/role.rb +23 -40
  43. data/lib/kamal/configuration.rb +53 -21
  44. data/lib/kamal/env_file.rb +12 -15
  45. data/lib/kamal/sshkit_with_ext.rb +1 -0
  46. data/lib/kamal/utils.rb +7 -3
  47. data/lib/kamal/version.rb +1 -1
  48. data/lib/kamal.rb +1 -1
  49. metadata +8 -3
@@ -3,21 +3,11 @@ class Kamal::EnvFile
3
3
  def initialize(env)
4
4
  @env = env
5
5
  end
6
-
6
+
7
7
  def to_s
8
8
  env_file = StringIO.new.tap do |contents|
9
- if (secrets = @env["secret"]).present?
10
- @env.fetch("secret", @env)&.each do |key|
11
- contents << docker_env_file_line(key, ENV.fetch(key))
12
- end
13
-
14
- @env["clear"]&.each do |key, value|
15
- contents << docker_env_file_line(key, value)
16
- end
17
- else
18
- @env.fetch("clear", @env)&.each do |key, value|
19
- contents << docker_env_file_line(key, value)
20
- end
9
+ @env.each do |key, value|
10
+ contents << docker_env_file_line(key, value)
21
11
  end
22
12
  end.string
23
13
 
@@ -26,14 +16,21 @@ class Kamal::EnvFile
26
16
  end
27
17
 
28
18
  alias to_str to_s
29
-
19
+
30
20
  private
31
21
  def docker_env_file_line(key, value)
32
- "#{key.to_s}=#{escape_docker_env_file_value(value)}\n"
22
+ "#{key}=#{escape_docker_env_file_value(value)}\n"
33
23
  end
34
24
 
35
25
  # Escape a value to make it safe to dump in a docker file.
36
26
  def escape_docker_env_file_value(value)
27
+ # keep non-ascii(UTF-8) characters as it is
28
+ value.to_s.scan(/[\x00-\x7F]+|[^\x00-\x7F]+/).map do |part|
29
+ part.ascii_only? ? escape_docker_env_file_ascii_value(part) : part
30
+ end.join
31
+ end
32
+
33
+ def escape_docker_env_file_ascii_value(value)
37
34
  # Doublequotes are treated literally in docker env files
38
35
  # so remove leading and trailing ones and unescape any others
39
36
  value.to_s.dump[1..-2].gsub(/\\"/, "\"")
@@ -1,5 +1,6 @@
1
1
  require "sshkit"
2
2
  require "sshkit/dsl"
3
+ require "net/scp"
3
4
  require "active_support/core_ext/hash/deep_merge"
4
5
  require "json"
5
6
 
data/lib/kamal/utils.rb CHANGED
@@ -9,7 +9,7 @@ module Kamal::Utils
9
9
  if value.present?
10
10
  attr = "#{key}=#{escape_shell_value(value)}"
11
11
  attr = self.sensitive(attr, redaction: "#{key}=[REDACTED]") if sensitive
12
- [ argument, attr]
12
+ [ argument, attr ]
13
13
  else
14
14
  [ argument, key ]
15
15
  end
@@ -29,7 +29,7 @@ module Kamal::Utils
29
29
 
30
30
  # Flattens a one-to-many structure into an array of two-element arrays each containing a key-value pair
31
31
  def flatten_args(args)
32
- args.flat_map { |key, value| value.try(:map) { |entry| [key, entry] } || [ [ key, value ] ] }
32
+ args.flat_map { |key, value| value.try(:map) { |entry| [ key, entry ] } || [ [ key, value ] ] }
33
33
  end
34
34
 
35
35
  # Marks sensitive values for redaction in logs and human-visible output.
@@ -66,7 +66,7 @@ module Kamal::Utils
66
66
  Array(filters).select do |filter|
67
67
  matches += Array(items).select do |item|
68
68
  # Only allow * for a wildcard
69
- pattern = Regexp.escape(filter).gsub('\*', '.*')
69
+ pattern = Regexp.escape(filter).gsub('\*', ".*")
70
70
  # items are roles or hosts
71
71
  (item.respond_to?(:name) ? item.name : item).match(/^#{pattern}$/)
72
72
  end
@@ -74,4 +74,8 @@ module Kamal::Utils
74
74
 
75
75
  matches
76
76
  end
77
+
78
+ def stable_sort!(elements, &block)
79
+ elements.sort_by!.with_index { |element, index| [ block.call(element), index ] }
80
+ end
77
81
  end
data/lib/kamal/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Kamal
2
- VERSION = "1.3.1"
2
+ VERSION = "1.5.0"
3
3
  end
data/lib/kamal.rb CHANGED
@@ -5,6 +5,6 @@ require "active_support"
5
5
  require "zeitwerk"
6
6
 
7
7
  loader = Zeitwerk::Loader.for_gem
8
- loader.ignore("#{__dir__}/kamal/sshkit_with_ext.rb")
8
+ loader.ignore(File.join(__dir__, "kamal", "sshkit_with_ext.rb"))
9
9
  loader.setup
10
10
  loader.eager_load # We need all commands loaded.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kamal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-10 00:00:00.000000000 Z
11
+ date: 2024-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -206,6 +206,8 @@ files:
206
206
  - lib/kamal/cli.rb
207
207
  - lib/kamal/cli/accessory.rb
208
208
  - lib/kamal/cli/app.rb
209
+ - lib/kamal/cli/app/boot.rb
210
+ - lib/kamal/cli/app/prepare_assets.rb
209
211
  - lib/kamal/cli/base.rb
210
212
  - lib/kamal/cli/build.rb
211
213
  - lib/kamal/cli/env.rb
@@ -217,6 +219,7 @@ files:
217
219
  - lib/kamal/cli/registry.rb
218
220
  - lib/kamal/cli/server.rb
219
221
  - lib/kamal/cli/templates/deploy.yml
222
+ - lib/kamal/cli/templates/sample_hooks/docker-setup.sample
220
223
  - lib/kamal/cli/templates/sample_hooks/post-deploy.sample
221
224
  - lib/kamal/cli/templates/sample_hooks/post-traefik-reboot.sample
222
225
  - lib/kamal/cli/templates/sample_hooks/pre-build.sample
@@ -226,6 +229,7 @@ files:
226
229
  - lib/kamal/cli/templates/template.env
227
230
  - lib/kamal/cli/traefik.rb
228
231
  - lib/kamal/commander.rb
232
+ - lib/kamal/commander/specifics.rb
229
233
  - lib/kamal/commands.rb
230
234
  - lib/kamal/commands/accessory.rb
231
235
  - lib/kamal/commands/app.rb
@@ -256,6 +260,7 @@ files:
256
260
  - lib/kamal/configuration/accessory.rb
257
261
  - lib/kamal/configuration/boot.rb
258
262
  - lib/kamal/configuration/builder.rb
263
+ - lib/kamal/configuration/env.rb
259
264
  - lib/kamal/configuration/role.rb
260
265
  - lib/kamal/configuration/ssh.rb
261
266
  - lib/kamal/configuration/sshkit.rb
@@ -286,7 +291,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
291
  - !ruby/object:Gem::Version
287
292
  version: '0'
288
293
  requirements: []
289
- rubygems_version: 3.5.1
294
+ rubygems_version: 3.5.6
290
295
  signing_key:
291
296
  specification_version: 4
292
297
  summary: Deploy web apps in containers to servers running Docker with zero downtime.