From 8e58a9385a419850cb74b6093fd44b5786fafdcd Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 15 Jan 2023 13:51:08 +0100 Subject: [PATCH] Allow exec to run in its own container --- lib/mrsk/cli/app.rb | 9 ++++++--- lib/mrsk/commands/app.rb | 10 ++++++++++ test/app_command_test.rb | 6 ++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/mrsk/cli/app.rb b/lib/mrsk/cli/app.rb index fc4f03ab..8882239e 100644 --- a/lib/mrsk/cli/app.rb +++ b/lib/mrsk/cli/app.rb @@ -41,14 +41,17 @@ class Mrsk::Cli::App < Mrsk::Cli::Base desc "exec [CMD]", "Execute a custom task on servers passed in as CMD='bin/rake some:task'" option :once, type: :boolean, default: false + option :run, type: :boolean, default: false def exec(cmd) + runner = options[:run] ? :run_exec : :exec + if options[:once] - on(MRSK.config.primary_host) { puts capture(*MRSK.app.exec(cmd), verbosity: Logger::INFO) } + on(MRSK.config.primary_host) { puts capture(*MRSK.app.send(runner, cmd), verbosity: Logger::INFO) } else - on(MRSK.config.hosts) { |host| puts "App Host: #{host}\n" + capture(*MRSK.app.exec(cmd), verbosity: Logger::INFO) + "\n\n" } + on(MRSK.config.hosts) { |host| puts "App Host: #{host}\n" + capture(*MRSK.app.send(runner, cmd), verbosity: Logger::INFO) + "\n\n" } end end - + desc "console", "Start Rails Console on primary host" option :host, desc: "Start console on a different host" def console diff --git a/lib/mrsk/commands/app.rb b/lib/mrsk/commands/app.rb index 8ea2ab4e..fc5b217d 100644 --- a/lib/mrsk/commands/app.rb +++ b/lib/mrsk/commands/app.rb @@ -40,6 +40,16 @@ class Mrsk::Commands::App < Mrsk::Commands::Base *command end + def run_exec(*command) + docker :run, + "-it", + "--rm", + *rails_master_key_arg, + *config.env_args, + config.absolute_image, + *command + end + def console(host: config.primary_host) "ssh -t #{config.ssh_user}@#{host} '#{exec("bin/rails", "c", interactive: true).join(" ")}'" end diff --git a/test/app_command_test.rb b/test/app_command_test.rb index 3d989b72..6cf8e41c 100644 --- a/test/app_command_test.rb +++ b/test/app_command_test.rb @@ -15,4 +15,10 @@ class AppCommandTest < ActiveSupport::TestCase assert_equal \ [:docker, :run, "-d", "--restart unless-stopped", "--name", "app-123", "-e", "RAILS_MASTER_KEY=456", "--label", "service=app", "--label", "role=web", "--label", "traefik.http.routers.app.rule='PathPrefix(`/`)'", "--label", "traefik.http.services.app.loadbalancer.healthcheck.path=/up", "--label", "traefik.http.services.app.loadbalancer.healthcheck.interval=1s", "--label", "traefik.http.middlewares.app.retry.attempts=3", "--label", "traefik.http.middlewares.app.retry.initialinterval=500ms", "dhh/app:123"], @app.run end + + test "run with" do + assert_equal \ + [ :docker, :run, "-it", "--rm", "-e", "RAILS_MASTER_KEY=456", "dhh/app:123", "bin/rails", "db:setup" ], + @app.run_exec("bin/rails", "db:setup") + end end