diff --git a/lib/mrsk/cli/app.rb b/lib/mrsk/cli/app.rb index 428fb13f..641bceb8 100644 --- a/lib/mrsk/cli/app.rb +++ b/lib/mrsk/cli/app.rb @@ -48,32 +48,18 @@ class Mrsk::Cli::App < Mrsk::Cli::Base end desc "stop", "Stop app container on servers" + option :only_old, aliases: "-o", type: :boolean, default: false, desc: "Stop only old containers" def stop with_lock do MRSK.hosts.each do |host| roles = MRSK.roles_on(host) roles.each do |role| - on(host) { execute *MRSK.auditor(role: role).record("Stopped app"), verbosity: :debug } - all_versions = list_versions(host: host, role: role) - all_versions.each do |version| - on(host) { execute *MRSK.app(role: role).stop(version: version), raise_on_non_zero_exit: false } - end - end - end - end - end + audit_record = options[:only_old] ? "Stopped old containers" : "Stopped app" + on(host) { execute *MRSK.auditor(role: role).record(audit_record), verbosity: :debug } - desc "stop_stale_containers", "Stop all app stale containers" - def stop_stale_containers - with_lock do - MRSK.hosts.each do |host| - roles = MRSK.roles_on(host) - - roles.each do |role| - stale_versions = list_versions(host: host, role: role).drop(1) - stale_versions.each do |version| - say "Stopping stale container with version #{version}", :red + versions = list_versions(host: host, role: role, only_old: options[:only_old]) + versions.each do |version| on(host) { execute *MRSK.app(role: role).stop(version: version), raise_on_non_zero_exit: false } end end @@ -258,10 +244,10 @@ class Mrsk::Cli::App < Mrsk::Cli::Base list_versions(host: host, status: :running).shift.presence end - def list_versions(host:, role: nil, status: nil) + def list_versions(host:, role: nil, status: nil, only_old: false) versions = nil on(host) { versions = capture_with_info(*MRSK.app(role: role).list_versions(status: status), raise_on_non_zero_exit: false).split("\n").map(&:strip) } - versions + only_old ? versions.drop(1) : versions end def version_or_latest diff --git a/lib/mrsk/cli/main.rb b/lib/mrsk/cli/main.rb index ac6a54d6..11e77b22 100644 --- a/lib/mrsk/cli/main.rb +++ b/lib/mrsk/cli/main.rb @@ -37,8 +37,8 @@ class Mrsk::Cli::Main < Mrsk::Cli::Base say "Ensure app can pass healthcheck...", :magenta invoke "mrsk:cli:healthcheck:perform", [], invoke_options - say "Stop stale containers...", :magenta - invoke "mrsk:cli:app:stop_stale_containers", [], invoke_options + say "Stop old containers...", :magenta + invoke "mrsk:cli:app:stop", [], invoke_options.merge({ "only_old" => true }) invoke "mrsk:cli:app:boot", [], invoke_options @@ -68,8 +68,8 @@ class Mrsk::Cli::Main < Mrsk::Cli::Base say "Ensure app can pass healthcheck...", :magenta invoke "mrsk:cli:healthcheck:perform", [], invoke_options - say "Stop stale containers...", :magenta - invoke "mrsk:cli:app:stop_stale_containers", [], invoke_options + say "Stop old containers...", :magenta + invoke "mrsk:cli:app:stop", [], invoke_options.merge({ "only_old" => true }) invoke "mrsk:cli:app:boot", [], invoke_options end diff --git a/test/cli/app_test.rb b/test/cli/app_test.rb index 3797b238..597fa294 100644 --- a/test/cli/app_test.rb +++ b/test/cli/app_test.rb @@ -48,13 +48,12 @@ class CliAppTest < CliTestCase end end - test "stop_stale_containers" do + test "stop only old containers" do SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) .with(:docker, :ps, "--filter", "label=service=app", "--filter", "label=role=web", "--format", "\"{{.Names}}\"", "|", "grep -oE \"\\-[^-]+$\"", "|", "cut -c 2-", raise_on_non_zero_exit: false) .returns("12345678\n87654321") - run_command("stop_stale_containers").tap do |output| - assert_match /Stopping stale container with version 87654321/, output + run_command("stop", '--only-old').tap do |output| assert_match /#{Regexp.escape("docker container ls --all --filter name=^app-web-87654321$ --quiet | xargs docker stop")}/, output end end diff --git a/test/cli/main_test.rb b/test/cli/main_test.rb index 3811f2c6..e396439a 100644 --- a/test/cli/main_test.rb +++ b/test/cli/main_test.rb @@ -17,7 +17,7 @@ class CliMainTest < CliTestCase Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:build:deliver", [], invoke_options) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:traefik:boot", [], invoke_options) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:healthcheck:perform", [], invoke_options) - Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:stop_stale_containers", [], invoke_options) + Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:stop", [], invoke_options.merge({ "only_old" => true })) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:boot", [], invoke_options) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:prune:all", [], invoke_options) @@ -27,7 +27,7 @@ class CliMainTest < CliTestCase assert_match /Build and push app image/, output assert_match /Ensure Traefik is running/, output assert_match /Ensure app can pass healthcheck/, output - assert_match /Stop stale containers/, output + assert_match /Stop old containers/, output assert_match /Prune old containers and images/, output end end @@ -40,7 +40,7 @@ class CliMainTest < CliTestCase Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:build:pull", [], invoke_options) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:traefik:boot", [], invoke_options) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:healthcheck:perform", [], invoke_options) - Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:stop_stale_containers", [], invoke_options) + Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:stop", [], invoke_options.merge({ "only_old" => true })) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:boot", [], invoke_options) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:prune:all", [], invoke_options) @@ -51,7 +51,7 @@ class CliMainTest < CliTestCase assert_match /Pull app image/, output assert_match /Ensure Traefik is running/, output assert_match /Ensure app can pass healthcheck/, output - assert_match /Stop stale containers/, output + assert_match /Stop old containers/, output assert_match /Prune old containers and images/, output assert_match /Releasing the deploy lock/, output end @@ -62,7 +62,7 @@ class CliMainTest < CliTestCase Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:build:deliver", [], invoke_options) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:healthcheck:perform", [], invoke_options) - Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:stop_stale_containers", [], invoke_options) + Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:stop", [], invoke_options.merge({ "only_old" => true })) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:boot", [], invoke_options) run_command("redeploy").tap do |output| @@ -76,7 +76,7 @@ class CliMainTest < CliTestCase Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:build:pull", [], invoke_options) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:healthcheck:perform", [], invoke_options) - Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:stop_stale_containers", [], invoke_options) + Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:stop", [], invoke_options.merge({ "only_old" => true })) Mrsk::Cli::Main.any_instance.expects(:invoke).with("mrsk:cli:app:boot", [], invoke_options) run_command("redeploy", "--skip_push").tap do |output|