diff --git a/lib/kamal/cli/templates/deploy.yml b/lib/kamal/cli/templates/deploy.yml index 44fa22941..6d356c606 100644 --- a/lib/kamal/cli/templates/deploy.yml +++ b/lib/kamal/cli/templates/deploy.yml @@ -91,3 +91,8 @@ registry: # Caution: there's no support for role renaming yet, so be careful to cleanup # the previous role on the deployed hosts. # primary_web_role: web + +# Controls if we abort when see a role with no hosts. Disabling this may be +# useful for more complex deploy configurations. +# +# allow_empty_roles: false diff --git a/lib/kamal/configuration.rb b/lib/kamal/configuration.rb index 5bf79ea6f..fd79d53ed 100644 --- a/lib/kamal/configuration.rb +++ b/lib/kamal/configuration.rb @@ -212,6 +212,11 @@ def primary_web_role raw_config.primary_web_role || "web" end + def allow_empty_roles? + raw_config.allow_empty_roles + end + + def valid? ensure_destination_if_required && ensure_required_keys_present && ensure_valid_kamal_version end @@ -259,12 +264,6 @@ def ensure_required_keys_present raise ArgumentError, "You must specify a password for the registry in config/deploy.yml (or set the ENV variable if that's used)" end - roles.each do |role| - if role.hosts.empty? - raise ArgumentError, "No servers specified for the #{role.name} role" - end - end - unless role_names.include?(primary_web_role) raise ArgumentError, "The primary_web_role #{primary_web_role} isn't defined" end @@ -273,6 +272,18 @@ def ensure_required_keys_present raise ArgumentError, "Role #{primary_web_role} needs to have traefik enabled" end + if role(primary_web_role).hosts.empty? + raise ArgumentError, "No servers specified for the #{primary_web_role} primary_web_role" + end + + unless allow_empty_roles? + roles.each do |role| + if role.hosts.empty? + raise ArgumentError, "No servers specified for the #{role.name} role. You can ignore this with allow_empty_roles: true" + end + end + end + true end diff --git a/test/configuration_test.rb b/test/configuration_test.rb index 00612f24a..d141ad107 100644 --- a/test/configuration_test.rb +++ b/test/configuration_test.rb @@ -165,6 +165,16 @@ class ConfigurationTest < ActiveSupport::TestCase end end + test "allow_empty_roles" do + assert_silent do + Kamal::Configuration.new @deploy.merge(servers: { "web" => %w[ web ], "workers" => { "hosts" => %w[ ] } }, allow_empty_roles: true) + end + + assert_raises(ArgumentError) do + Kamal::Configuration.new @deploy.merge(servers: { "web" => %w[], "workers" => { "hosts" => %w[] } }, allow_empty_roles: true) + end + end + test "volume_args" do assert_equal ["--volume", "/local/path:/container/path"], @config.volume_args end