5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-07-03 12:26:07 +00:00
panel/app/jobs/deploy_job.rb

68 lines
2 KiB
Ruby
Raw Normal View History

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