From 8ae5331d97f58c633f2887f9a28401ce6d2880f9 Mon Sep 17 00:00:00 2001 From: Jacopo Date: Thu, 6 Apr 2023 11:26:15 +0200 Subject: [PATCH] Boot stop all the old containers --- lib/mrsk/cli/app.rb | 16 +++++++++++----- lib/mrsk/cli/main.rb | 6 ------ test/cli/app_test.rb | 17 +++++++++++------ test/cli/main_test.rb | 6 ------ 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/lib/mrsk/cli/app.rb b/lib/mrsk/cli/app.rb index 641bceb8..9c98ba6b 100644 --- a/lib/mrsk/cli/app.rb +++ b/lib/mrsk/cli/app.rb @@ -8,13 +8,13 @@ class Mrsk::Cli::App < Mrsk::Cli::Base cli = self - on(MRSK.hosts) do |host| + MRSK.hosts.each do |host| roles = MRSK.roles_on(host) roles.each do |role| - execute *MRSK.auditor(role: role).record("Booted app version #{version}"), verbosity: :debug + on(host) do + execute *MRSK.auditor(role: role).record("Booted app version #{version}"), verbosity: :debug - begin if capture_with_info(*MRSK.app(role: role).container_id_for_version(version)).present? tmp_version = "#{version}_#{SecureRandom.hex(8)}" info "Renaming container #{version} to #{tmp_version} as already deployed on #{host}" @@ -22,10 +22,16 @@ class Mrsk::Cli::App < Mrsk::Cli::Base execute *MRSK.app(role: role).rename_container(version: version, new_version: tmp_version) end - old_version = capture_with_info(*MRSK.app(role: role).current_running_version, raise_on_non_zero_exit: false).strip execute *MRSK.app(role: role).run sleep MRSK.config.readiness_delay - execute *MRSK.app(role: role).stop(version: old_version), raise_on_non_zero_exit: false if old_version.present? + end + + old_versions = list_versions(host: host, role: role, only_old: true) + old_versions.each do |old_version| + on(host) do + info "Stopping old container with version #{old_version}" + execute *MRSK.app(role: role).stop(version: old_version), raise_on_non_zero_exit: false + end end end end diff --git a/lib/mrsk/cli/main.rb b/lib/mrsk/cli/main.rb index 11e77b22..83f71c34 100644 --- a/lib/mrsk/cli/main.rb +++ b/lib/mrsk/cli/main.rb @@ -37,9 +37,6 @@ class Mrsk::Cli::Main < Mrsk::Cli::Base say "Ensure app can pass healthcheck...", :magenta invoke "mrsk:cli:healthcheck:perform", [], 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 say "Prune old containers and images...", :magenta @@ -68,9 +65,6 @@ class Mrsk::Cli::Main < Mrsk::Cli::Base say "Ensure app can pass healthcheck...", :magenta invoke "mrsk:cli:healthcheck:perform", [], 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 597fa294..245b7246 100644 --- a/test/cli/app_test.rb +++ b/test/cli/app_test.rb @@ -2,8 +2,13 @@ require_relative "cli_test_case" class CliAppTest < CliTestCase test "boot" do - # Stub current version fetch - SSHKit::Backend::Abstract.any_instance.stubs(:capture).returns("123") # old version + # current version not running yet + SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) + .with(:docker, :container, :ls, "--all", "--filter", "name=^app-web-latest$", "--quiet") + + 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("124\n123") # running + old version run_command("boot").tap do |output| assert_match "docker run --detach --restart unless-stopped", output @@ -16,17 +21,17 @@ class CliAppTest < CliTestCase SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) .with(:docker, :container, :ls, "--all", "--filter", "name=^app-web-latest$", "--quiet") - .returns("12345678") # running version + .returns("12345678") # current version already running SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info) - .with(:docker, :ps, "--filter", "label=service=app", "--filter", "label=role=web", "--filter", "status=running", "--latest", "--format", "\"{{.Names}}\"", "|", "grep -oE \"\\-[^-]+$\"", "|", "cut -c 2-", raise_on_non_zero_exit: false) - .returns("123") # old version + .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("123\n12345678_1") # running + renamed version run_command("boot").tap do |output| assert_match /Renaming container .* to .* as already deployed on 1.1.1.1/, output # Rename assert_match /docker rename .* .*/, output assert_match "docker run --detach --restart unless-stopped", output - assert_match "docker container ls --all --filter name=^app-web-123$ --quiet | xargs docker stop", output + assert_match "docker container ls --all --filter name=^app-web-12345678_1$ --quiet | xargs docker stop", output end ensure Thread.report_on_exception = true diff --git a/test/cli/main_test.rb b/test/cli/main_test.rb index e396439a..112e9f67 100644 --- a/test/cli/main_test.rb +++ b/test/cli/main_test.rb @@ -17,7 +17,6 @@ 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", [], 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 +26,6 @@ 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 old containers/, output assert_match /Prune old containers and images/, output end end @@ -40,7 +38,6 @@ 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", [], 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 +48,6 @@ 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 old containers/, output assert_match /Prune old containers and images/, output assert_match /Releasing the deploy lock/, output end @@ -62,7 +58,6 @@ 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", [], 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 +71,6 @@ 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", [], 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|