Refactorizar Deploy
* Validar los hostnames * Generar los hostnames por defecto * Cada Deploy sabe su propia URL
This commit is contained in:
parent
7cfd55e126
commit
e1664d0c12
2 changed files with 110 additions and 48 deletions
|
@ -1,44 +1,85 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'open3'
|
require 'open3'
|
||||||
|
|
||||||
# Este modelo implementa los distintos tipos de alojamiento que provee
|
# Este modelo implementa los distintos tipos de alojamiento que provee
|
||||||
# Sutty.
|
# Sutty.
|
||||||
#
|
#
|
||||||
# Los datos se guardan en la tabla `deploys`. Para guardar los
|
# TODO: Cambiar el nombre a algo que no sea industrial/militar.
|
||||||
# atributos, cada modelo tiene que definir su propio `store
|
|
||||||
# :attributes`.
|
|
||||||
class Deploy < ApplicationRecord
|
class Deploy < ApplicationRecord
|
||||||
|
# Un sitio puede tener muchas formas de publicarse.
|
||||||
belongs_to :site
|
belongs_to :site
|
||||||
|
|
||||||
|
# Siempre generar el hostname
|
||||||
|
after_initialize :default_hostname!
|
||||||
|
# Eliminar los archivos generados por el deploy.
|
||||||
|
before_destroy :remove_destination!
|
||||||
|
|
||||||
|
# Registro de las tareas ejecutadas
|
||||||
has_many :build_stats, dependent: :destroy
|
has_many :build_stats, dependent: :destroy
|
||||||
|
|
||||||
|
# Siempre tienen que pertenecer a un sitio
|
||||||
|
validates :site, presence: true
|
||||||
|
# El hostname tiene que ser único en toda la plataforma
|
||||||
|
validates :hostname, uniqueness: true
|
||||||
|
# Cada deploy puede implementar su propia validación
|
||||||
|
validates :hostname, hostname: true, unless: :implements_hostname_validation?
|
||||||
|
|
||||||
|
# Genera el hostname
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
def default_hostname
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
# Devolver la URL
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
def url
|
||||||
|
"https://#{hostname}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Ejecutar la tarea
|
||||||
|
#
|
||||||
|
# @return [Boolean]
|
||||||
def deploy
|
def deploy
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
end
|
end
|
||||||
|
|
||||||
def limit
|
# El espacio ocupado por este deploy.
|
||||||
raise NotImplementedError
|
#
|
||||||
end
|
# @return [Integer]
|
||||||
|
|
||||||
def size
|
def size
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Empezar a contar el tiempo
|
||||||
|
#
|
||||||
|
# @return [Time]
|
||||||
def time_start
|
def time_start
|
||||||
@start = Time.now
|
@start = Time.now
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Detener el contador
|
||||||
|
#
|
||||||
|
# @return [Time]
|
||||||
def time_stop
|
def time_stop
|
||||||
@stop = Time.now
|
@stop = Time.now
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Obtener la demora de la tarea
|
||||||
|
#
|
||||||
|
# @return [Float]
|
||||||
def time_spent_in_seconds
|
def time_spent_in_seconds
|
||||||
(@stop - @start).round(3)
|
(@stop - @start).round(3)
|
||||||
end
|
end
|
||||||
|
|
||||||
def home_dir
|
# El directorio donde se almacenan las gemas.
|
||||||
site.path
|
#
|
||||||
end
|
# TODO: En un momento podíamos tenerlas todas compartidas y ahorrar
|
||||||
|
# espacio, pero bundler empezó a mezclar cosas.
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
def gems_dir
|
def gems_dir
|
||||||
@gems_dir ||= Rails.root.join('_storage', 'gems', site.name)
|
@gems_dir ||= Rails.root.join('_storage', 'gems', site.name)
|
||||||
end
|
end
|
||||||
|
@ -77,9 +118,33 @@ class Deploy < ApplicationRecord
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# Genera el hostname
|
||||||
|
#
|
||||||
|
# @return [Boolean]
|
||||||
|
def default_hostname!
|
||||||
|
self.hostname = default_hostname
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
# Elimina los archivos generados por el deploy
|
||||||
|
#
|
||||||
|
# @return [Boolean]
|
||||||
|
def remove_destination!
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
# Convierte el comando en una versión resumida.
|
||||||
|
#
|
||||||
# @param [String]
|
# @param [String]
|
||||||
# @return [String]
|
# @return [String]
|
||||||
def readable_cmd(cmd)
|
def readable_cmd(cmd)
|
||||||
cmd.split(' -', 2).first.tr(' ', '_')
|
cmd.split(' -', 2).first.tr(' ', '_')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Cada deploy puede decidir su propia validación
|
||||||
|
#
|
||||||
|
# @return [Boolean]
|
||||||
|
def implements_hostname_validation?
|
||||||
|
false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -85,47 +85,44 @@ class Site < ApplicationRecord
|
||||||
@repository ||= Site::Repository.new path
|
@repository ||= Site::Repository.new path
|
||||||
end
|
end
|
||||||
|
|
||||||
def hostname
|
# El primer deploy del sitio
|
||||||
sub = name || I18n.t('deploys.deploy_local.ejemplo')
|
|
||||||
|
|
||||||
if sub.ends_with? '.'
|
|
||||||
sub.gsub(/\.\Z/, '')
|
|
||||||
else
|
|
||||||
"#{sub}.#{Site.domain}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Devuelve la URL siempre actualizada a través del hostname
|
|
||||||
#
|
#
|
||||||
# @param slash Boolean Agregar / al final o no
|
# @return [DeployLocal]
|
||||||
# @return String La URL con o sin / al final
|
def deploy_local
|
||||||
def url(slash: true)
|
@deploy_local ||= deploys.order(created_at: :asc).find_by(type: 'DeployLocal')
|
||||||
"https://#{hostname}#{slash ? '/' : ''}"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Obtiene los dominios alternativos
|
# Todas las URLs posibles para este sitio, ordenados según fecha de
|
||||||
|
# creación.
|
||||||
#
|
#
|
||||||
# @return Array
|
# @param :slash [Boolean] Con o sin / al final, por defecto con
|
||||||
def alternative_hostnames
|
# @return [Array]
|
||||||
deploys.where(type: 'DeployAlternativeDomain').map(&:hostname).map do |h|
|
|
||||||
h.end_with?('.') ? h[0..-2] : "#{h}.#{Site.domain}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Obtiene todas las URLs alternativas para este sitio
|
|
||||||
#
|
|
||||||
# @return Array
|
|
||||||
def alternative_urls(slash: true)
|
|
||||||
alternative_hostnames.map do |h|
|
|
||||||
"https://#{h}#{slash ? '/' : ''}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Todas las URLs posibles para este sitio
|
|
||||||
#
|
|
||||||
# @return Array
|
|
||||||
def urls(slash: true)
|
def urls(slash: true)
|
||||||
alternative_urls(slash: slash) << url(slash: slash)
|
deploys.order(created_at: :asc).map(&:url).map do |url|
|
||||||
|
slash ? "#{url}/" : url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Todos los hostnames, ordenados según fecha de creación.
|
||||||
|
#
|
||||||
|
# @return [Array]
|
||||||
|
def hostnames
|
||||||
|
deploys.order(created_at: :asc).pluck(:hostname)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Obtiene la URL principal
|
||||||
|
#
|
||||||
|
# @param :slash [Boolean]
|
||||||
|
# @return [String]
|
||||||
|
def url(slash: true)
|
||||||
|
deploy_local.url.tap do |url|
|
||||||
|
"#{url}/" if slash
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: Usar DeployCanonical
|
||||||
|
def hostname
|
||||||
|
deploy_local.hostname
|
||||||
end
|
end
|
||||||
|
|
||||||
def invitade?(usuarie)
|
def invitade?(usuarie)
|
||||||
|
|
Loading…
Reference in a new issue