# frozen_string_literal: true # Realiza el deploy de un sitio class DeployJob < ApplicationJob class DeployException < StandardError; end attr_reader :site, :deployed # rubocop:disable Metrics/MethodLength def perform(site_id, notify = true, time = Time.now) ActiveRecord::Base.connection_pool.with_connection do @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. if site.building? if 10.minutes.ago >= time site.update status: 'waiting' raise DeployException, "#{site.name} la tarea estuvo más de 10 minutos esperando, volviendo al estado original" end DeployJob.perform_in(60, site_id, notify, time) return end site.update status: 'building' # Asegurarse que DeployLocal sea el primero! deployed[:deploy_local] = site.deploy_local.deploy deploy_others if deployed[:deploy_local] # Volver a la espera site.update status: 'waiting' 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 # rubocop:enable Metrics/MethodLength private # Correr todas las tareas que no sean el deploy local. def deploy_others site.deploys.where.not(type: 'DeployLocal').find_each do |d| deployed[d.type.underscore.to_sym] = d.deploy end end # Notificar a todes les usuaries no temporales. # # TODO: Poder configurar quiénes quieren recibir notificaciones. def notify_usuaries site.roles.where(rol: 'usuarie', temporal: false).pluck(:usuarie_id).each do |usuarie| DeployMailer.with(usuarie: usuarie, site: site.id) .deployed(deployed) .deliver_now end end end