kamal 1.5.1 → 1.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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kamal/cli/accessory.rb +27 -22
  3. data/lib/kamal/cli/app/boot.rb +70 -18
  4. data/lib/kamal/cli/app/prepare_assets.rb +1 -1
  5. data/lib/kamal/cli/app.rb +57 -47
  6. data/lib/kamal/cli/base.rb +26 -28
  7. data/lib/kamal/cli/build/clone.rb +61 -0
  8. data/lib/kamal/cli/build.rb +58 -50
  9. data/lib/kamal/cli/env.rb +5 -5
  10. data/lib/kamal/cli/healthcheck/barrier.rb +31 -0
  11. data/lib/kamal/cli/healthcheck/error.rb +2 -0
  12. data/lib/kamal/cli/healthcheck/poller.rb +4 -5
  13. data/lib/kamal/cli/main.rb +36 -43
  14. data/lib/kamal/cli/prune.rb +3 -3
  15. data/lib/kamal/cli/server.rb +39 -15
  16. data/lib/kamal/cli/traefik.rb +8 -8
  17. data/lib/kamal/commander/specifics.rb +1 -1
  18. data/lib/kamal/commander.rb +6 -6
  19. data/lib/kamal/commands/app/containers.rb +8 -0
  20. data/lib/kamal/commands/app/execution.rb +3 -3
  21. data/lib/kamal/commands/app/logging.rb +2 -2
  22. data/lib/kamal/commands/app.rb +6 -5
  23. data/lib/kamal/commands/base.rb +2 -3
  24. data/lib/kamal/commands/builder/base.rb +6 -12
  25. data/lib/kamal/commands/builder/clone.rb +28 -0
  26. data/lib/kamal/commands/builder/multiarch.rb +9 -9
  27. data/lib/kamal/commands/builder/native/cached.rb +6 -7
  28. data/lib/kamal/commands/builder/native/remote.rb +9 -9
  29. data/lib/kamal/commands/builder/native.rb +6 -7
  30. data/lib/kamal/commands/builder.rb +2 -0
  31. data/lib/kamal/configuration/builder.rb +33 -2
  32. data/lib/kamal/configuration/env/tag.rb +12 -0
  33. data/lib/kamal/configuration/env.rb +1 -1
  34. data/lib/kamal/configuration/role.rb +29 -6
  35. data/lib/kamal/configuration.rb +14 -2
  36. data/lib/kamal/git.rb +4 -0
  37. data/lib/kamal/sshkit_with_ext.rb +36 -0
  38. data/lib/kamal/version.rb +1 -1
  39. metadata +18 -10
  40. data/lib/kamal/cli/healthcheck.rb +0 -21
  41. data/lib/kamal/commands/app.rb.orig +0 -127
  42. data/lib/kamal/commands/healthcheck.rb +0 -59
