Refactorizar DeployJob

This commit is contained in:
f 2021-08-07 18:30:07 -03:00
parent c08cfb1637
commit 45559ad58f

View file

@ -4,64 +4,63 @@
class DeployJob < ApplicationJob class DeployJob < ApplicationJob
class DeployException < StandardError; end class DeployException < StandardError; end
attr_reader :site attr_reader :site, :deployed
# rubocop:disable Metrics/MethodLength # rubocop:disable Metrics/MethodLength
def perform(site, notify = true, time = Time.now) def perform(site_id, notify = true, time = Time.now)
ActiveRecord::Base.connection_pool.with_connection do ActiveRecord::Base.connection_pool.with_connection do
@site = Site.find(site) @site = Site.find(site_id)
@deployed = {}
# Si ya hay una tarea corriendo, aplazar esta. Si estuvo # Si ya hay una tarea corriendo, aplazar esta. Si estuvo
# esperando más de 10 minutos, recuperar el estado anterior. # esperando más de 10 minutos, recuperar el estado anterior.
# #
# Como el trabajo actual se aplaza al siguiente, arrastrar la # Como el trabajo actual se aplaza al siguiente, arrastrar la
# hora original para poder ir haciendo timeouts. # hora original para poder ir haciendo timeouts.
if @site.building? if site.building?
if 10.minutes.ago >= time if 10.minutes.ago >= time
@site.update status: 'waiting' site.update status: 'waiting'
raise DeployException, raise DeployException,
"#{@site.name} la tarea estuvo más de 10 minutos esperando, volviendo al estado original" "#{site.name} la tarea estuvo más de 10 minutos esperando, volviendo al estado original"
end end
DeployJob.perform_in(60, site, notify, time) DeployJob.perform_in(60, site_id, notify, time)
return return
end end
@site.update status: 'building' site.update status: 'building'
# Asegurarse que DeployLocal sea el primero! # Asegurarse que DeployLocal sea el primero!
@deployed = { deploy_local: site.deploy_local.deploy } deployed[:deploy_local] = site.deploy_local.deploy
# TODO: No es opcional? deploy_others if deployed[:deploy_local]
unless @deployed[:deploy_local]
@site.update status: 'waiting'
notify_usuaries if notify
# Hacer fallar la tarea
raise DeployException, deploy_local.build_stats.last.log
end
deploy_others
# Volver a la espera # Volver a la espera
@site.update status: 'waiting' site.update status: 'waiting'
notify_usuaries if notify notify_usuaries if notify
# Hacer fallar la tarea para enterarnos.
raise DeployException, site.deploy_local.build_stats.last.log unless deployed[:deploy_local]
end end
end end
# rubocop:enable Metrics/MethodLength # rubocop:enable Metrics/MethodLength
private private
# Correr todas las tareas que no sean el deploy local.
def deploy_others def deploy_others
@site.deploys.where.not(type: 'DeployLocal').find_each do |d| site.deploys.where.not(type: 'DeployLocal').find_each do |d|
@deployed[d.type.underscore.to_sym] = d.deploy deployed[d.type.underscore.to_sym] = d.deploy
end end
end end
# Notificar a todes les usuaries no temporales.
#
# TODO: Poder configurar quiénes quieren recibir notificaciones.
def notify_usuaries def notify_usuaries
@site.roles.where(rol: 'usuarie', temporal: false).pluck(:usuarie_id).each do |usuarie| site.roles.where(rol: 'usuarie', temporal: false).pluck(:usuarie_id).each do |usuarie|
DeployMailer.with(usuarie: usuarie, site: @site.id) DeployMailer.with(usuarie: usuarie, site: site.id)
.deployed(@deployed) .deployed(deployed)
.deliver_now .deliver_now
end end
end end