Add KAMAL.app_hosts

KAMAL.hosts includes accessory and apps hosts. Add KAMAL.app_hosts which
does not include accessory only hosts and use it for app specific
commands.

Fixes:
- https://github.com/basecamp/kamal/issues/1059
- https://github.com/basecamp/kamal/issues/1148
This commit is contained in:
Donal McBreen
2025-04-18 11:52:55 +01:00
parent 5c71f2ba5a
commit e4e39c31e3
9 changed files with 54 additions and 39 deletions

View File

@@ -41,3 +41,8 @@ accessories:
cmd: sh -c 'echo "Starting busybox..."; trap exit term; while true; do sleep 1; done'
roles:
- web
busybox2:
service: custom-busybox
image: registry:4443/busybox:1.36.0
cmd: sh -c 'echo "Starting busybox..."; trap exit term; while true; do sleep 1; done'
host: vm3

View File

@@ -60,7 +60,7 @@ class MainTest < IntegrationTest
version = latest_app_version
assert_equal [ "web" ], config[:roles]
assert_equal [ "vm1", "vm2" ], config[:hosts]
assert_equal [ "vm1", "vm2", "vm3" ], config[:hosts]
assert_equal "vm1", config[:primary_host]
assert_equal version, config[:version]
assert_equal "registry:4443/app", config[:repository]
@@ -88,8 +88,6 @@ class MainTest < IntegrationTest
end
test "setup and remove" do
@app = "app_with_roles"
kamal :proxy, :boot_config, "set",
"--publish=false",
"--docker-options=label=traefik.http.services.kamal_proxy.loadbalancer.server.scheme=http",
@@ -172,21 +170,25 @@ class MainTest < IntegrationTest
assert_equal "200", Net::HTTP.get_response(URI.parse("http://#{app_host}:12345/versions/.hidden")).code
end
def vm1_image_ids
docker_compose("exec vm1 docker image ls -q", capture: true).strip.split("\n")
def image_ids(vm:)
docker_compose("exec #{vm} docker image ls -q", capture: true).strip.split("\n")
end
def vm1_container_ids
docker_compose("exec vm1 docker ps -a -q", capture: true).strip.split("\n")
def container_ids(vm:)
docker_compose("exec #{vm} docker ps -a -q", capture: true).strip.split("\n")
end
def assert_no_images_or_containers
assert vm1_image_ids.empty?
assert vm1_container_ids.empty?
[ :vm1, :vm2, :vm3 ].each do |vm|
assert image_ids(vm: vm).empty?
assert container_ids(vm: vm).empty?
end
end
def assert_images_and_containers
assert vm1_image_ids.any?
assert vm1_container_ids.any?
[ :vm1, :vm2, :vm3 ].each do |vm|
assert image_ids(vm: vm).any?
assert container_ids(vm: vm).any?
end
end
end