diff --git a/lib/mrsk/cli/build.rb b/lib/mrsk/cli/build.rb index 0e6e9a7c..22dae998 100644 --- a/lib/mrsk/cli/build.rb +++ b/lib/mrsk/cli/build.rb @@ -14,11 +14,11 @@ class Mrsk::Cli::Build < Mrsk::Cli::Base with_lock do cli = self + verify_local_dependencies + run_locally do begin - if cli.verify_local_dependencies - MRSK.with_verbosity(:debug) { execute *MRSK.builder.push } - end + MRSK.with_verbosity(:debug) { execute *MRSK.builder.push } rescue SSHKit::Command::Failed => e if e.message =~ /(no builder)|(no such file or directory)/ error "Missing compatible builder, so creating a new one first" @@ -82,21 +82,18 @@ class Mrsk::Cli::Build < Mrsk::Cli::Base end end + private + def verify_local_dependencies + run_locally do + begin + execute *MRSK.builder.ensure_local_dependencies_installed + rescue SSHKit::Command::Failed => e + build_error = e.message =~ /command not found/ ? + "Docker is not installed locally" : + "Docker buildx plugin is not installed locally" - desc "", "" # Really a private method, but needed to be invoked from #push - def verify_local_dependencies - run_locally do - begin - execute *MRSK.builder.ensure_local_dependencies_installed - rescue SSHKit::Command::Failed => e - build_error = e.message =~ /command not found/ ? - "Docker is not installed locally" : - "Docker buildx plugin is not installed locally" - - raise BuildError, build_error + raise BuildError, build_error + end end end - - true - end end diff --git a/test/cli/build_test.rb b/test/cli/build_test.rb index 0835262c..9f13ba6e 100644 --- a/test/cli/build_test.rb +++ b/test/cli/build_test.rb @@ -9,17 +9,19 @@ class CliBuildTest < CliTestCase end test "push" do - Mrsk::Cli::Build.any_instance.stubs(:verify_local_dependencies).returns(true) run_command("push").tap do |output| + assert_match /docker --version && docker buildx version/, output assert_match /docker buildx build --push --platform linux\/amd64,linux\/arm64 --builder mrsk-app-multiarch -t dhh\/app:999 -t dhh\/app:latest --label service="app" --file Dockerfile \. as .*@localhost/, output end end test "push without builder" do stub_locking - Mrsk::Cli::Build.any_instance.stubs(:verify_local_dependencies).returns(true) SSHKit::Backend::Abstract.any_instance.stubs(:execute) - .with { |arg| arg == :docker } + .with(:docker, "--version", "&&", :docker, :buildx, "version") + + SSHKit::Backend::Abstract.any_instance.stubs(:execute) + .with { |*args| args[0..1] == [:docker, :buildx] } .raises(SSHKit::Command::Failed.new("no builder")) .then .returns(true) @@ -29,6 +31,16 @@ class CliBuildTest < CliTestCase end end + test "push with no buildx plugin" do + stub_locking + SSHKit::Backend::Abstract.any_instance.stubs(:execute) + .with(:docker, "--version", "&&", :docker, :buildx, "version") + .raises(SSHKit::Command::Failed.new("no buildx")) + + Mrsk::Commands::Builder.any_instance.stubs(:native_and_local?).returns(false) + assert_raises(Mrsk::Cli::Build::BuildError) { run_command("push") } + end + test "pull" do run_command("pull").tap do |output| assert_match /docker image rm --force dhh\/app:999/, output @@ -70,23 +82,6 @@ class CliBuildTest < CliTestCase end end - test "verify local dependencies" do - Mrsk::Commands::Builder.any_instance.stubs(:name).returns("remote".inquiry) - - run_command("verify_local_dependencies").tap do |output| - assert_match /docker --version && docker buildx version/, output - end - end - - test "verify local dependencies with no buildx plugin" do - SSHKit::Backend::Abstract.any_instance.stubs(:execute) - .with(:docker, "--version", "&&", :docker, :buildx, "version") - .raises(SSHKit::Command::Failed.new("no buildx")) - - Mrsk::Commands::Builder.any_instance.stubs(:native_and_local?).returns(false) - assert_raises(Mrsk::Cli::Build::BuildError) { run_command("verify_local_dependencies") } - end - private def run_command(*command) stdouted { Mrsk::Cli::Build.start([*command, "-c", "test/fixtures/deploy_with_accessories.yml"]) }