Reboot if running

This commit is contained in:
David Heinemeier Hansson
2023-02-03 13:52:31 +01:00
parent 3bd2559c03
commit 2023c377ab
2 changed files with 27 additions and 3 deletions

View File

@@ -3,15 +3,21 @@ require "mrsk/cli/base"
class Mrsk::Cli::App < Mrsk::Cli::Base class Mrsk::Cli::App < Mrsk::Cli::Base
desc "boot", "Boot app on servers (or start them if they've already been booted)" desc "boot", "Boot app on servers (or start them if they've already been booted)"
def boot def boot
using_version(options[:version] || most_recent_version_available) do cli = self
using_version(options[:version] || most_recent_version_available) do |version|
MRSK.config.roles.each do |role| MRSK.config.roles.each do |role|
on(role.hosts) do |host| on(role.hosts) do |host|
begin begin
execute *MRSK.app.run(role: role.name) execute *MRSK.app.run(role: role.name)
rescue SSHKit::Command::Failed => e rescue SSHKit::Command::Failed => e
if e.message =~ /already in use/ if e.message =~ /already in use/
error "Container with same version already deployed on #{host}, starting that instead" error "Rebooting container with same version already deployed on #{host}"
execute *MRSK.app.start, host: host
cli.stop
cli.remove_container version
execute *MRSK.app.run(role: role.name)
else else
raise raise
end end

View File

@@ -5,6 +5,24 @@ class CliAppTest < CliTestCase
assert_match /Running docker run -d --restart unless-stopped/, run_command("boot") assert_match /Running docker run -d --restart unless-stopped/, run_command("boot")
end end
test "boot will reboot if same version is already running" do
run_command("details") # Preheat MRSK const
# 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.returns([ :docker, :run ])
run_command("boot").tap do |output|
assert_match /Rebooting container with same version already deployed/, output # Can't start what's already running
assert_match /docker ps -q --filter label=service=app | xargs docker stop/, output # Stop what's running
assert_match /docker container ls -a -f name=app-999 -q | docker container rm/, output # Remove old container
assert_match /docker run/, output # Start new container
end
ensure
Thread.report_on_exception = true
end
test "reboot to default version" do test "reboot to default version" do
run_command("reboot").tap do |output| run_command("reboot").tap do |output|
assert_match /docker ps --filter label=service=app/, output # Find current container assert_match /docker ps --filter label=service=app/, output # Find current container