From fdb0c8ee91360b46975685c809a4d7b95054ef42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20B=C3=BChlmann?= Date: Fri, 10 Mar 2023 08:50:26 +0100 Subject: [PATCH] Rolify app cli/command --- lib/mrsk/cli/app.rb | 80 +++++++++++++++-------- lib/mrsk/commander.rb | 6 +- lib/mrsk/commands/app.rb | 44 +++++++------ test/cli/app_test.rb | 38 +++++------ test/commands/app_test.rb | 50 +++++++------- test/fixtures/deploy_with_accessories.yml | 2 +- 6 files changed, 126 insertions(+), 94 deletions(-) diff --git a/lib/mrsk/cli/app.rb b/lib/mrsk/cli/app.rb index 796cd367..6e9cdad9 100644 --- a/lib/mrsk/cli/app.rb +++ b/lib/mrsk/cli/app.rb @@ -7,24 +7,26 @@ class Mrsk::Cli::App < Mrsk::Cli::Base cli = self - MRSK.config.roles.each do |role| - on(role.hosts) do |host| - execute *MRSK.auditor.record("Booted app version #{version}"), verbosity: :debug + on(MRSK.hosts) do |host| + roles = MRSK.roles_on(host) + + roles.each do |role| + execute *MRSK.auditor(role: role.name).record("Booted app version #{version}"), verbosity: :debug begin - old_version = capture_with_info(*MRSK.app.current_running_version).strip - execute *MRSK.app.run(role: role.name) + old_version = capture_with_info(*MRSK.app(role: role.name).current_running_version).strip + execute *MRSK.app(role: role.name).run sleep MRSK.config.readiness_delay - execute *MRSK.app.stop(version: old_version), raise_on_non_zero_exit: false if old_version.present? + execute *MRSK.app(role: role.name).stop(version: old_version), raise_on_non_zero_exit: false if old_version.present? rescue SSHKit::Command::Failed => e if e.message =~ /already in use/ error "Rebooting container with same version #{version} already deployed on #{host} (may cause gap in zero-downtime promise!)" - execute *MRSK.auditor.record("Rebooted app version #{version}"), verbosity: :debug + execute *MRSK.auditor(role: role.name).record("Rebooted app version #{version}"), verbosity: :debug - execute *MRSK.app.stop(version: version) - execute *MRSK.app.remove_container(version: version) - execute *MRSK.app.run(role: role.name) + execute *MRSK.app(role: role.name).stop(version: version) + execute *MRSK.app(role: role.name).remove_container(version: version) + execute *MRSK.app(role: role.name).run else raise end @@ -36,24 +38,38 @@ class Mrsk::Cli::App < Mrsk::Cli::Base desc "start", "Start existing app container on servers" def start - on(MRSK.hosts) do - execute *MRSK.auditor.record("Started app version #{MRSK.version}"), verbosity: :debug - execute *MRSK.app.start, raise_on_non_zero_exit: false + on(MRSK.hosts) do |host| + roles = MRSK.roles_on(host) + + roles.each do |role| + execute *MRSK.auditor(role: role.name).record("Started app version #{MRSK.version}"), verbosity: :debug + execute *MRSK.app(role: role.name).start, raise_on_non_zero_exit: false + end end end desc "stop", "Stop app container on servers" def stop - on(MRSK.hosts) do - execute *MRSK.auditor.record("Stopped app"), verbosity: :debug - execute *MRSK.app.stop, raise_on_non_zero_exit: false + on(MRSK.hosts) do |host| + roles = MRSK.roles_on(host) + + roles.each do |role| + execute *MRSK.auditor(role: role.name).record("Stopped app"), verbosity: :debug + execute *MRSK.app(role: role.name).stop, raise_on_non_zero_exit: false + end end end # FIXME: Drop in favor of just containers? desc "details", "Show details about app containers" def details - on(MRSK.hosts) { |host| puts_by_host host, capture_with_info(*MRSK.app.info) } + on(MRSK.hosts) do |host| + roles = MRSK.roles_on(host) + + roles.each do |role| + puts_by_host host, capture_with_info(*MRSK.app(role: role.name).info) + end + end end desc "exec [CMD]", "Execute a custom command on servers (use --help to show options)" @@ -65,7 +81,7 @@ class Mrsk::Cli::App < Mrsk::Cli::Base say "Get current version of running container...", :magenta unless options[:version] using_version(options[:version] || current_running_version) do |version| say "Launching interactive command with version #{version} via SSH from existing container on #{MRSK.primary_host}...", :magenta - run_locally { exec MRSK.app.execute_in_existing_container_over_ssh(cmd, host: MRSK.primary_host) } + run_locally { exec MRSK.app(role: role.name).execute_in_existing_container_over_ssh(cmd, host: MRSK.primary_host) } end when options[:interactive] @@ -81,8 +97,12 @@ class Mrsk::Cli::App < Mrsk::Cli::Base say "Launching command with version #{version} from existing container...", :magenta on(MRSK.hosts) do |host| - execute *MRSK.auditor.record("Executed cmd '#{cmd}' on app version #{version}"), verbosity: :debug - puts_by_host host, capture_with_info(*MRSK.app.execute_in_existing_container(cmd)) + roles = MRSK.roles_on(host) + + roles.each do |role| + execute *MRSK.auditor(role: role.name).record("Executed cmd '#{cmd}' on app version #{version}"), verbosity: :debug + puts_by_host host, capture_with_info(*MRSK.app(role: role.name).execute_in_existing_container(cmd)) + end end end @@ -147,17 +167,25 @@ class Mrsk::Cli::App < Mrsk::Cli::Base desc "remove_container [VERSION]", "Remove app container with given version from servers", hide: true def remove_container(version) - on(MRSK.hosts) do - execute *MRSK.auditor.record("Removed app container with version #{version}"), verbosity: :debug - execute *MRSK.app.remove_container(version: version) + on(MRSK.hosts) do |host| + roles = MRSK.roles_on(host) + + roles.each do |role| + execute *MRSK.auditor(role: role.name).record("Removed app container with version #{version}"), verbosity: :debug + execute *MRSK.app(role: role.name).remove_container(version: version) + end end end desc "remove_containers", "Remove all app containers from servers", hide: true def remove_containers - on(MRSK.hosts) do - execute *MRSK.auditor.record("Removed all app containers"), verbosity: :debug - execute *MRSK.app.remove_containers + on(MRSK.hosts) do |host| + roles = MRSK.roles_on(host) + + roles.each do |role| + execute *MRSK.auditor(role: role.name).record("Removed all app containers"), verbosity: :debug + execute *MRSK.app(role: role.name).remove_containers + end end end diff --git a/lib/mrsk/commander.rb b/lib/mrsk/commander.rb index d49243c3..7dce1cf6 100644 --- a/lib/mrsk/commander.rb +++ b/lib/mrsk/commander.rb @@ -45,7 +45,7 @@ class Mrsk::Commander end def roles_on(host) - roles.select { |role| role.hosts.include?(host) } + roles.select { |role| role.hosts.include?(host.to_s) } end def traefik_hosts @@ -61,8 +61,8 @@ class Mrsk::Commander end - def app - @app ||= Mrsk::Commands::App.new(config) + def app(role: nil) + Mrsk::Commands::App.new(config, role: role) end def accessory(name) diff --git a/lib/mrsk/commands/app.rb b/lib/mrsk/commands/app.rb index 906a30d2..2008e8ff 100644 --- a/lib/mrsk/commands/app.rb +++ b/lib/mrsk/commands/app.rb @@ -1,12 +1,19 @@ class Mrsk::Commands::App < Mrsk::Commands::Base - def run(role: :web) - role = config.role(role) + attr_reader :role + + def initialize(config, role: nil) + super(config) + @role = role + end + + def run + role = config.role(self.role) docker :run, "--detach", "--restart unless-stopped", "--log-opt", "max-size=#{MAX_LOG_SIZE}", - "--name", service_with_version_and_destination, + "--name", service_with_version_and_destination_and_role, *role.env_args, *config.volume_args, *role.label_args, @@ -16,7 +23,7 @@ class Mrsk::Commands::App < Mrsk::Commands::Base end def start - docker :start, service_with_version_and_destination + docker :start, service_with_version_and_destination_and_role end def stop(version: nil) @@ -26,7 +33,7 @@ class Mrsk::Commands::App < Mrsk::Commands::Base end def info - docker :ps, *service_filter_with_destination + docker :ps, *service_filter_with_destination_and_role end @@ -51,7 +58,7 @@ class Mrsk::Commands::App < Mrsk::Commands::Base def execute_in_existing_container(*command, interactive: false) docker :exec, ("-it" if interactive), - service_with_version_and_destination, + service_with_version_and_destination_and_role, *command end @@ -75,13 +82,13 @@ class Mrsk::Commands::App < Mrsk::Commands::Base def current_container_id - docker :ps, "--quiet", *service_filter_with_destination + docker :ps, "--quiet", *service_filter_with_destination_and_role 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, *service_filter_with_destination, "--format", '"{{.Names}}"'), + docker(:ps, *service_filter_with_destination_and_role, "--format", '"{{.Names}}"'), %(sed 's/-/\\n/g'), "tail -n 1" end @@ -100,7 +107,7 @@ class Mrsk::Commands::App < Mrsk::Commands::Base def list_containers - docker :container, :ls, "--all", *service_filter_with_destination + docker :container, :ls, "--all", *service_filter_with_destination_and_role # TODO: role hier needed oder sogar falsch? end def list_container_names @@ -109,12 +116,12 @@ class Mrsk::Commands::App < Mrsk::Commands::Base def remove_container(version:) pipe \ - container_id_for(container_name: service_with_version_and_destination(version)), + container_id_for(container_name: service_with_version_and_destination_and_role(version)), xargs(docker(:container, :rm)) end def remove_containers - docker :container, :prune, "--force", *service_filter_with_destination + docker :container, :prune, "--force", *service_filter_with_destination_and_role end def list_images @@ -127,23 +134,22 @@ class Mrsk::Commands::App < Mrsk::Commands::Base private - def service_with_version_and_destination(version = nil) - [ config.service, config.destination, version || config.version ].compact.join("-") + def service_with_version_and_destination_and_role(version = nil) + [ config.service, role, config.destination, version || config.version ].compact.join("-") # TODO: is role sometimes nil here? bis jetzt wars nie nil end def container_id_for_version(version) - container_id_for(container_name: service_with_version_and_destination(version)) + container_id_for(container_name: service_with_version_and_destination_and_role(version)) end def service_filter [ "--filter", "label=service=#{config.service}" ] end - def service_filter_with_destination - if config.destination - service_filter << "label=destination=#{config.destination}" - else - service_filter + def service_filter_with_destination_and_role + service_filter.tap do |filter| + filter << "label=destination=#{config.destination}" if config.destination + filter << "label=role=#{role}" if role end end end diff --git a/test/cli/app_test.rb b/test/cli/app_test.rb index 76f59a80..1c0899fe 100644 --- a/test/cli/app_test.rb +++ b/test/cli/app_test.rb @@ -9,8 +9,8 @@ class CliAppTest < CliTestCase .returns("123") # old version run_command("boot").tap do |output| - assert_match /docker run --detach --restart unless-stopped/, output - assert_match /docker container ls --all --filter name=app-123 --quiet | xargs docker stop/, output + assert_match %r[docker run --detach --restart unless-stopped], output + assert_match %r[docker container ls --all --filter name=app-web-123 --quiet | xargs docker stop], output end end @@ -20,18 +20,16 @@ class CliAppTest < CliTestCase # Prevent expected failures from outputting to terminal Thread.report_on_exception = false - MRSK.app.stubs(:run) - .raises(SSHKit::Command::Failed.new("already in use")) - .then + Mrsk::Commands::App.any_instance.stubs(:run) .raises(SSHKit::Command::Failed.new("already in use")) .then .returns([ :docker, :run ]) run_command("boot").tap do |output| - assert_match /Rebooting container with same version 999 already deployed/, output # Can't start what's already running - assert_match /docker container ls --all --filter name=app-999 --quiet | xargs docker container rm/, output # Stop old running - assert_match /docker container ls --all --filter name=app-999 --quiet | xargs docker container rm/, output # Remove old container - assert_match /docker run/, output # Start new container + assert_match %r[Rebooting container with same version 999 already deployed], output # Can't start what's already running + assert_match %r[docker container ls --all --filter name=app-web-999 --quiet | xargs docker stop], output # Stop old running + assert_match %r[docker container ls --all --filter name=app-web-999 --quiet | xargs docker container rm], output # Remove old container + assert_match %r[docker run on 1.1.1.1], output # Start new container end ensure Thread.report_on_exception = true @@ -39,51 +37,51 @@ class CliAppTest < CliTestCase test "start" do run_command("start").tap do |output| - assert_match /docker start app-999/, output + assert_match %r[docker start app-web-999], output end end test "stop" do run_command("stop").tap do |output| - assert_match /docker ps --quiet --filter label=service=app \| xargs docker stop/, output + assert_match %r[docker ps --quiet --filter label=service=app label=role=web | xargs docker stop], output end end test "details" do run_command("details").tap do |output| - assert_match /docker ps --filter label=service=app/, output + assert_match %r[docker ps --filter label=service=app label=role=web], output end end test "remove" do run_command("remove").tap do |output| - assert_match /docker ps --quiet --filter label=service=app | xargs docker stop/, output - assert_match /docker container prune --force --filter label=service=app/, output - assert_match /docker image prune --all --force --filter label=service=app/, output + assert_match %r[docker ps --quiet --filter label=service=app label=role=web | xargs docker stop], output + assert_match %r[docker container prune --force --filter label=service=app], output + assert_match %r[docker image prune --all --force --filter label=service=app], output end end test "remove_container" do run_command("remove_container", "1234567").tap do |output| - assert_match /docker container ls --all --filter name=app-1234567 --quiet \| xargs docker container rm/, output + assert_match %r[docker container ls --all --filter name=app-web-1234567 --quiet | xargs docker container rm], output end end test "exec" do run_command("exec", "ruby -v").tap do |output| - assert_match /ruby -v/, output + assert_match %r[docker run --rm dhh/app:999 ruby -v], output end end test "exec with reuse" do run_command("exec", "--reuse", "ruby -v").tap do |output| - assert_match %r[docker ps --filter label=service=app --format \"{{.Names}}\" | sed 's/-/\\n/g' | tail -n 1], output # Get current version - assert_match %r[docker exec app-999 ruby -v], output + assert_match %r[docker ps --filter label=service=app --format "{{.Names}}" | sed 's/-/\n/g' | tail -n 1], output + assert_match %r[docker exec app-web-999 ruby -v], output end end private def run_command(*command) - stdouted { Mrsk::Cli::App.start([*command, "-c", "test/fixtures/deploy_with_accessories.yml"]) } + stdouted { Mrsk::Cli::App.start([*command, "-c", "test/fixtures/deploy_with_accessories.yml", "--hosts", "1.1.1.1"]) } end end diff --git a/test/commands/app_test.rb b/test/commands/app_test.rb index da436bcb..3f0655c3 100644 --- a/test/commands/app_test.rb +++ b/test/commands/app_test.rb @@ -5,7 +5,7 @@ class CommandsAppTest < ActiveSupport::TestCase ENV["RAILS_MASTER_KEY"] = "456" @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], env: { "secret" => [ "RAILS_MASTER_KEY" ] } } - @app = Mrsk::Commands::App.new Mrsk::Configuration.new(@config).tap { |c| c.version = "999" } + @app = Mrsk::Commands::App.new(Mrsk::Configuration.new(@config).tap { |c| c.version = "999" }, role: "web") end teardown do @@ -14,7 +14,7 @@ class CommandsAppTest < ActiveSupport::TestCase test "run" do assert_equal \ - "docker run --detach --restart unless-stopped --log-opt max-size=10m --name app-999 -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=\"5\" --label traefik.http.middlewares.app.retry.initialinterval=\"500ms\" dhh/app:999", + "docker run --detach --restart unless-stopped --log-opt max-size=10m --name app-web-999 -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=\"5\" --label traefik.http.middlewares.app.retry.initialinterval=\"500ms\" dhh/app:999", @app.run.join(" ") end @@ -22,7 +22,7 @@ class CommandsAppTest < ActiveSupport::TestCase @config[:volumes] = ["/local/path:/container/path" ] assert_equal \ - "docker run --detach --restart unless-stopped --log-opt max-size=10m --name app-999 -e RAILS_MASTER_KEY=\"456\" --volume /local/path:/container/path --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=\"5\" --label traefik.http.middlewares.app.retry.initialinterval=\"500ms\" dhh/app:999", + "docker run --detach --restart unless-stopped --log-opt max-size=10m --name app-web-999 -e RAILS_MASTER_KEY=\"456\" --volume /local/path:/container/path --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=\"5\" --label traefik.http.middlewares.app.retry.initialinterval=\"500ms\" dhh/app:999", @app.run.join(" ") end @@ -30,72 +30,72 @@ class CommandsAppTest < ActiveSupport::TestCase @config[:healthcheck] = { "path" => "/healthz" } assert_equal \ - "docker run --detach --restart unless-stopped --log-opt max-size=10m --name app-999 -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=\"/healthz\" --label traefik.http.services.app.loadbalancer.healthcheck.interval=\"1s\" --label traefik.http.middlewares.app.retry.attempts=\"5\" --label traefik.http.middlewares.app.retry.initialinterval=\"500ms\" dhh/app:999", + "docker run --detach --restart unless-stopped --log-opt max-size=10m --name app-web-999 -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=\"/healthz\" --label traefik.http.services.app.loadbalancer.healthcheck.interval=\"1s\" --label traefik.http.middlewares.app.retry.attempts=\"5\" --label traefik.http.middlewares.app.retry.initialinterval=\"500ms\" dhh/app:999", @app.run.join(" ") end test "run with custom options" do @config[:servers] = { "web" => [ "1.1.1.1" ], "jobs" => { "hosts" => [ "1.1.1.2" ], "cmd" => "bin/jobs", "options" => { "mount" => "somewhere", "cap-add" => true } } } - @app = Mrsk::Commands::App.new Mrsk::Configuration.new(@config).tap { |c| c.version = "999" } + @app = Mrsk::Commands::App.new(Mrsk::Configuration.new(@config).tap { |c| c.version = "999" }, role: "jobs") assert_equal \ - "docker run --detach --restart unless-stopped --log-opt max-size=10m --name app-999 -e RAILS_MASTER_KEY=\"456\" --label service=\"app\" --label role=\"jobs\" --mount \"somewhere\" --cap-add dhh/app:999 bin/jobs", - @app.run(role: :jobs).join(" ") + "docker run --detach --restart unless-stopped --log-opt max-size=10m --name app-jobs-999 -e RAILS_MASTER_KEY=\"456\" --label service=\"app\" --label role=\"jobs\" --mount \"somewhere\" --cap-add dhh/app:999 bin/jobs", + @app.run.join(" ") end test "start" do assert_equal \ - "docker start app-999", + "docker start app-web-999", @app.start.join(" ") end test "stop" do assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker stop", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker stop", @app.stop.join(" ") end test "info" do assert_equal \ - "docker ps --filter label=service=app", + "docker ps --filter label=service=app label=role=web", @app.info.join(" ") end test "logs" do assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker logs 2>&1", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker logs 2>&1", @app.logs.join(" ") assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker logs --since 5m 2>&1", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker logs --since 5m 2>&1", @app.logs(since: "5m").join(" ") assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker logs --tail 100 2>&1", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker logs --tail 100 2>&1", @app.logs(lines: "100").join(" ") assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker logs --since 5m --tail 100 2>&1", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker logs --since 5m --tail 100 2>&1", @app.logs(since: "5m", lines: "100").join(" ") assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker logs 2>&1 | grep 'my-id'", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker logs 2>&1 | grep 'my-id'", @app.logs(grep: "my-id").join(" ") assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker logs --since 5m 2>&1 | grep 'my-id'", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker logs --since 5m 2>&1 | grep 'my-id'", @app.logs(since: "5m", grep: "my-id").join(" ") end test "follow logs" do @app.stub(:run_over_ssh, ->(cmd, host:) { cmd.join(" ") }) do assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker logs --timestamps --tail 10 --follow 2>&1", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker logs --timestamps --tail 10 --follow 2>&1", @app.follow_logs(host: "app-1") assert_equal \ - "docker ps --quiet --filter label=service=app | xargs docker logs --timestamps --tail 10 --follow 2>&1 | grep \"Completed\"", + "docker ps --quiet --filter label=service=app label=role=web | xargs docker logs --timestamps --tail 10 --follow 2>&1 | grep \"Completed\"", @app.follow_logs(host: "app-1", grep: "Completed") end end @@ -109,20 +109,20 @@ class CommandsAppTest < ActiveSupport::TestCase test "execute in existing container" do assert_equal \ - "docker exec app-999 bin/rails db:setup", + "docker exec app-web-999 bin/rails db:setup", @app.execute_in_existing_container("bin/rails", "db:setup").join(" ") end test "execute in new container over ssh" do @app.stub(:run_over_ssh, ->(cmd, host:) { cmd.join(" ") }) do - assert_match %r|docker run -it --rm -e RAILS_MASTER_KEY=\"456\" dhh/app:999 bin/rails c|, + assert_match %r[docker run -it --rm -e RAILS_MASTER_KEY=\"456\" dhh/app:999 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.join(" ") }) do - assert_match %r|docker exec -it app-999 bin/rails c|, + assert_match %r[docker exec -it app-web-999 bin/rails c], @app.execute_in_existing_container_over_ssh("bin/rails", "c", host: "app-1") end end @@ -154,19 +154,19 @@ class CommandsAppTest < ActiveSupport::TestCase test "current_container_id" do assert_equal \ - "docker ps --quiet --filter label=service=app", + "docker ps --quiet --filter label=service=app label=role=web", @app.current_container_id.join(" ") end test "container_id_for" do assert_equal \ - "docker container ls --all --filter name=app-999 --quiet", - @app.container_id_for(container_name: "app-999").join(" ") + "docker container ls --all --filter name=app-web-999 --quiet", + @app.container_id_for(container_name: "app-web-999").join(" ") end test "current_running_version" do assert_equal \ - "docker ps --filter label=service=app --format \"{{.Names}}\" | sed 's/-/\\n/g' | tail -n 1", + "docker ps --filter label=service=app label=role=web --format \"{{.Names}}\" | sed 's/-/\\n/g' | tail -n 1", @app.current_running_version.join(" ") end diff --git a/test/fixtures/deploy_with_accessories.yml b/test/fixtures/deploy_with_accessories.yml index 0d0c86f3..4440a1f9 100644 --- a/test/fixtures/deploy_with_accessories.yml +++ b/test/fixtures/deploy_with_accessories.yml @@ -28,4 +28,4 @@ accessories: directories: - data:/data -readiness_delay: 0 \ No newline at end of file +readiness_delay: 0