@@ -1,127 +0,0 @@
1
- class Kamal::Commands::App < Kamal::Commands::Base
2
- include Assets, Containers, Cord, Execution, Images, Logging
3
-
4
- ACTIVE_DOCKER_STATUSES = [ :running, :restarting ]
5
-
6
- attr_reader :role
7
-
8
- def initialize(config, role: nil)
9
- super(config)
10
- @role = role
11
- end
12
-
13
- def run(hostname: nil)
14
- docker :run,
15
- "--detach",
16
- "--restart unless-stopped",
17
- "--name", container_name,
18
- *([ "--hostname", hostname ] if hostname),
19
- "-e", "KAMAL_CONTAINER_NAME=\"#{container_name}\"",
20
- "-e", "KAMAL_VERSION=\"#{config.version}\"",
21
- *role.env_args,
22
- *role.health_check_args,
23
- *role.logging_args,
24
- *config.volume_args,
25
- *role.asset_volume_args,
26
- *role.label_args,
27
- *role.option_args,
28
- config.absolute_image,
29
- role.cmd
30
- end
31
-
32
- def start
33
- docker :start, container_name
34
- end
35
-
36
- def status(version:)
37
- pipe container_id_for_version(version), xargs(docker(:inspect, "--format", DOCKER_HEALTH_STATUS_FORMAT))
38
- end
39
-
40
- def stop(version: nil)
41
- pipe \
42
- version ? container_id_for_version(version) : current_running_container_id,
43
- xargs(config.stop_wait_time ? docker(:stop, "-t", config.stop_wait_time) : docker(:stop))
44
- end
45
-
46
- def info
47
- docker :ps, *filter_args
48
- end
49
-
50
-
51
- def current_running_container_id
52
- current_running_container(format: "--quiet")
53
- end
54
-
55
- def container_id_for_version(version, only_running: false)
56
- container_id_for(container_name: container_name(version), only_running: only_running)
57
- end
58
-
59
- <<<<<<< HEAD
60
- def current_running_version
61
- pipe \
62
- current_running_container(format: "--format '{{.Names}}'"),
63
- extract_version_from_name
64
- =======
65
- def current_running_version(prefix: nil)
66
- list_versions("--latest", statuses: ACTIVE_DOCKER_STATUSES)
67
- >>>>>>> 4dc8aca (Rename roles)
68
- end
69
-
70
- def list_versions(*docker_args, statuses: nil)
71
- pipe \
72
- docker(:ps, *filter_args(statuses: statuses), *docker_args, "--format", '"{{.Names}}"'),
73
- extract_version_from_name
74
- end
75
-
76
-
77
- def make_env_directory
78
- make_directory role.env.secrets_directory
79
- end
80
-
81
- def remove_env_file
82
- [ :rm, "-f", role.env.secrets_file ]
83
- end
84
-
85
-
86
- private
87
- def container_name(version = nil)
88
- [ role.container_prefix, version || config.version ].compact.join("-")
89
- end
90
-
91
- def latest_image_id
92
- docker :image, :ls, *argumentize("--filter", "reference=#{config.latest_image}"), "--format", "'{{.ID}}'"
93
- end
94
-
95
- def current_running_container(format:)
96
- pipe \
97
- shell(chain(latest_image_container(format: format), latest_container(format: format))),
98
- [ :head, "-1" ]
99
- end
100
-
101
- def latest_image_container(format:)
102
- latest_container format: format, filters: [ "ancestor=$(#{latest_image_id.join(" ")})" ]
103
- end
104
-
105
- def latest_container(format:, filters: nil)
106
- docker :ps, "--latest", *format, *filter_args(statuses: ACTIVE_DOCKER_STATUSES), argumentize("--filter", filters)
107
- end
108
-
109
- def filter_args(statuses: nil)
110
- argumentize "--filter", filters(statuses: statuses)
111
- end
112
-
113
- def extract_version_from_name
114
- # Extract SHA from "service-role-dest-SHA"
115
- %(while read line; do echo ${line##{role.container_prefix}-}; done)
116
- end
117
-
118
- def filters(statuses: nil)
119
- [ "label=service=#{config.service}" ].tap do |filters|
120
- filters << "label=destination=#{config.destination}" if config.destination
121
- filters << "label=role=#{role}" if role
122
- statuses&.each do |status|
123
- filters << "status=#{status}"
124
- end
125
- end
126
- end
127
- end
@@ -1,59 +0,0 @@
1
- class Kamal::Commands::Healthcheck < Kamal::Commands::Base
2
- def run
3
- primary = config.role(config.primary_role)
4
-
5
- docker :run,
6
- "--detach",
7
- "--name", container_name_with_version,
8
- "--publish", "#{exposed_port}:#{config.healthcheck["port"]}",
9
- "--label", "service=#{config.healthcheck_service}",
10
- "-e", "KAMAL_CONTAINER_NAME=\"#{config.healthcheck_service}\"",
11
- *primary.env_args,
12
- *primary.health_check_args(cord: false),
13
- *config.volume_args,
14
- *primary.option_args,
15
- config.absolute_image,
16
- primary.cmd
17
- end
18
-
19
- def status
20
- pipe container_id, xargs(docker(:inspect, "--format", DOCKER_HEALTH_STATUS_FORMAT))
21
- end
22
-
23
- def container_health_log
24
- pipe container_id, xargs(docker(:inspect, "--format", DOCKER_HEALTH_LOG_FORMAT))
25
- end
26
-
27
- def logs
28
- pipe container_id, xargs(docker(:logs, "--tail", log_lines, "2>&1"))
29
- end
30
-
31
- def stop
32
- pipe container_id, xargs(docker(:stop))
33
- end
34
-
35
- def remove
36
- pipe container_id, xargs(docker(:container, :rm))
37
- end
38
-
39
- private
40
- def container_name_with_version
41
- "#{config.healthcheck_service}-#{config.version}"
42
- end
43
-
44
- def container_id
45
- container_id_for(container_name: container_name_with_version)
46
- end
47
-
48
- def health_url
49
- "http://localhost:#{exposed_port}#{config.healthcheck["path"]}"
50
- end
51
-
52
- def exposed_port
53
- config.healthcheck["exposed_port"]
54
- end
55
-
56
- def log_lines
57
- config.healthcheck["log_lines"]
58
- end
59
- end