5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-16 19:36:22 +00:00

feat: generar el sitio en orden #10464

This commit is contained in:
f 2023-03-18 13:42:47 -03:00
parent 607f19f680
commit e5f96c435d
6 changed files with 48 additions and 56 deletions

View file

@ -30,62 +30,13 @@ class DeployJob < ApplicationJob
return return
end end
@deployed = {}
@site.update status: 'building' @site.update status: 'building'
# Asegurarse que DeployLocal sea el primero! @site.deployment_list.each do |d|
@deployed = {
deploy_local: {
status: deploy_locally,
seconds: deploy_local.build_stats.last.seconds,
size: deploy_local.size,
urls: [deploy_local.url]
}
}
# No es opcional
unless @deployed[:deploy_local][:status]
# Hacer fallar la tarea
raise DeployException, "#{@site.name}: Falló la compilación"
end
deploy_others
rescue DeployTimedOutException => e
notify_exception e
rescue DeployException => e
notify_exception e, deploy_local
ensure
@site&.update status: 'waiting'
notify_usuaries if notify
end
end
# rubocop:enable Metrics/MethodLength
private
# @param :exception [StandardError]
# @param :deploy [Deploy]
def notify_exception(exception, deploy = nil)
data = {
site: @site.id,
deploy: deploy&.type,
log: deploy&.build_stats&.last&.log
}
ExceptionNotifier.notify_exception(exception, data: data)
end
def deploy_local
@deploy_local ||= @site.deploys.find_by(type: 'DeployLocal')
end
def deploy_locally
deploy_local.deploy(output: @output)
end
def deploy_others
@site.deploys.where.not(type: 'DeployLocal').find_each do |d|
begin begin
status = d.deploy(output: @output) raise DeployException, 'Una dependencia falló' if failed_dependencies? d
status = d.deploy
seconds = d.build_stats.last.try(:seconds) seconds = d.build_stats.last.try(:seconds)
rescue StandardError => e rescue StandardError => e
status = false status = false
@ -101,6 +52,47 @@ class DeployJob < ApplicationJob
urls: d.respond_to?(:urls) ? d.urls : [d.url].compact urls: d.respond_to?(:urls) ? d.urls : [d.url].compact
} }
end end
rescue DeployTimedOutException => e
notify_exception e
ensure
@site&.update status: 'waiting'
notify_usuaries if notify
end
end
# rubocop:enable Metrics/MethodLength
private
# Detecta si un método de publicación tiene dependencias fallidas
#
# @param :deploy [Deploy]
# @return [Boolean]
def failed_dependencies?(deploy)
failed_dependencies(deploy).present?
end
# Obtiene las dependencias fallidas de un deploy
#
# @param :deploy [Deploy]
# @return [Array]
def failed_dependencies(deploy)
deploy.class::DEPENDENCIES & (@deployed.reject do |_, v|
v[:status]
end.keys)
end
# @param :exception [StandardError]
# @param :deploy [Deploy]
def notify_exception(exception, deploy = nil)
data = {
site: @site.id,
deploy: deploy&.type,
log: deploy&.build_stats&.last&.log,
failed_dependencies: (failed_dependencies(deploy) if deploy)
}
ExceptionNotifier.notify_exception(exception, data: data)
end end
def notify_usuaries def notify_usuaries

View file

@ -4,7 +4,7 @@
class DeployAlternativeDomain < Deploy class DeployAlternativeDomain < Deploy
store :values, accessors: %i[hostname], coder: JSON store :values, accessors: %i[hostname], coder: JSON
DEPENDENCIES = %i[local] DEPENDENCIES = %i[deploy_local]
# Generar un link simbólico del sitio principal al alternativo # Generar un link simbólico del sitio principal al alternativo
def deploy(**) def deploy(**)

View file

@ -6,11 +6,11 @@ class DeployRsync < Deploy
store :values, accessors: %i[destination host_keys], coder: JSON store :values, accessors: %i[destination host_keys], coder: JSON
DEPENDENCIES = %i[ DEPENDENCIES = %i[
alternative_domain deploy_alternative_domain
hidden_service deploy_hidden_service
local deploy_local
www deploy_www
zip deploy_zip
] ]
def deploy(output: false) def deploy(output: false)

View file

@ -4,7 +4,7 @@
class DeployWww < Deploy class DeployWww < Deploy
store :values, accessors: %i[], coder: JSON store :values, accessors: %i[], coder: JSON
DEPENDENCIES = %i[local] DEPENDENCIES = %i[deploy_local]
before_destroy :remove_destination! before_destroy :remove_destination!

View file

@ -8,7 +8,7 @@ require 'zip'
class DeployZip < Deploy class DeployZip < Deploy
store :values, accessors: %i[], coder: JSON store :values, accessors: %i[], coder: JSON
DEPENDENCIES = %i[local] DEPENDENCIES = %i[deploy_local]
# Una vez que el sitio está generado, tomar todos los archivos y # Una vez que el sitio está generado, tomar todos los archivos y
# y generar un zip accesible públicamente. # y generar un zip accesible públicamente.

View file

@ -19,7 +19,7 @@ class Site
deploys.each do |deploy| deploys.each do |deploy|
deploy.class::DEPENDENCIES.each do |dependency| deploy.class::DEPENDENCIES.each do |dependency|
deploys.where(type: "Deploy#{dependency.to_s.classify}").each do |deploy_dependency| deploys.where(type: dependency.to_s.classify).each do |deploy_dependency|
graph.add_edge deploy_dependency, deploy graph.add_edge deploy_dependency, deploy
end end
end end