Check for docker locally before registry login
We were checking before `kamal build push`, but not `kamal registry login`. Since `kamal registry login` is called first by a deploy we don't get the nice error message.
This commit is contained in:
@@ -2,6 +2,7 @@ module Kamal::Cli
|
|||||||
class BootError < StandardError; end
|
class BootError < StandardError; end
|
||||||
class HookError < StandardError; end
|
class HookError < StandardError; end
|
||||||
class LockError < StandardError; end
|
class LockError < StandardError; end
|
||||||
|
class DependencyError < StandardError; end
|
||||||
end
|
end
|
||||||
|
|
||||||
# SSHKit uses instance eval, so we need a global const for ergonomics
|
# SSHKit uses instance eval, so we need a global const for ergonomics
|
||||||
|
|||||||
@@ -195,5 +195,19 @@ module Kamal::Cli
|
|||||||
ENV.clear
|
ENV.clear
|
||||||
ENV.update(current_env)
|
ENV.update(current_env)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ensure_docker_installed
|
||||||
|
run_locally do
|
||||||
|
begin
|
||||||
|
execute *KAMAL.builder.ensure_docker_installed
|
||||||
|
rescue SSHKit::Command::Failed => e
|
||||||
|
error = e.message =~ /command not found/ ?
|
||||||
|
"Docker is not installed locally" :
|
||||||
|
"Docker buildx plugin is not installed locally"
|
||||||
|
|
||||||
|
raise DependencyError, error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class Kamal::Cli::Build < Kamal::Cli::Base
|
|||||||
def push
|
def push
|
||||||
cli = self
|
cli = self
|
||||||
|
|
||||||
verify_local_dependencies
|
ensure_docker_installed
|
||||||
run_hook "pre-build"
|
run_hook "pre-build"
|
||||||
|
|
||||||
uncommitted_changes = Kamal::Git.uncommitted_changes
|
uncommitted_changes = Kamal::Git.uncommitted_changes
|
||||||
@@ -109,20 +109,6 @@ class Kamal::Cli::Build < Kamal::Cli::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def verify_local_dependencies
|
|
||||||
run_locally do
|
|
||||||
begin
|
|
||||||
execute *KAMAL.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
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def connect_to_remote_host(remote_host)
|
def connect_to_remote_host(remote_host)
|
||||||
remote_uri = URI.parse(remote_host)
|
remote_uri = URI.parse(remote_host)
|
||||||
if remote_uri.scheme == "ssh"
|
if remote_uri.scheme == "ssh"
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ class Kamal::Cli::Registry < Kamal::Cli::Base
|
|||||||
option :skip_local, aliases: "-L", type: :boolean, default: false, desc: "Skip local login"
|
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"
|
option :skip_remote, aliases: "-R", type: :boolean, default: false, desc: "Skip remote login"
|
||||||
def login
|
def login
|
||||||
|
ensure_docker_installed
|
||||||
|
|
||||||
run_locally { execute *KAMAL.registry.login } unless options[:skip_local]
|
run_locally { execute *KAMAL.registry.login } unless options[:skip_local]
|
||||||
on(KAMAL.hosts) { execute *KAMAL.registry.login } unless options[:skip_remote]
|
on(KAMAL.hosts) { execute *KAMAL.registry.login } unless options[:skip_remote]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -34,6 +34,12 @@ module Kamal::Commands
|
|||||||
[ :rm, path ]
|
[ :rm, path ]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ensure_docker_installed
|
||||||
|
combine \
|
||||||
|
ensure_local_docker_installed,
|
||||||
|
ensure_local_buildx_installed
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def combine(*commands, by: "&&")
|
def combine(*commands, by: "&&")
|
||||||
commands
|
commands
|
||||||
@@ -104,5 +110,13 @@ module Kamal::Commands
|
|||||||
" -i #{key}"
|
" -i #{key}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ensure_local_docker_installed
|
||||||
|
docker "--version"
|
||||||
|
end
|
||||||
|
|
||||||
|
def ensure_local_buildx_installed
|
||||||
|
docker :buildx, "version"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -33,24 +33,4 @@ class Kamal::Commands::Builder < Kamal::Commands::Base
|
|||||||
def hybrid
|
def hybrid
|
||||||
@hybrid ||= Kamal::Commands::Builder::Hybrid.new(config)
|
@hybrid ||= Kamal::Commands::Builder::Hybrid.new(config)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def ensure_local_dependencies_installed
|
|
||||||
if name.native?
|
|
||||||
ensure_local_docker_installed
|
|
||||||
else
|
|
||||||
combine \
|
|
||||||
ensure_local_docker_installed,
|
|
||||||
ensure_local_buildx_installed
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def ensure_local_docker_installed
|
|
||||||
docker "--version"
|
|
||||||
end
|
|
||||||
|
|
||||||
def ensure_local_buildx_installed
|
|
||||||
docker :buildx, "version"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ class CliBuildTest < CliTestCase
|
|||||||
.raises(SSHKit::Command::Failed.new("no buildx"))
|
.raises(SSHKit::Command::Failed.new("no buildx"))
|
||||||
|
|
||||||
Kamal::Commands::Builder.any_instance.stubs(:native_and_local?).returns(false)
|
Kamal::Commands::Builder.any_instance.stubs(:native_and_local?).returns(false)
|
||||||
assert_raises(Kamal::Cli::Build::BuildError) { run_command("push") }
|
assert_raises(Kamal::Cli::DependencyError) { run_command("push") }
|
||||||
end
|
end
|
||||||
|
|
||||||
test "push pre-build hook failure" do
|
test "push pre-build hook failure" do
|
||||||
|
|||||||
@@ -43,6 +43,16 @@ class CliRegistryTest < CliTestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "login with no docker" do
|
||||||
|
stub_setup
|
||||||
|
SSHKit::Backend::Abstract.any_instance.stubs(:execute)
|
||||||
|
.with(:docker, "--version", "&&", :docker, :buildx, "version")
|
||||||
|
.raises(SSHKit::Command::Failed.new("command not found"))
|
||||||
|
|
||||||
|
assert_raises(Kamal::Cli::DependencyError) { run_command("login") }
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
private
|
private
|
||||||
def run_command(*command)
|
def run_command(*command)
|
||||||
stdouted { Kamal::Cli::Registry.start([ *command, "-c", "test/fixtures/deploy_with_accessories.yml" ]) }
|
stdouted { Kamal::Cli::Registry.start([ *command, "-c", "test/fixtures/deploy_with_accessories.yml" ]) }
|
||||||
|
|||||||
Reference in New Issue
Block a user