diff --git a/lib/kamal/cli/main.rb b/lib/kamal/cli/main.rb index c8641848..25272f3f 100644 --- a/lib/kamal/cli/main.rb +++ b/lib/kamal/cli/main.rb @@ -25,7 +25,7 @@ class Kamal::Cli::Main < Kamal::Cli::Base invoke_options = deploy_options say "Log into image registry...", :magenta - invoke "kamal:cli:registry:login", [], invoke_options + invoke "kamal:cli:registry:login", [], invoke_options.merge(skip_local: options[:skip_push]) if options[:skip_push] say "Pull app image...", :magenta @@ -197,7 +197,7 @@ class Kamal::Cli::Main < Kamal::Cli::Base invoke "kamal:cli:traefik:remove", [], options.without(:confirmed) invoke "kamal:cli:app:remove", [], options.without(:confirmed) invoke "kamal:cli:accessory:remove", [ "all" ], options - invoke "kamal:cli:registry:logout", [], options.without(:confirmed) + invoke "kamal:cli:registry:logout", [], options.without(:confirmed).merge(skip_local: true) end end end diff --git a/lib/kamal/cli/registry.rb b/lib/kamal/cli/registry.rb index a8b671ed..9d5d9d93 100644 --- a/lib/kamal/cli/registry.rb +++ b/lib/kamal/cli/registry.rb @@ -1,18 +1,17 @@ class Kamal::Cli::Registry < Kamal::Cli::Base desc "login", "Log in to registry locally and remotely" + option :skip_local, aliases: "-L", type: :boolean, default: false, desc: "Skip local login" + option :skip_remote, aliases: "-R", type: :boolean, default: false, desc: "Skip remote login" def login - run_locally { execute *KAMAL.registry.login } - on(KAMAL.hosts) { execute *KAMAL.registry.login } - # FIXME: This rescue needed? - rescue ArgumentError => e - puts e.message + run_locally { execute *KAMAL.registry.login } unless options[:skip_local] + on(KAMAL.hosts) { execute *KAMAL.registry.login } unless options[:skip_remote] end - desc "logout", "Log out of registry remotely" + desc "logout", "Log out of registry locally and remotely" + option :skip_local, aliases: "-L", type: :boolean, default: false, desc: "Skip local login" + option :skip_remote, aliases: "-R", type: :boolean, default: false, desc: "Skip remote login" def logout - on(KAMAL.hosts) { execute *KAMAL.registry.logout } - # FIXME: This rescue needed? - rescue ArgumentError => e - puts e.message + run_locally { execute *KAMAL.registry.logout } unless options[:skip_local] + on(KAMAL.hosts) { execute *KAMAL.registry.logout } unless options[:skip_remote] end end diff --git a/test/cli/main_test.rb b/test/cli/main_test.rb index 4d74632f..40c11d39 100644 --- a/test/cli/main_test.rb +++ b/test/cli/main_test.rb @@ -22,7 +22,7 @@ class CliMainTest < CliTestCase Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:main:envify", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:accessory:boot", [ "all" ], invoke_options) # deploy - Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options) + Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options.merge(skip_local: true)) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:build:pull", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:traefik:boot", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:app:stale_containers", [], invoke_options.merge(stop: true)) @@ -46,7 +46,7 @@ class CliMainTest < CliTestCase test "deploy" do invoke_options = { "config_file" => "test/fixtures/deploy_simple.yml", "version" => "999", "skip_hooks" => false, "verbose" => true } - Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options) + Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options.merge(skip_local: false)) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:build:deliver", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:traefik:boot", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:app:stale_containers", [], invoke_options.merge(stop: true)) @@ -71,7 +71,7 @@ class CliMainTest < CliTestCase test "deploy with skip_push" do invoke_options = { "config_file" => "test/fixtures/deploy_simple.yml", "version" => "999", "skip_hooks" => false } - Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options) + Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options.merge(skip_local: true)) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:build:pull", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:traefik:boot", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:app:stale_containers", [], invoke_options.merge(stop: true)) @@ -159,10 +159,10 @@ class CliMainTest < CliTestCase end test "deploy errors during outside section leave remove lock" do - invoke_options = { "config_file" => "test/fixtures/deploy_simple.yml", "version" => "999", "skip_hooks" => false } + invoke_options = { "config_file" => "test/fixtures/deploy_simple.yml", "version" => "999", "skip_hooks" => false, :skip_local => false } Kamal::Cli::Main.any_instance.expects(:invoke) - .with("kamal:cli:registry:login", [], invoke_options) + .with("kamal:cli:registry:login", [], invoke_options.merge(skip_local: false)) .raises(RuntimeError) assert_not KAMAL.holding_lock? @@ -175,7 +175,7 @@ class CliMainTest < CliTestCase test "deploy with skipped hooks" do invoke_options = { "config_file" => "test/fixtures/deploy_simple.yml", "version" => "999", "skip_hooks" => true } - Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options) + Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options.merge(skip_local: false)) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:build:deliver", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:traefik:boot", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:app:stale_containers", [], invoke_options.merge(stop: true)) @@ -192,7 +192,7 @@ class CliMainTest < CliTestCase Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:healthcheck:perform", [], invoke_options).never - Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options) + Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options.merge(skip_local: false)) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:build:deliver", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:traefik:boot", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:app:stale_containers", [], invoke_options.merge(stop: true)) @@ -205,7 +205,7 @@ class CliMainTest < CliTestCase test "deploy with missing secrets" do invoke_options = { "config_file" => "test/fixtures/deploy_with_secrets.yml", "version" => "999", "skip_hooks" => false } - Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options) + Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:registry:login", [], invoke_options.merge(skip_local: false)) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:build:deliver", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:traefik:boot", [], invoke_options) Kamal::Cli::Main.any_instance.expects(:invoke).with("kamal:cli:app:stale_containers", [], invoke_options.merge(stop: true)) diff --git a/test/cli/registry_test.rb b/test/cli/registry_test.rb index 64f7a7a9..c5423fe7 100644 --- a/test/cli/registry_test.rb +++ b/test/cli/registry_test.rb @@ -8,12 +8,41 @@ class CliRegistryTest < CliTestCase end end + test "login skip local" do + run_command("login", "-L").tap do |output| + assert_no_match /docker login -u \[REDACTED\] -p \[REDACTED\] as .*@localhost/, output + assert_match /docker login -u \[REDACTED\] -p \[REDACTED\] on 1.1.1.\d/, output + end + end + + test "login skip remote" do + run_command("login", "-R").tap do |output| + assert_match /docker login -u \[REDACTED\] -p \[REDACTED\] as .*@localhost/, output + assert_no_match /docker login -u \[REDACTED\] -p \[REDACTED\] on 1.1.1.\d/, output + end + end + test "logout" do run_command("logout").tap do |output| + assert_match /docker logout as .*@localhost/, output assert_match /docker logout on 1.1.1.\d/, output end end + test "logout skip local" do + run_command("logout", "-L").tap do |output| + assert_no_match /docker logout as .*@localhost/, output + assert_match /docker logout on 1.1.1.\d/, output + end + end + + test "logout skip remote" do + run_command("logout", "-R").tap do |output| + assert_match /docker logout as .*@localhost/, output + assert_no_match /docker logout on 1.1.1.\d/, output + end + end + private def run_command(*command) stdouted { Kamal::Cli::Registry.start([ *command, "-c", "test/fixtures/deploy_with_accessories.yml" ]) }