# 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