5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-07-08 22:55:45 +00:00

feat: generar el sitio en orden #10464

This commit is contained in:
f 2023-03-18 13:42:47 -03:00
parent 96ea3715fd
commit 57719c8f44
6 changed files with 46 additions and 55 deletions

View file

@ -26,61 +26,12 @@ class DeployJob < ApplicationJob
return
end
@deployed = {}
@site.update status: 'building'
# Asegurarse que DeployLocal sea el primero!
@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
end
def deploy_others
@site.deploys.where.not(type: 'DeployLocal').find_each do |d|
@site.deployment_list.each do |d|
begin
raise DeployException, 'Una dependencia falló' if failed_dependencies? d
status = d.deploy
seconds = d.build_stats.last.try(:seconds)
rescue StandardError => e
@ -97,6 +48,46 @@ class DeployJob < ApplicationJob
urls: d.respond_to?(:urls) ? d.urls : [d.url].compact
}
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)
!(deploy.class::DEPENDENCIES - failed_dependencies(deploy)).empty?
end
# Obtiene las dependencias fallidas de un deploy
#
# @param :deploy [Deploy]
# @return [Array]
def failed_dependencies(deploy)
@deployed.select 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
}
ExceptionNotifier.notify_exception(exception, data: data)
end
def notify_usuaries

View file

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

View file

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

View file

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

View file

@ -8,7 +8,7 @@ require 'zip'
class DeployZip < Deploy
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
# y generar un zip accesible públicamente.

View file

@ -19,7 +19,7 @@ class Site
deploys.each do |deploy|
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
end
end