diff --git a/lib/kamal/configuration/accessory.rb b/lib/kamal/configuration/accessory.rb index 62979627..819f309b 100644 --- a/lib/kamal/configuration/accessory.rb +++ b/lib/kamal/configuration/accessory.rb @@ -32,7 +32,7 @@ class Kamal::Configuration::Accessory end def hosts - hosts_from_host || hosts_from_hosts || hosts_from_roles + hosts_from_host || hosts_from_hosts || hosts_from_roles || hosts_from_tags end def port @@ -206,6 +206,12 @@ class Kamal::Configuration::Accessory end end + def hosts_from_tags + if accessory_config.key?("tags") + accessory_config["tags"].flat_map { |tag| config.tag(tag)&.hosts } + end + end + def network accessory_config["network"] || DEFAULT_NETWORK end diff --git a/lib/kamal/configuration/docs/accessory.yml b/lib/kamal/configuration/docs/accessory.yml index 1852681e..7a77fd46 100644 --- a/lib/kamal/configuration/docs/accessory.yml +++ b/lib/kamal/configuration/docs/accessory.yml @@ -46,13 +46,15 @@ accessories: # Accessory hosts # - # Specify one of `host`, `hosts`, or `roles`: + # Specify one of `host`, `hosts`, `roles`, or `tags`: host: mysql-db1 hosts: - mysql-db1 - mysql-db2 roles: - mysql + tags: + - writer # Custom command # diff --git a/lib/kamal/configuration/validator/accessory.rb b/lib/kamal/configuration/validator/accessory.rb index 8b3d5b71..f870a27f 100644 --- a/lib/kamal/configuration/validator/accessory.rb +++ b/lib/kamal/configuration/validator/accessory.rb @@ -2,8 +2,8 @@ class Kamal::Configuration::Validator::Accessory < Kamal::Configuration::Validat def validate! super - if (config.keys & [ "host", "hosts", "roles" ]).size != 1 - error "specify one of `host`, `hosts` or `roles`" + if (config.keys & [ "host", "hosts", "roles", "tags" ]).size != 1 + error "specify one of `host`, `hosts`, `roles` or `tags`" end validate_docker_options!(config["options"]) diff --git a/test/configuration/accessory_test.rb b/test/configuration/accessory_test.rb index a652c2ac..ee6d6856 100644 --- a/test/configuration/accessory_test.rb +++ b/test/configuration/accessory_test.rb @@ -7,7 +7,7 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: { - "web" => [ "1.1.1.1", "1.1.1.2" ], + "web" => [ { "1.1.1.1" => "writer" }, { "1.1.1.2" => "reader" } ], "workers" => [ "1.1.1.3", "1.1.1.4" ] }, builder: { "arch" => "amd64" }, @@ -70,6 +70,10 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase "proxy" => { "host" => "monitoring.example.com" } + }, + "proxy" => { + "image" => "proxy:latest", + "tags" => [ "writer" ] } } } @@ -117,14 +121,14 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase end end - test "setting host, hosts and roles" do + test "setting host, hosts, roles and tags" do @deploy[:accessories]["mysql"]["hosts"] = [ "mysql-db1" ] @deploy[:accessories]["mysql"]["roles"] = [ "db" ] exception = assert_raises(Kamal::ConfigurationError) do Kamal::Configuration.new(@deploy) end - assert_equal "accessories/mysql: specify one of `host`, `hosts` or `roles`", exception.message + assert_equal "accessories/mysql: specify one of `host`, `hosts`, `roles` or `tags`", exception.message end test "all hosts" do