lib/lita/handlers/ey_deploy.rb
module Lita
module Handlers
class EyDeploy < EyBase
route(/ey deploy (\w*) (\w*)( [\w\/\.\-\_]*)?/i, :deploy, command: true, help: {
"ey deploy [app] [env] <git_ref>" => "Deploy specified tag / branch / ref (or default) to a particular app env"
})
route(/ey rollback (\w*) (\w*)/i, :rollback, command: true, help: {
"ey rollback [app] [env]" => "Rollback a particular app env to previous version"
})
route(/ey maintenance on (\w*) (\w*)/i, :enable_maintenance, command: true, help: {
"ey maintenance on [app] [env]" => "Place maintenance page at a particular app env"
})
route(/ey maintenance off (\w*) (\w*)/i, :disable_maintenance, command: true, help: {
"ey maintenance off [app] [env]" => "Disable maintenance page at a particular app env"
})
def deploy(response)
app = response.matches[0][0]
env = response.matches[0][1]
response.reply "Deploy what to where?" and return unless valid_app?(app) && valid_env?(app, env)
git_ref = (response.matches[0][2] || default_branch_for(app, env)).strip
do_if_can_access(response, app, env) do
response.reply "Deploying #{app} git ref '#{git_ref}' to #{env}"
cmd = ey_deploy_cmd(app, env, git_ref)
Lita.logger.info cmd
deploy_result = `#{cmd}`
feedback_msg = deploy_result.include?(ey_failure_msg) ? failed_msg : success_msg
response.reply feedback_msg
end
end
def rollback(response)
app = response.matches[0][0].strip
env = response.matches[0][1].strip
response.reply "Rollback what?" and return unless valid_app?(app) && valid_env?(app, env)
do_if_can_access(response, app, env) do
response.reply "Rolling back #{app} #{env} to previous version..."
cmd = ey_rollback_cmd(app, env)
Lita.logger.info cmd
result = `#{cmd}`
response.reply result
end
end
def enable_maintenance(response)
app = response.matches[0][0].strip
env = response.matches[0][1].strip
response.reply "Place maintenance page where?" and return unless valid_app?(app) && valid_env?(app, env)
do_if_can_access(response, app, env) do
response.reply "Placing maintenance page at #{app} #{env}..."
cmd = ey_maintenance_on_cmd(app, env)
Lita.logger.info cmd
result = `#{cmd}`
response.reply result
end
end
def disable_maintenance(response)
app = response.matches[0][0].strip
env = response.matches[0][1].strip
response.reply "Disable maintenance page where?" and return unless valid_app?(app) && valid_env?(app, env)
do_if_can_access(response, app, env) do
response.reply "Disabling maintenance page at #{app} #{env}..."
cmd = ey_maintenance_on_cmd(app, env)
Lita.logger.info cmd
result = `#{cmd}`
response.reply result
end
end
private
def ey_deploy_cmd(app, env, git_ref)
"bundle exec ey deploy --app='#{ey_app(app)}' --environment='#{ey_env(app, env)}' -R '#{git_ref}' --migrate='rake db:migrate' --api-token=#{config.api_token}"
end
def ey_rollback_cmd(app, env)
"bundle exec ey rollback --app='#{ey_app(app)}' --environment='#{ey_env(app, env)}' --api-token=#{config.api_token}"
end
def ey_maintenance_on_cmd(app, env)
"bundle exec ey web disable --app='#{ey_app(app)}' --environment='#{ey_env(app, env)}' --api-token=#{config.api_token}"
end
def ey_maintenance_off_cmd(app, env)
"bundle exec ey web enable --app='#{ey_app(app)}' --environment='#{ey_env(app, env)}' --api-token=#{config.api_token}"
end
def ey_failure_msg
"Failed deployment recorded on Engine Yard Cloud"
end
def success_msg
"Deployment done. Restarting!"
end
def failed_msg
"Deployment failed! Shame on you!"
end
end
Lita.register_handler(EyDeploy)
end
end