mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-16 17:46:21 +00:00
feat: generar el sitio en orden #10464
This commit is contained in:
parent
607f19f680
commit
e5f96c435d
6 changed files with 48 additions and 56 deletions
|
@ -30,62 +30,13 @@ 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(output: @output)
|
||||
end
|
||||
|
||||
def deploy_others
|
||||
@site.deploys.where.not(type: 'DeployLocal').find_each do |d|
|
||||
@site.deployment_list.each do |d|
|
||||
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)
|
||||
rescue StandardError => e
|
||||
status = false
|
||||
|
@ -101,6 +52,47 @@ 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)
|
||||
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
|
||||
|
||||
def notify_usuaries
|
||||
|
|
|
@ -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(**)
|
||||
|
|
|
@ -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(output: false)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
class DeployWww < Deploy
|
||||
store :values, accessors: %i[], coder: JSON
|
||||
|
||||
DEPENDENCIES = %i[local]
|
||||
DEPENDENCIES = %i[deploy_local]
|
||||
|
||||
before_destroy :remove_destination!
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue