From 8848335fbcb12dea6e426a57d5585a3114e9f5bf Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 3 Feb 2023 16:39:26 +0100 Subject: [PATCH] Extract executions into separate concern --- lib/mrsk/commands/app.rb | 31 +++-------------------- lib/mrsk/commands/concerns.rb | 5 ++++ lib/mrsk/commands/concerns/executions.rb | 27 ++++++++++++++++++++ lib/mrsk/commands/concerns/repository.rb | 32 +++++++++++------------- test/commands/app_test.rb | 21 ++++++++++++++++ 5 files changed, 71 insertions(+), 45 deletions(-) create mode 100644 lib/mrsk/commands/concerns.rb create mode 100644 lib/mrsk/commands/concerns/executions.rb diff --git a/lib/mrsk/commands/app.rb b/lib/mrsk/commands/app.rb index 7a04c7bd..dea02ec4 100644 --- a/lib/mrsk/commands/app.rb +++ b/lib/mrsk/commands/app.rb @@ -1,8 +1,9 @@ require "mrsk/commands/base" -require "mrsk/commands/concerns/repository" +require "mrsk/commands/concerns" class Mrsk::Commands::App < Mrsk::Commands::Base - include Mrsk::Commands::Concerns::Repository + include Mrsk::Commands::Concerns::Executions, + Mrsk::Commands::Concerns::Repository def run(role: :web) role = config.role(role) @@ -42,32 +43,6 @@ class Mrsk::Commands::App < Mrsk::Commands::Base ("grep '#{grep}'" if grep) end - def execute_in_existing_container(*command, interactive: false) - docker :exec, - ("-it" if interactive), - config.service_with_version, - *command - end - - def execute_in_new_container(*command, interactive: false) - docker :run, - ("-it" if interactive), - "--rm", - *rails_master_key_arg, - *config.env_args, - *config.volume_args, - config.absolute_image, - *command - end - - def execute_in_existing_container_over_ssh(*command, host:) - run_over_ssh execute_in_existing_container(*command, interactive: true).join(" "), host: host - end - - def execute_in_new_container_over_ssh(*command, host:) - run_over_ssh execute_in_new_container(*command, interactive: true).join(" "), host: host - end - def follow_logs(host:, grep: nil) run_over_ssh pipe( current_container_id, diff --git a/lib/mrsk/commands/concerns.rb b/lib/mrsk/commands/concerns.rb new file mode 100644 index 00000000..cd4ea343 --- /dev/null +++ b/lib/mrsk/commands/concerns.rb @@ -0,0 +1,5 @@ +module Mrsk::Commands::Concerns +end + +require "mrsk/commands/concerns/executions" +require "mrsk/commands/concerns/repository" diff --git a/lib/mrsk/commands/concerns/executions.rb b/lib/mrsk/commands/concerns/executions.rb new file mode 100644 index 00000000..dd7be827 --- /dev/null +++ b/lib/mrsk/commands/concerns/executions.rb @@ -0,0 +1,27 @@ +module Mrsk::Commands::Concerns::Executions + def execute_in_existing_container(*command, interactive: false) + docker :exec, + ("-it" if interactive), + config.service_with_version, + *command + end + + def execute_in_new_container(*command, interactive: false) + docker :run, + ("-it" if interactive), + "--rm", + *rails_master_key_arg, + *config.env_args, + *config.volume_args, + config.absolute_image, + *command + end + + def execute_in_existing_container_over_ssh(*command, host:) + run_over_ssh execute_in_existing_container(*command, interactive: true).join(" "), host: host + end + + def execute_in_new_container_over_ssh(*command, host:) + run_over_ssh execute_in_new_container(*command, interactive: true).join(" "), host: host + end +end diff --git a/lib/mrsk/commands/concerns/repository.rb b/lib/mrsk/commands/concerns/repository.rb index a0e350c0..4bf093d1 100644 --- a/lib/mrsk/commands/concerns/repository.rb +++ b/lib/mrsk/commands/concerns/repository.rb @@ -1,21 +1,19 @@ -module Mrsk::Commands::Concerns - module Repository - def container_id_for(container_name:) - docker :container, :ls, "-a", "-f", "name=#{container_name}", "-q" - end +module Mrsk::Commands::Concerns::Repository + def container_id_for(container_name:) + docker :container, :ls, "-a", "-f", "name=#{container_name}", "-q" + end - def current_running_version - # FIXME: Find more graceful way to extract the version from "app-version" than using sed and tail! - pipe \ - docker(:ps, "--filter", "label=service=#{config.service}", "--format", '"{{.Names}}"'), - %(sed 's/-/\\n/g'), - "tail -n 1" - end + def current_running_version + # FIXME: Find more graceful way to extract the version from "app-version" than using sed and tail! + pipe \ + docker(:ps, "--filter", "label=service=#{service_name}", "--format", '"{{.Names}}"'), + %(sed 's/-/\\n/g'), + "tail -n 1" + end - def most_recent_version_from_available_images - pipe \ - docker(:image, :ls, "--format", '"{{.Tag}}"', config.repository), - "head -n 1" - end + def most_recent_version_from_available_images + pipe \ + docker(:image, :ls, "--format", '"{{.Tag}}"', config.repository), + "head -n 1" end end diff --git a/test/commands/app_test.rb b/test/commands/app_test.rb index 5c8bcda1..bf735bb1 100644 --- a/test/commands/app_test.rb +++ b/test/commands/app_test.rb @@ -1,6 +1,7 @@ require "test_helper" require "mrsk/configuration" require "mrsk/commands/app" +require "minitest/autorun" # using stubs that take args class CommandsAppTest < ActiveSupport::TestCase setup do @@ -32,6 +33,26 @@ class CommandsAppTest < ActiveSupport::TestCase @app.execute_in_new_container("bin/rails", "db:setup") end + test "execute in existing container" do + assert_equal \ + [ :docker, :exec, "app-missing", "bin/rails", "db:setup" ], + @app.execute_in_existing_container("bin/rails", "db:setup") + end + + test "execute in new container over ssh" do + @app.stub(:run_over_ssh, ->(cmd, host:) { cmd }) do + assert_match %r|docker run -it --rm -e RAILS_MASTER_KEY=456 dhh/app:missing bin/rails c|, + @app.execute_in_new_container_over_ssh("bin/rails", "c", host: "app-1") + end + end + + test "execute in existing container over ssh" do + @app.stub(:run_over_ssh, ->(cmd, host:) { cmd }) do + assert_match %r|docker exec -it app-missing bin/rails c|, + @app.execute_in_existing_container_over_ssh("bin/rails", "c", host: "app-1") + end + end + test "run without master key" do ENV["RAILS_MASTER_KEY"] = nil @app = Mrsk::Commands::App.new Mrsk::Configuration.new(@config.tap { |c| c[:skip_master_key] = true })