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.
32 lines
452 B
Ruby
32 lines
452 B
Ruby
class Kamal::Cli::Healthcheck::Barrier
|
|
def initialize
|
|
@ivar = Concurrent::IVar.new
|
|
end
|
|
|
|
def close
|
|
set(false)
|
|
end
|
|
|
|
def open
|
|
set(true)
|
|
end
|
|
|
|
def wait
|
|
unless opened?
|
|
raise Kamal::Cli::Healthcheck::Error.new("Halted at barrier")
|
|
end
|
|
end
|
|
|
|
private
|
|
def opened?
|
|
@ivar.value
|
|
end
|
|
|
|
def set(value)
|
|
@ivar.set(value)
|
|
true
|
|
rescue Concurrent::MultipleAssignmentError
|
|
false
|
|
end
|
|
end
|