Merge pull request #646 from nickhammond/server/exec
Add in a server exec command for running ad-hoc commands directly on the server
This commit is contained in:
@@ -69,7 +69,7 @@ class Kamal::Cli::App < Kamal::Cli::Base
|
||||
end
|
||||
end
|
||||
|
||||
desc "exec [CMD]", "Execute a custom command on servers (use --help to show options)"
|
||||
desc "exec [CMD]", "Execute a custom command on servers within the app container (use --help to show options)"
|
||||
option :interactive, aliases: "-i", type: :boolean, default: false, desc: "Execute command over ssh for an interactive shell (use for console/bash)"
|
||||
option :reuse, type: :boolean, default: false, desc: "Reuse currently running container instead of starting a new one"
|
||||
option :env, aliases: "-e", type: :hash, desc: "Set environment variables for the command"
|
||||
|
||||
@@ -1,4 +1,26 @@
|
||||
class Kamal::Cli::Server < Kamal::Cli::Base
|
||||
desc "exec", "Run a custom command on the server (use --help to show options)"
|
||||
option :interactive, type: :boolean, aliases: "-i", default: false, desc: "Run the command interactively (use for console/bash)"
|
||||
def exec(cmd)
|
||||
hosts = KAMAL.hosts | KAMAL.accessory_hosts
|
||||
|
||||
case
|
||||
when options[:interactive]
|
||||
host = KAMAL.primary_host
|
||||
|
||||
say "Running '#{cmd}' on #{host} interactively...", :magenta
|
||||
|
||||
run_locally { exec KAMAL.server.run_over_ssh(cmd, host: host) }
|
||||
else
|
||||
say "Running '#{cmd}' on #{hosts.join(', ')}...", :magenta
|
||||
|
||||
on(hosts) do |host|
|
||||
execute *KAMAL.auditor.record("Executed cmd '#{cmd}' on #{host}"), verbosity: :debug
|
||||
puts_by_host host, capture_with_info(cmd)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc "bootstrap", "Set up Docker to run Kamal apps"
|
||||
def bootstrap
|
||||
missing = []
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
require_relative "cli_test_case"
|
||||
|
||||
class CliServerTest < CliTestCase
|
||||
test "running a command with exec" do
|
||||
SSHKit::Backend::Abstract.any_instance.stubs(:capture)
|
||||
.with("date", verbosity: 1)
|
||||
.returns("Today")
|
||||
|
||||
hosts = "1.1.1.1".."1.1.1.4"
|
||||
run_command("exec", "date").tap do |output|
|
||||
hosts.map do |host|
|
||||
assert_match "Running 'date' on #{hosts.to_a.join(', ')}...", output
|
||||
assert_match "App Host: #{host}\nToday", output
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
test "bootstrap already installed" do
|
||||
SSHKit::Backend::Abstract.any_instance.expects(:execute).with(:docker, "-v", raise_on_non_zero_exit: false).returns(true).at_least_once
|
||||
SSHKit::Backend::Abstract.any_instance.expects(:execute).with(:mkdir, "-p", ".kamal").returns("").at_least_once
|
||||
|
||||
Reference in New Issue
Block a user