diff --git a/Gemfile.lock b/Gemfile.lock index d22fc04c..17b41693 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - mrsk (0.7.2) + mrsk (0.8.0) activesupport (>= 7.0) dotenv (~> 2.8) sshkit (~> 1.21) diff --git a/lib/mrsk/cli/build.rb b/lib/mrsk/cli/build.rb index 5e493a56..3e8912d7 100644 --- a/lib/mrsk/cli/build.rb +++ b/lib/mrsk/cli/build.rb @@ -30,6 +30,7 @@ class Mrsk::Cli::Build < Mrsk::Cli::Base def pull on(MRSK.hosts) do execute *MRSK.auditor.record("Pulled image with version #{MRSK.version}"), verbosity: :debug + execute *MRSK.builder.clean, raise_on_non_zero_exit: false execute *MRSK.builder.pull end end diff --git a/lib/mrsk/cli/healthcheck.rb b/lib/mrsk/cli/healthcheck.rb index a9fcf803..ffb0805d 100644 --- a/lib/mrsk/cli/healthcheck.rb +++ b/lib/mrsk/cli/healthcheck.rb @@ -1,4 +1,6 @@ class Mrsk::Cli::Healthcheck < Mrsk::Cli::Base + MAX_ATTEMPTS = 5 + default_command :perform desc "perform", "Health check current app version" @@ -8,18 +10,31 @@ class Mrsk::Cli::Healthcheck < Mrsk::Cli::Base execute *MRSK.healthcheck.run target = "Health check against #{MRSK.config.healthcheck["path"]}" + attempt = 1 - if capture_with_info(*MRSK.healthcheck.curl) == "200" - info "#{target} succeeded with 200 OK!" - else - # Catches 1xx, 2xx, 3xx - raise SSHKit::Command::Failed, "#{target} failed to return 200 OK!" + begin + status = capture_with_info(*MRSK.healthcheck.curl) + + if status == "200" + info "#{target} succeeded with 200 OK!" + else + raise "#{target} failed with status #{status}" + end + rescue SSHKit::Command::Failed + if attempt <= MAX_ATTEMPTS + info "#{target} failed to respond, retrying in #{attempt}s..." + sleep attempt + attempt += 1 + + retry + else + raise + end end rescue SSHKit::Command::Failed => e error capture_with_info(*MRSK.healthcheck.logs) if e.message =~ /curl/ - # Catches 4xx, 5xx raise SSHKit::Command::Failed, "#{target} failed to return 200 OK!" else raise diff --git a/lib/mrsk/commands/builder.rb b/lib/mrsk/commands/builder.rb index 70957afe..85dbce0a 100644 --- a/lib/mrsk/commands/builder.rb +++ b/lib/mrsk/commands/builder.rb @@ -1,5 +1,5 @@ class Mrsk::Commands::Builder < Mrsk::Commands::Base - delegate :create, :remove, :push, :pull, :info, to: :target + delegate :create, :remove, :push, :clean, :pull, :info, to: :target def name target.class.to_s.remove("Mrsk::Commands::Builder::").underscore diff --git a/lib/mrsk/commands/builder/base.rb b/lib/mrsk/commands/builder/base.rb index 4f2a8dbe..d282fd01 100644 --- a/lib/mrsk/commands/builder/base.rb +++ b/lib/mrsk/commands/builder/base.rb @@ -1,6 +1,10 @@ class Mrsk::Commands::Builder::Base < Mrsk::Commands::Base delegate :argumentize, to: Mrsk::Utils + def clean + docker :image, :rm, "--force", config.absolute_image + end + def pull docker :pull, config.absolute_image end diff --git a/lib/mrsk/commands/healthcheck.rb b/lib/mrsk/commands/healthcheck.rb index feb35543..47626156 100644 --- a/lib/mrsk/commands/healthcheck.rb +++ b/lib/mrsk/commands/healthcheck.rb @@ -16,11 +16,11 @@ class Mrsk::Commands::Healthcheck < Mrsk::Commands::Base end def curl - [ :curl, "--silent", "--output", "/dev/null", "--write-out", "'%{http_code}'", "--retry-max-time", 10, "--retry", 5, health_url ] + [ :curl, "--silent", "--output", "/dev/null", "--write-out", "'%{http_code}'", "--max-time", "2", health_url ] end def logs - pipe container_id, xargs(docker(:logs, "2>&1")) + pipe container_id, xargs(docker(:logs, "--tail", 50, "2>&1")) end def stop diff --git a/lib/mrsk/version.rb b/lib/mrsk/version.rb index ecdce2cb..11d95f38 100644 --- a/lib/mrsk/version.rb +++ b/lib/mrsk/version.rb @@ -1,3 +1,3 @@ module Mrsk - VERSION = "0.7.2" + VERSION = "0.8.0" end diff --git a/test/cli/build_test.rb b/test/cli/build_test.rb new file mode 100644 index 00000000..3d5f4431 --- /dev/null +++ b/test/cli/build_test.rb @@ -0,0 +1,15 @@ +require_relative "cli_test_case" + +class CliBuildTest < CliTestCase + test "pull" do + run_command("pull").tap do |output| + assert_match /docker image rm --force dhh\/app:999/, output + assert_match /docker pull dhh\/app:999/, output + end + end + + private + def run_command(*command) + stdouted { Mrsk::Cli::Build.start([*command, "-c", "test/fixtures/deploy_with_accessories.yml"]) } + end +end diff --git a/test/commands/healthcheck_test.rb b/test/commands/healthcheck_test.rb index c7438126..54580e61 100644 --- a/test/commands/healthcheck_test.rb +++ b/test/commands/healthcheck_test.rb @@ -24,7 +24,7 @@ class CommandsHealthcheckTest < ActiveSupport::TestCase test "curl" do assert_equal \ - "curl --silent --output /dev/null --write-out '%{http_code}' --retry-max-time 10 --retry 5 http://localhost:3999/up", + "curl --silent --output /dev/null --write-out '%{http_code}' --max-time 2 http://localhost:3999/up", new_command.curl.join(" ") end @@ -32,7 +32,7 @@ class CommandsHealthcheckTest < ActiveSupport::TestCase @config[:healthcheck] = { "path" => "/healthz" } assert_equal \ - "curl --silent --output /dev/null --write-out '%{http_code}' --retry-max-time 10 --retry 5 http://localhost:3999/healthz", + "curl --silent --output /dev/null --write-out '%{http_code}' --max-time 2 http://localhost:3999/healthz", new_command.curl.join(" ") end