sutty/app/models/deploy_local.rb

89 lines
1.9 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
# Alojamiento local, solo genera el sitio, con lo que no necesita hacer
# nada más
class DeployLocal < Deploy
store :values, accessors: %i[fqdn destination], coder: JSON
before_create :fqdn!, :destination!
before_destroy :remove_destination!
# Realizamos la construcción del sitio usando Jekyll y un entorno
# limpio para no pasarle secretos
#
# Pasamos variables de entorno mínimas para no filtrar secretos de
# Sutty
#
# TODO: Recolectar estadísticas y enviarlas a la base de datos
def deploy
yarn && bundle && jekyll_build
end
# Sólo permitimos un deploy local
def limit
1
end
# Obtener el tamaño de todos los archivos y directorios (los
# directorios son archivos :)
def size
paths = [destination, File.join(destination, '**', '**')]
Dir.glob(paths).map do |file|
File.size file
end.inject(:+)
end
private
# Un entorno que solo tiene lo que necesitamos
def env
# XXX: This doesn't support Windows paths :B
paths = [File.dirname(`which bundle`), '/usr/bin']
{ 'PATH' => paths.join(':'), 'JEKYLL_ENV' => 'production' }
end
def yarn_lock
File.join(site.path, 'yarn.lock')
end
def yarn_lock?
File.exist? yarn_lock
end
# Corre yarn dentro del repositorio
def yarn
return unless yarn_lock?
run 'yarn'
end
def bundle
run 'bundle'
end
def jekyll_build
run "bundle exec jekyll build --destination \"#{escaped_destination}\""
end
def fqdn!
self.fqdn ||= "#{site.name}.#{Site.domain}"
end
def destination!
self.destination ||= File.join(Rails.root, '_deploy', fqdn)
end
# no debería haber espacios ni caracteres especiales, pero por si
# acaso...
def escaped_destination
Shellwords.escape destination
end
# Eliminar el destino si se elimina el deploy
def remove_destination!
FileUtils.rm_rf destination
end
end