agregar distintas formas de deploy a un sitio
This commit is contained in:
parent
7570abaf1a
commit
b561cacda4
11 changed files with 145 additions and 7 deletions
|
@ -44,6 +44,7 @@ Metrics/ClassLength:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/models/site.rb'
|
- 'app/models/site.rb'
|
||||||
- 'app/controllers/posts_controller.rb'
|
- 'app/controllers/posts_controller.rb'
|
||||||
|
- 'app/controllers/sites_controller.rb'
|
||||||
|
|
||||||
Lint/HandleExceptions:
|
Lint/HandleExceptions:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
|
|
@ -23,6 +23,9 @@ class SitesController < ApplicationController
|
||||||
def new
|
def new
|
||||||
@site = Site.new
|
@site = Site.new
|
||||||
authorize @site
|
authorize @site
|
||||||
|
|
||||||
|
@site.deploys.build type: 'DeployLocal'
|
||||||
|
@site.deploys.build type: 'DeployZip'
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
@ -137,6 +140,10 @@ class SitesController < ApplicationController
|
||||||
private
|
private
|
||||||
|
|
||||||
def site_params
|
def site_params
|
||||||
params.require(:site).permit(:name, :design_id, :licencia_id)
|
params.require(:site)
|
||||||
|
.permit(:name, :design_id, :licencia_id,
|
||||||
|
deploys_attributes: %i[
|
||||||
|
type id _destroy
|
||||||
|
])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -57,7 +57,7 @@ class DeployLocal < Deploy
|
||||||
end
|
end
|
||||||
|
|
||||||
def fqdn!
|
def fqdn!
|
||||||
self.fqdn ||= "#{site.name}.#{ENV.fetch('SUTTY', 'sutty.nl')}"
|
self.fqdn ||= "#{site.name}.#{Site.domain}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def destination!
|
def destination!
|
||||||
|
|
|
@ -30,7 +30,7 @@ class DeployZip < Deploy
|
||||||
# Copiamos de DeployLocal para no cargar todos los métodos de
|
# Copiamos de DeployLocal para no cargar todos los métodos de
|
||||||
# compilación...
|
# compilación...
|
||||||
def fqdn!
|
def fqdn!
|
||||||
self.fqdn ||= "#{site.name}.#{ENV.fetch('SUTTY', 'sutty.nl')}"
|
self.fqdn ||= "#{site.name}.#{Site.domain}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def destination!
|
def destination!
|
||||||
|
|
|
@ -8,6 +8,8 @@ class Site < ApplicationRecord
|
||||||
validates :name, uniqueness: true, hostname: true
|
validates :name, uniqueness: true, hostname: true
|
||||||
validates :design_id, presence: true
|
validates :design_id, presence: true
|
||||||
|
|
||||||
|
validate :deploy_local_presence
|
||||||
|
|
||||||
friendly_id :name, use: %i[finders]
|
friendly_id :name, use: %i[finders]
|
||||||
|
|
||||||
belongs_to :design
|
belongs_to :design
|
||||||
|
@ -33,6 +35,8 @@ class Site < ApplicationRecord
|
||||||
|
|
||||||
attr_accessor :jekyll, :collections
|
attr_accessor :jekyll, :collections
|
||||||
|
|
||||||
|
accepts_nested_attributes_for :deploys, allow_destroy: true
|
||||||
|
|
||||||
# El repositorio git para este sitio
|
# El repositorio git para este sitio
|
||||||
def repository
|
def repository
|
||||||
@repository ||= Site::Repository.new path
|
@repository ||= Site::Repository.new path
|
||||||
|
@ -370,6 +374,10 @@ class Site < ApplicationRecord
|
||||||
Jekyll::Site.new(config)
|
Jekyll::Site.new(config)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.domain
|
||||||
|
ENV.fetch('SUTTY', 'sutty.nl')
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Clona el esqueleto de Sutty para crear el sitio nuevo, no pasa nada
|
# Clona el esqueleto de Sutty para crear el sitio nuevo, no pasa nada
|
||||||
|
@ -399,4 +407,17 @@ class Site < ApplicationRecord
|
||||||
|
|
||||||
FileUtils.mv old_path, path
|
FileUtils.mv old_path, path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Valida si el sitio tiene al menos una forma de alojamiento asociada
|
||||||
|
# y es la local
|
||||||
|
#
|
||||||
|
# TODO: Volver opcional el alojamiento local, pero ahora mismo está
|
||||||
|
# atado a la generación del sitio así que no puede faltar
|
||||||
|
def deploy_local_presence
|
||||||
|
# Usamos size porque queremos saber la cantidad de deploys sin
|
||||||
|
# guardar también
|
||||||
|
return if deploys.size.positive? && deploys.map(&:type).include?('DeployLocal')
|
||||||
|
|
||||||
|
errors.add(:deploys, I18n.t('activerecord.errors.models.site.attributes.deploys.deploy_local_presence'))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
14
app/views/deploys/_deploy_local.haml
Normal file
14
app/views/deploys/_deploy_local.haml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
-#
|
||||||
|
Formulario para alojamiento local. Como el alojamiento local no es
|
||||||
|
opcional aun, solo enviamos el tipo con el formulario, no necesitamos
|
||||||
|
nada más.
|
||||||
|
|
||||||
|
.row
|
||||||
|
.col
|
||||||
|
%h3= t('.title')
|
||||||
|
- name = site.name || t('.ejemplo')
|
||||||
|
= sanitize_markdown t('.help',
|
||||||
|
fqdn: deploy.object.fqdn || "#{name}.#{Site.domain}"),
|
||||||
|
tags: %w[p strong em a]
|
||||||
|
|
||||||
|
= deploy.hidden_field :type
|
21
app/views/deploys/_deploy_zip.haml
Normal file
21
app/views/deploys/_deploy_zip.haml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
-# Formulario para "alojar" en un zip
|
||||||
|
|
||||||
|
.row
|
||||||
|
.col
|
||||||
|
= deploy.hidden_field :id
|
||||||
|
= deploy.hidden_field :type
|
||||||
|
%h3
|
||||||
|
-#
|
||||||
|
El checkbox invierte la lógica de destrucción porque queremos
|
||||||
|
crear el deploy si está activado y destruirlo si está
|
||||||
|
desactivado.
|
||||||
|
= deploy.check_box :_destroy,
|
||||||
|
{ checked: deploy.object.persisted? },
|
||||||
|
'0', '1'
|
||||||
|
= deploy.label :_destroy, t('.title')
|
||||||
|
-# TODO: secar la generación de URLs
|
||||||
|
- name = site.name || t('.ejemplo')
|
||||||
|
= sanitize_markdown t('.help',
|
||||||
|
fqdn: deploy.object.fqdn || "#{name}.#{Site.domain}",
|
||||||
|
file: deploy.object.file || "#{name}.zip"),
|
||||||
|
tags: %w[p strong em a]
|
|
@ -46,5 +46,14 @@
|
||||||
|
|
||||||
%hr/
|
%hr/
|
||||||
|
|
||||||
|
.form-group
|
||||||
|
%h2= t('.deploys.title')
|
||||||
|
%p.lead= t('.help.deploys')
|
||||||
|
|
||||||
|
= f.fields_for :deploys do |deploy|
|
||||||
|
= render "deploys/#{deploy.object.type.underscore}",
|
||||||
|
deploy: deploy, site: site
|
||||||
|
%hr/
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.submit submit, class: 'btn btn-success'
|
= f.submit submit, class: 'btn btn-success'
|
||||||
|
|
|
@ -11,6 +11,10 @@ es:
|
||||||
name: 'Nombre'
|
name: 'Nombre'
|
||||||
errors:
|
errors:
|
||||||
models:
|
models:
|
||||||
|
site:
|
||||||
|
attributes:
|
||||||
|
deploys:
|
||||||
|
deploy_local_presence: '¡Necesitamos poder generar el sitio!'
|
||||||
invitadx:
|
invitadx:
|
||||||
attributes:
|
attributes:
|
||||||
email:
|
email:
|
||||||
|
@ -145,6 +149,25 @@ es:
|
||||||
lang: 'Idioma'
|
lang: 'Idioma'
|
||||||
logout: 'Salir'
|
logout: 'Salir'
|
||||||
error: 'Hubo un error al iniciar la sesión. ¿Escribiste bien tus credenciales?'
|
error: 'Hubo un error al iniciar la sesión. ¿Escribiste bien tus credenciales?'
|
||||||
|
deploys:
|
||||||
|
deploy_local:
|
||||||
|
title: 'Alojar en Sutty'
|
||||||
|
help: |
|
||||||
|
El sitio estará disponible en <https://%{fqdn}/>.
|
||||||
|
|
||||||
|
Estamos desarrollando la posibilidad de agregar tus propios
|
||||||
|
dominios, ¡ayudanos!
|
||||||
|
ejemplo: 'ejemplo'
|
||||||
|
deploy_zip:
|
||||||
|
title: 'Generar un archivo ZIP'
|
||||||
|
help: |
|
||||||
|
Los archivos ZIP contienen y comprimen todos los archivos de tu
|
||||||
|
sitio. Con esta opción podrás descargar y compartir tu sitio
|
||||||
|
entero a través de la dirección <https://%{fqdn}/%{file}> y
|
||||||
|
guardarla como copia de seguridad o una estrategia de
|
||||||
|
alojamiento solidario, donde muchas personas comparten una copia
|
||||||
|
de tu sitio.
|
||||||
|
ejemplo: 'ejemplo'
|
||||||
sites:
|
sites:
|
||||||
actions: 'Acciones'
|
actions: 'Acciones'
|
||||||
posts: 'Ver y editar artículos'
|
posts: 'Ver y editar artículos'
|
||||||
|
@ -171,6 +194,11 @@ es:
|
||||||
de autore. Esto significa que nadie puede hacer uso de nuestras
|
de autore. Esto significa que nadie puede hacer uso de nuestras
|
||||||
obras sin permiso explícito. Con las licencias establecemos
|
obras sin permiso explícito. Con las licencias establecemos
|
||||||
condiciones bajo las que queremos compartir.'
|
condiciones bajo las que queremos compartir.'
|
||||||
|
deploys: |
|
||||||
|
Sutty te permite alojar tu sitio en distintos lugares al mismo
|
||||||
|
tiempo. Esta estrategia facilita que el sitio esté disponible
|
||||||
|
aun cuando algunos de los alojamientos no funcionen.
|
||||||
|
|
||||||
design:
|
design:
|
||||||
title: 'Diseño'
|
title: 'Diseño'
|
||||||
actions: 'Información sobre este diseño'
|
actions: 'Información sobre este diseño'
|
||||||
|
@ -179,6 +207,8 @@ es:
|
||||||
licencia:
|
licencia:
|
||||||
title: 'Licencia del sitio y todo lo que se publique'
|
title: 'Licencia del sitio y todo lo que se publique'
|
||||||
url: 'Leer la licencia'
|
url: 'Leer la licencia'
|
||||||
|
deploys:
|
||||||
|
title: '¿Dónde querés alojar tu sitio?'
|
||||||
fetch:
|
fetch:
|
||||||
title: 'Actualizar el sitio'
|
title: 'Actualizar el sitio'
|
||||||
help:
|
help:
|
||||||
|
|
|
@ -35,13 +35,40 @@ class SitesControllerTest < ActionDispatch::IntegrationTest
|
||||||
site: {
|
site: {
|
||||||
name: name,
|
name: name,
|
||||||
design_id: create(:design).id,
|
design_id: create(:design).id,
|
||||||
licencia_id: create(:licencia).id
|
licencia_id: create(:licencia).id,
|
||||||
|
deploys_attributes: {
|
||||||
|
'0' => {
|
||||||
|
type: 'DeployLocal'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_nothing_raised do
|
|
||||||
site = Site.find_by_name(name)
|
site = Site.find_by_name(name)
|
||||||
|
|
||||||
|
assert site
|
||||||
|
assert_equal @usuarie.email, site.roles.first.usuarie.email
|
||||||
|
assert_equal 'usuarie', site.roles.first.rol
|
||||||
|
|
||||||
site.destroy
|
site.destroy
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test 'no se pueden crear con cualquier deploy' do
|
||||||
|
name = SecureRandom.hex
|
||||||
|
|
||||||
|
assert_raise ActiveRecord::SubclassNotFound do
|
||||||
|
post sites_url, headers: @authorization, params: {
|
||||||
|
site: {
|
||||||
|
name: name,
|
||||||
|
design_id: create(:design).id,
|
||||||
|
licencia_id: create(:licencia).id,
|
||||||
|
deploys_attributes: {
|
||||||
|
'0' => {
|
||||||
|
type: 'DeployNoExiste'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,5 +5,13 @@ FactoryBot.define do
|
||||||
name { "test-#{SecureRandom.hex}" }
|
name { "test-#{SecureRandom.hex}" }
|
||||||
design
|
design
|
||||||
licencia
|
licencia
|
||||||
|
|
||||||
|
after :build do |site|
|
||||||
|
site.deploys << build(:deploy_local, site: site)
|
||||||
|
end
|
||||||
|
|
||||||
|
after :create do |site|
|
||||||
|
site.deploys << create(:deploy_local, site: site)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue