Remove the healthcheck step
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.
This commit is contained in:
@@ -103,3 +103,34 @@ class SSHKit::Backend::Netssh
|
||||
|
||||
prepend LimitConcurrentStartsInstance
|
||||
end
|
||||
|
||||
require "thread"
|
||||
|
||||
module SSHKit
|
||||
module Runner
|
||||
class ParallelCompleteAll < Abstract
|
||||
def execute
|
||||
threads = hosts.map do |host|
|
||||
Thread.new(host) do |h|
|
||||
begin
|
||||
backend(h, &block).run
|
||||
rescue ::StandardError => e
|
||||
e2 = SSHKit::Runner::ExecuteError.new e
|
||||
raise e2, "Exception while executing #{host.user ? "as #{host.user}@" : "on host "}#{host}: #{e.message}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
exception = nil
|
||||
threads.each do |t|
|
||||
begin
|
||||
t.join
|
||||
rescue SSHKit::Runner::ExecuteError => e
|
||||
exception ||= e
|
||||
end
|
||||
end
|
||||
raise exception if exception
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user