To speed up deployments, we'll remove the healthcheck step. This adds some risk to deployments for non-web roles - if they don't have a Docker healthcheck configured then the only check we do is if the container is running. If there is a bad image we might see the container running before it exits and deploy it. Previously the healthcheck step would have avoided this by ensuring a web container could boot and serve traffic first. To mitigate this, we'll add a deployment barrier. Until one of the primary role containers passes its healthcheck, we'll keep the barrier up and avoid stopping the containers on the non-primary roles. It the primary role container fails its healthcheck, we'll close the barrier and shut down the new containers on the waiting roles. We also have a new integration test to check we correctly handle a a broken image. This highlighted that SSHKit's default runner will stop at the first error it encounters. We'll now have a custom runner that waits for all threads to finish allowing them to clean up.
25 lines
631 B
Ruby
25 lines
631 B
Ruby
require_relative "integration_test"
|
|
|
|
class BrokenDeployTest < IntegrationTest
|
|
test "deploying a bad image" do
|
|
@app = "app_with_roles"
|
|
|
|
kamal :envify
|
|
|
|
first_version = latest_app_version
|
|
|
|
kamal :deploy
|
|
|
|
assert_app_is_up version: first_version
|
|
assert_container_running host: :vm3, name: "app-workers-#{first_version}"
|
|
|
|
second_version = break_app
|
|
|
|
kamal :deploy, raise_on_error: false
|
|
|
|
assert_app_is_up version: first_version
|
|
assert_container_running host: :vm3, name: "app-workers-#{first_version}"
|
|
assert_container_not_running host: :vm3, name: "app-workers-#{second_version}"
|
|
end
|
|
end
|