# frozen_string_literal: true # Realiza el deploy de un sitio class DeployJob < ApplicationJob class DeployException < StandardError; end # rubocop:disable Metrics/MethodLength def perform(site, notify = true, time = Time.now) ActiveRecord::Base.connection_pool.with_connection do @site = Site.find(site) # 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, notify, time) return end @site.update status: 'building' # Asegurarse que DeployLocal sea el primero! @deployed = { deploy_local: deploy_locally } # No es opcional 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 @site.update status: 'waiting' notify_usuaries if notify end end # rubocop:enable Metrics/MethodLength private def deploy_local @deploy_local ||= @site.deploys.find_by(type: 'DeployLocal') end def deploy_locally deploy_local.deploy end def deploy_others @site.deploys.where.not(type: 'DeployLocal').find_each do |d| @deployed[d.type.underscore.to_sym] = d.deploy end end 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