80 lines
2.1 KiB
Ruby
80 lines
2.1 KiB
Ruby
require "net/http"
|
|
require "test_helper"
|
|
|
|
class DeployTest < ActiveSupport::TestCase
|
|
|
|
setup do
|
|
docker_compose "up --build --force-recreate -d"
|
|
wait_for_healthy
|
|
end
|
|
|
|
teardown do
|
|
docker_compose "down -v"
|
|
end
|
|
|
|
test "deploy" do
|
|
assert_app_is_down
|
|
|
|
mrsk :deploy
|
|
|
|
assert_app_is_up
|
|
end
|
|
|
|
private
|
|
def docker_compose(*commands, capture: false)
|
|
command = "docker compose #{commands.join(" ")}"
|
|
succeeded = false
|
|
if capture
|
|
result = stdouted { succeeded = system("cd test/integration && #{command}") }
|
|
else
|
|
succeeded = system("cd test/integration && #{command}")
|
|
end
|
|
|
|
raise "Command `#{command}` failed with error code `#{$?}`" unless succeeded
|
|
result
|
|
end
|
|
|
|
def deployer_exec(*commands, capture: false)
|
|
if capture
|
|
stdouted { docker_compose("exec deployer #{commands.join(" ")}") }
|
|
else
|
|
docker_compose("exec deployer #{commands.join(" ")}", capture: capture)
|
|
end
|
|
end
|
|
|
|
def mrsk(*commands, capture: false)
|
|
deployer_exec(:mrsk, *commands, capture: capture)
|
|
end
|
|
|
|
def assert_app_is_down
|
|
assert_equal "502", app_response.code
|
|
end
|
|
|
|
def assert_app_is_up
|
|
code = app_response.code
|
|
if code != "200"
|
|
puts "Got response code #{code}, here are the traefik logs:"
|
|
mrsk :traefik, :logs
|
|
puts "And here are the load balancer logs"
|
|
docker_compose :logs, :load_balancer
|
|
puts "Tried to get the response code again and got #{app_response.code}"
|
|
end
|
|
assert_equal "200", code
|
|
end
|
|
|
|
def app_response
|
|
Net::HTTP.get_response(URI.parse("http://localhost:12345"))
|
|
end
|
|
|
|
def wait_for_healthy(timeout: 20)
|
|
timeout_at = Time.now + timeout
|
|
while docker_compose("ps -a | tail -n +2 | grep -v '(healthy)' | wc -l", capture: true) != "0"
|
|
if timeout_at < Time.now
|
|
docker_compose("ps -a | tail -n +2 | grep -v '(healthy)'")
|
|
raise "Container not healthy after #{timeout} seconds" if timeout_at < Time.now
|
|
end
|
|
sleep 0.1
|
|
end
|
|
end
|
|
end
|