kamal 1.4.0 → 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.
- checksums.yaml +4 -4
- data/lib/kamal/cli/accessory.rb +3 -2
- data/lib/kamal/cli/app/boot.rb +67 -0
- data/lib/kamal/cli/app/prepare_assets.rb +24 -0
- data/lib/kamal/cli/app.rb +20 -61
- data/lib/kamal/cli/base.rb +21 -7
- data/lib/kamal/cli/env.rb +3 -3
- data/lib/kamal/cli/main.rb +1 -1
- data/lib/kamal/cli/templates/deploy.yml +1 -1
- data/lib/kamal/cli/templates/sample_hooks/docker-setup.sample +0 -0
- data/lib/kamal/cli/traefik.rb +15 -12
- data/lib/kamal/commander/specifics.rb +49 -0
- data/lib/kamal/commander.rb +9 -33
- data/lib/kamal/commands/accessory.rb +2 -2
- data/lib/kamal/commands/app/assets.rb +4 -4
- data/lib/kamal/commands/app/cord.rb +2 -2
- data/lib/kamal/commands/app/execution.rb +8 -6
- data/lib/kamal/commands/app/images.rb +1 -1
- data/lib/kamal/commands/app.rb +29 -8
- data/lib/kamal/commands/auditor.rb +1 -1
- data/lib/kamal/commands/base.rb +5 -1
- data/lib/kamal/commands/builder/base.rb +14 -4
- data/lib/kamal/commands/builder/multiarch.rb +9 -9
- data/lib/kamal/commands/builder/native/cached.rb +7 -6
- data/lib/kamal/commands/builder/native/remote.rb +9 -9
- data/lib/kamal/commands/builder/native.rb +8 -7
- data/lib/kamal/commands/healthcheck.rb +0 -1
- data/lib/kamal/commands/hook.rb +1 -1
- data/lib/kamal/commands/lock.rb +19 -9
- data/lib/kamal/commands/prune.rb +2 -2
- data/lib/kamal/commands/server.rb +1 -1
- data/lib/kamal/commands/traefik.rb +8 -14
- data/lib/kamal/configuration/accessory.rb +9 -19
- data/lib/kamal/configuration/boot.rb +1 -1
- data/lib/kamal/configuration/builder.rb +7 -3
- data/lib/kamal/configuration/env.rb +40 -0
- data/lib/kamal/configuration/role.rb +12 -42
- data/lib/kamal/configuration.rb +20 -8
- data/lib/kamal/env_file.rb +12 -15
- data/lib/kamal/utils.rb +7 -3
- data/lib/kamal/version.rb +1 -1
- data/lib/kamal.rb +1 -1
- metadata +6 -2
data/lib/kamal/configuration.rb
CHANGED
@@ -6,7 +6,7 @@ require "erb"
|
|
6
6
|
require "net/ssh/proxy/jump"
|
7
7
|
|
8
8
|
class Kamal::Configuration
|
9
|
-
delegate :service, :image, :servers, :
|
9
|
+
delegate :service, :image, :servers, :labels, :registry, :stop_wait_time, :hooks_path, :logging, to: :raw_config, allow_nil: true
|
10
10
|
delegate :argumentize, :optionize, to: Kamal::Utils
|
11
11
|
|
12
12
|
attr_reader :destination, :raw_config
|
@@ -88,7 +88,7 @@ class Kamal::Configuration
|
|
88
88
|
|
89
89
|
|
90
90
|
def all_hosts
|
91
|
-
roles.flat_map(&:hosts).uniq
|
91
|
+
(roles + accessories).flat_map(&:hosts).uniq
|
92
92
|
end
|
93
93
|
|
94
94
|
def primary_host
|
@@ -128,7 +128,11 @@ class Kamal::Configuration
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def latest_image
|
131
|
-
"#{repository}
|
131
|
+
"#{repository}:#{latest_tag}"
|
132
|
+
end
|
133
|
+
|
134
|
+
def latest_tag
|
135
|
+
[ "latest", *destination ].join("-")
|
132
136
|
end
|
133
137
|
|
134
138
|
def service_with_version
|
@@ -216,12 +220,17 @@ class Kamal::Configuration
|
|
216
220
|
raw_config.hooks_path || ".kamal/hooks"
|
217
221
|
end
|
218
222
|
|
223
|
+
def asset_path
|
224
|
+
raw_config.asset_path
|
225
|
+
end
|
226
|
+
|
227
|
+
|
219
228
|
def host_env_directory
|
220
|
-
"
|
229
|
+
File.join(run_directory, "env")
|
221
230
|
end
|
222
231
|
|
223
|
-
def
|
224
|
-
raw_config.
|
232
|
+
def env
|
233
|
+
raw_config.env || {}
|
225
234
|
end
|
226
235
|
|
227
236
|
|
@@ -292,7 +301,7 @@ class Kamal::Configuration
|
|
292
301
|
end
|
293
302
|
|
294
303
|
def ensure_valid_service_name
|
295
|
-
raise ArgumentError, "Service name can only include alphanumeric characters, hyphens, and underscores" unless raw_config[:service] =~ /^[a-z0-9_-]+$/
|
304
|
+
raise ArgumentError, "Service name can only include alphanumeric characters, hyphens, and underscores" unless raw_config[:service] =~ /^[a-z0-9_-]+$/i
|
296
305
|
|
297
306
|
true
|
298
307
|
end
|
@@ -319,7 +328,10 @@ class Kamal::Configuration
|
|
319
328
|
def git_version
|
320
329
|
@git_version ||=
|
321
330
|
if Kamal::Git.used?
|
322
|
-
|
331
|
+
if Kamal::Git.uncommitted_changes.present? && !builder.git_archive?
|
332
|
+
uncommitted_suffix = "_uncommitted_#{SecureRandom.hex(8)}"
|
333
|
+
end
|
334
|
+
[ Kamal::Git.revision, uncommitted_suffix ].compact.join
|
323
335
|
else
|
324
336
|
raise "Can't use commit hash as version, no git repository found in #{Dir.pwd}"
|
325
337
|
end
|
data/lib/kamal/env_file.rb
CHANGED
@@ -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
|
-
|
10
|
-
|
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
|
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(/\\"/, "\"")
|
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
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("
|
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.
|
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-
|
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
|
@@ -227,6 +229,7 @@ files:
|
|
227
229
|
- lib/kamal/cli/templates/template.env
|
228
230
|
- lib/kamal/cli/traefik.rb
|
229
231
|
- lib/kamal/commander.rb
|
232
|
+
- lib/kamal/commander/specifics.rb
|
230
233
|
- lib/kamal/commands.rb
|
231
234
|
- lib/kamal/commands/accessory.rb
|
232
235
|
- lib/kamal/commands/app.rb
|
@@ -257,6 +260,7 @@ files:
|
|
257
260
|
- lib/kamal/configuration/accessory.rb
|
258
261
|
- lib/kamal/configuration/boot.rb
|
259
262
|
- lib/kamal/configuration/builder.rb
|
263
|
+
- lib/kamal/configuration/env.rb
|
260
264
|
- lib/kamal/configuration/role.rb
|
261
265
|
- lib/kamal/configuration/ssh.rb
|
262
266
|
- lib/kamal/configuration/sshkit.rb
|