mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-24 06:26:22 +00:00
Merge branch 'gethen.sutty.nl' of 0xacab.org:sutty/sutty into 17.3.alpine.panel.sutty.nl
This commit is contained in:
commit
5615126829
10 changed files with 109 additions and 87 deletions
1
Gemfile
1
Gemfile
|
@ -44,7 +44,6 @@ gem 'devise'
|
||||||
gem 'devise-i18n'
|
gem 'devise-i18n'
|
||||||
gem 'devise_invitable'
|
gem 'devise_invitable'
|
||||||
gem 'distributed-press-api-client', '~> 0.3.0rc0'
|
gem 'distributed-press-api-client', '~> 0.3.0rc0'
|
||||||
gem 'njalla-api-client', '~> 0.2.0'
|
|
||||||
gem 'email_address', git: 'https://github.com/fauno/email_address', branch: 'i18n'
|
gem 'email_address', git: 'https://github.com/fauno/email_address', branch: 'i18n'
|
||||||
gem 'exception_notification'
|
gem 'exception_notification'
|
||||||
gem 'fast_blank'
|
gem 'fast_blank'
|
||||||
|
|
|
@ -359,9 +359,6 @@ GEM
|
||||||
net-ssh (7.1.0)
|
net-ssh (7.1.0)
|
||||||
netaddr (2.0.6)
|
netaddr (2.0.6)
|
||||||
nio4r (2.5.9-x86_64-linux-musl)
|
nio4r (2.5.9-x86_64-linux-musl)
|
||||||
njalla-api-client (0.2.0)
|
|
||||||
dry-schema
|
|
||||||
httparty (~> 0.18)
|
|
||||||
nokogiri (1.15.4-x86_64-linux-musl)
|
nokogiri (1.15.4-x86_64-linux-musl)
|
||||||
mini_portile2 (~> 2.8.2)
|
mini_portile2 (~> 2.8.2)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
|
@ -623,7 +620,6 @@ DEPENDENCIES
|
||||||
mini_magick
|
mini_magick
|
||||||
mobility
|
mobility
|
||||||
net-ssh
|
net-ssh
|
||||||
njalla-api-client (~> 0.2.0)
|
|
||||||
nokogiri
|
nokogiri
|
||||||
pg
|
pg
|
||||||
pg_search
|
pg_search
|
||||||
|
|
|
@ -56,6 +56,10 @@ class DeployJob < ApplicationJob
|
||||||
rescue URI::Error
|
rescue URI::Error
|
||||||
nil
|
nil
|
||||||
end.compact
|
end.compact
|
||||||
|
|
||||||
|
if d == @site.deployment_list.last && !status
|
||||||
|
raise DeployException, 'Falló la compilación'
|
||||||
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
status = false
|
status = false
|
||||||
seconds ||= 0
|
seconds ||= 0
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
# Permite traer los cambios desde webhooks
|
# Permite traer los cambios desde el repositorio remoto
|
||||||
|
|
||||||
class GitPullJob < ApplicationJob
|
class GitPullJob < ApplicationJob
|
||||||
# @param :site [Site]
|
# @param :site [Site]
|
||||||
# @param :usuarie [Usuarie]
|
# @param :usuarie [Usuarie]
|
||||||
|
@ -9,9 +8,20 @@ class GitPullJob < ApplicationJob
|
||||||
# @return [nil]
|
# @return [nil]
|
||||||
def perform(site, usuarie, message)
|
def perform(site, usuarie, message)
|
||||||
return unless site.repository.origin
|
return unless site.repository.origin
|
||||||
return unless site.repository.fetch.positive?
|
|
||||||
|
|
||||||
site.repository.merge(usuarie, message)
|
site.repository.fetch
|
||||||
|
|
||||||
|
return if site.repository.up_to_date?
|
||||||
|
|
||||||
|
if site.repository.fast_forward?
|
||||||
|
site.repository.fast_forward!
|
||||||
|
else
|
||||||
|
site.repository.merge(usuarie, message)
|
||||||
|
end
|
||||||
|
|
||||||
|
site.repository.git_lfs_checkout
|
||||||
site.reindex_changes!
|
site.reindex_changes!
|
||||||
|
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'distributed_press/v1/client/site'
|
require 'distributed_press/v1/client/site'
|
||||||
require 'njalla/v1'
|
|
||||||
|
|
||||||
# Soportar Distributed Press APIv1
|
# Soportar Distributed Press APIv1
|
||||||
#
|
#
|
||||||
|
@ -13,10 +12,10 @@ require 'njalla/v1'
|
||||||
# Al ser publicado, envía los archivos en un tarball y actualiza la
|
# Al ser publicado, envía los archivos en un tarball y actualiza la
|
||||||
# información.
|
# información.
|
||||||
class DeployDistributedPress < Deploy
|
class DeployDistributedPress < Deploy
|
||||||
store :values, accessors: %i[hostname remote_site_id remote_info], coder: JSON
|
store :values, accessors: %i[hostname remote_site_id remote_info distributed_press_publisher_id], coder: JSON
|
||||||
|
|
||||||
before_create :create_remote_site!, :create_njalla_records!
|
before_create :create_remote_site!
|
||||||
before_destroy :delete_remote_site!, :delete_njalla_records!
|
before_destroy :delete_remote_site!
|
||||||
|
|
||||||
DEPENDENCIES = %i[deploy_local]
|
DEPENDENCIES = %i[deploy_local]
|
||||||
|
|
||||||
|
@ -31,17 +30,12 @@ class DeployDistributedPress < Deploy
|
||||||
time_start
|
time_start
|
||||||
|
|
||||||
create_remote_site! if remote_site_id.blank?
|
create_remote_site! if remote_site_id.blank?
|
||||||
create_njalla_records!
|
|
||||||
save
|
save
|
||||||
|
|
||||||
if remote_site_id.blank?
|
if remote_site_id.blank?
|
||||||
raise DeployJob::DeployException, 'El sitio no se creó en Distributed Press'
|
raise DeployJob::DeployException, 'El sitio no se creó en Distributed Press'
|
||||||
end
|
end
|
||||||
|
|
||||||
if create_njalla_records? && remote_info[:njalla].blank?
|
|
||||||
raise DeployJob::DeployException, 'No se pudieron crear los registros necesarios en Njalla'
|
|
||||||
end
|
|
||||||
|
|
||||||
site_client.tap do |c|
|
site_client.tap do |c|
|
||||||
stdout = Thread.new(publisher.logger_out) do |io|
|
stdout = Thread.new(publisher.logger_out) do |io|
|
||||||
until io.eof?
|
until io.eof?
|
||||||
|
@ -101,12 +95,14 @@ class DeployDistributedPress < Deploy
|
||||||
|
|
||||||
# El cliente de la API
|
# El cliente de la API
|
||||||
#
|
#
|
||||||
# TODO: cuando soportemos más, tiene que haber una relación entre
|
|
||||||
# DeployDistributedPress y DistributedPressPublisher.
|
|
||||||
#
|
|
||||||
# @return [DistributedPressPublisher]
|
# @return [DistributedPressPublisher]
|
||||||
def publisher
|
def publisher
|
||||||
@publisher ||= DistributedPressPublisher.last
|
@publisher ||=
|
||||||
|
if distributed_press_publisher_id
|
||||||
|
DistributedPressPublisher.find(distributed_press_publisher_id)
|
||||||
|
else
|
||||||
|
DistributedPressPublisher.find_by_default(true)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# El cliente para actualizar el sitio
|
# El cliente para actualizar el sitio
|
||||||
|
@ -147,29 +143,6 @@ class DeployDistributedPress < Deploy
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
# Crea los registros en Njalla
|
|
||||||
#
|
|
||||||
# XXX: Esto depende de nuestro DNS actual, cuando lo migremos hay
|
|
||||||
# que eliminarlo.
|
|
||||||
#
|
|
||||||
# @return [nil]
|
|
||||||
def create_njalla_records!
|
|
||||||
return unless create_njalla_records?
|
|
||||||
|
|
||||||
self.remote_info ||= {}
|
|
||||||
self.remote_info[:njalla] ||= {}
|
|
||||||
self.remote_info[:njalla][:a] ||= njalla.add_record(name: site.name, type: 'CNAME', content: "#{Site.domain}.").to_h
|
|
||||||
self.remote_info[:njalla][:cname] ||= njalla.add_record(name: "www.#{site.name}", type: 'CNAME', content: "#{Site.domain}.").to_h
|
|
||||||
self.remote_info[:njalla][:ns] ||= njalla.add_record(name: "_dnslink.#{site.name}", type: 'NS', content: "#{publisher.hostname}.").to_h
|
|
||||||
|
|
||||||
nil
|
|
||||||
rescue HTTParty::Error => e
|
|
||||||
ExceptionNotifier.notify_exception(e, data: { site: site.name })
|
|
||||||
self.remote_info.delete :njalla
|
|
||||||
ensure
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
# Registra lo que sucedió
|
# Registra lo que sucedió
|
||||||
#
|
#
|
||||||
# @param status [Bool]
|
# @param status [Bool]
|
||||||
|
@ -187,31 +160,4 @@ class DeployDistributedPress < Deploy
|
||||||
ExceptionNotifier.notify_exception(e, data: { site: site.name })
|
ExceptionNotifier.notify_exception(e, data: { site: site.name })
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_njalla_records!
|
|
||||||
return unless create_njalla_records?
|
|
||||||
|
|
||||||
%w[a ns cname].each do |type|
|
|
||||||
next if (id = remote_info.dig('njalla', type, 'id')).blank?
|
|
||||||
|
|
||||||
njalla.remove_record(id: id.to_i)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Actualizar registros en Njalla
|
|
||||||
#
|
|
||||||
# @return [Njalla::V1::Domain]
|
|
||||||
def njalla
|
|
||||||
@njalla ||=
|
|
||||||
begin
|
|
||||||
client = Njalla::V1::Client.new(token: Rails.application.credentials.njalla)
|
|
||||||
|
|
||||||
Njalla::V1::Domain.new(domain: Site.domain, client: client)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Detecta si tenemos que crear registros en Njalla
|
|
||||||
def create_njalla_records?
|
|
||||||
!site.name.end_with?('.')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,8 +13,8 @@ class DistributedPressPublisher < ApplicationRecord
|
||||||
# @return [IO]
|
# @return [IO]
|
||||||
attr_reader :logger_out
|
attr_reader :logger_out
|
||||||
|
|
||||||
# La instancia es única
|
# La instancia es necesaria pero no única
|
||||||
validates_uniqueness_of :instance
|
validates_presence_of :instance
|
||||||
|
|
||||||
# El token es necesario
|
# El token es necesario
|
||||||
validates_presence_of :token
|
validates_presence_of :token
|
||||||
|
|
|
@ -429,8 +429,8 @@ class Site < ApplicationRecord
|
||||||
config.theme = design.gem unless design.no_theme?
|
config.theme = design.gem unless design.no_theme?
|
||||||
config.description = description
|
config.description = description
|
||||||
config.title = title
|
config.title = title
|
||||||
config.url = url(slash: false)
|
config.url ||= url(slash: false)
|
||||||
config.hostname = hostname
|
config.hostname ||= hostname
|
||||||
config.locales = locales.map(&:to_s)
|
config.locales = locales.map(&:to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -75,13 +75,18 @@ class Site
|
||||||
# Forzamos el checkout para mover el HEAD al último commit y
|
# Forzamos el checkout para mover el HEAD al último commit y
|
||||||
# escribir los cambios
|
# escribir los cambios
|
||||||
rugged.checkout 'HEAD', strategy: :force
|
rugged.checkout 'HEAD', strategy: :force
|
||||||
|
|
||||||
git_sh("git", "lfs", "fetch", "origin", default_branch)
|
|
||||||
# reemplaza los pointers por los archivos correspondientes
|
|
||||||
git_sh("git", "lfs", "checkout")
|
|
||||||
commit
|
commit
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Trae todos los archivos desde LFS
|
||||||
|
#
|
||||||
|
# @return [Boolean]
|
||||||
|
def git_lfs_checkout
|
||||||
|
git_sh('git', 'lfs', 'fetch', 'origin', default_branch)
|
||||||
|
git_sh('git', 'lfs', 'checkout')
|
||||||
|
end
|
||||||
|
|
||||||
# El último commit
|
# El último commit
|
||||||
#
|
#
|
||||||
# @return [Rugged::Commit]
|
# @return [Rugged::Commit]
|
||||||
|
@ -111,10 +116,30 @@ class Site
|
||||||
walker.each.to_a
|
walker.each.to_a
|
||||||
end
|
end
|
||||||
|
|
||||||
# Hay commits sin aplicar?
|
# Detecta si hay que hacer un pull o no
|
||||||
def needs_pull?
|
#
|
||||||
fetch
|
# @return [Boolean]
|
||||||
!commits.empty?
|
def up_to_date?
|
||||||
|
rugged.merge_analysis(remote_head_commit).include?(:up_to_date)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Detecta si es posible adelantar la historia local a la remota o
|
||||||
|
# necesitamos un merge
|
||||||
|
#
|
||||||
|
# @return [Boolean]
|
||||||
|
def fast_forward?
|
||||||
|
rugged.merge_analysis(remote_head_commit).include?(:fastforward)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Mueve la historia local a la remota
|
||||||
|
#
|
||||||
|
# @see {https://stackoverflow.com/a/27077322}
|
||||||
|
# @return [nil]
|
||||||
|
def fast_forward!
|
||||||
|
rugged.checkout_tree(remote_head_commit)
|
||||||
|
rugged.references.update(rugged.head.resolve, remote_head_commit.oid)
|
||||||
|
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
# Guarda los cambios en git
|
# Guarda los cambios en git
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Una instancia es la instancia por defecto
|
||||||
|
class AddDefaultToDistributedPressPublisher < ActiveRecord::Migration[6.1]
|
||||||
|
def up
|
||||||
|
add_column :distributed_press_publishers, :default, :boolean, default: false
|
||||||
|
|
||||||
|
DistributedPressPublisher.last.update(default: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_column :distributed_press_publishers, :default
|
||||||
|
end
|
||||||
|
end
|
|
@ -16,6 +16,20 @@ SET row_security = off;
|
||||||
-- *not* creating schema, since initdb creates it
|
-- *not* creating schema, since initdb creates it
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: dblink; Type: EXTENSION; Schema: -; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS dblink WITH SCHEMA public;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: EXTENSION dblink; Type: COMMENT; Schema: -; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
COMMENT ON EXTENSION dblink IS 'connect to other PostgreSQL databases from within a database';
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: pg_trgm; Type: EXTENSION; Schema: -; Owner: -
|
-- Name: pg_trgm; Type: EXTENSION; Schema: -; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -1149,7 +1163,8 @@ CREATE TABLE public.roles (
|
||||||
site_id integer,
|
site_id integer,
|
||||||
usuarie_id integer,
|
usuarie_id integer,
|
||||||
rol character varying,
|
rol character varying,
|
||||||
temporal boolean
|
temporal boolean,
|
||||||
|
token character varying
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1236,7 +1251,9 @@ CREATE TABLE public.sites (
|
||||||
tienda_url character varying DEFAULT ''::character varying,
|
tienda_url character varying DEFAULT ''::character varying,
|
||||||
api_key_ciphertext character varying,
|
api_key_ciphertext character varying,
|
||||||
slugify_mode character varying DEFAULT 'default'::character varying,
|
slugify_mode character varying DEFAULT 'default'::character varying,
|
||||||
pagination boolean DEFAULT false
|
pagination boolean DEFAULT false,
|
||||||
|
private_key_pem_ciphertext text,
|
||||||
|
last_indexed_commit character varying
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -2234,6 +2251,13 @@ ALTER TABLE ONLY public.active_storage_attachments
|
||||||
ADD CONSTRAINT fk_rails_c3b3935057 FOREIGN KEY (blob_id) REFERENCES public.active_storage_blobs(id);
|
ADD CONSTRAINT fk_rails_c3b3935057 FOREIGN KEY (blob_id) REFERENCES public.active_storage_blobs(id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: publisher; Type: PUBLICATION; Schema: -; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE PUBLICATION publisher FOR ALL TABLES WITH (publish = 'insert, update, delete, truncate');
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- PostgreSQL database dump complete
|
-- PostgreSQL database dump complete
|
||||||
--
|
--
|
||||||
|
@ -2318,6 +2342,10 @@ INSERT INTO "schema_migrations" (version) VALUES
|
||||||
('20230421182627'),
|
('20230421182627'),
|
||||||
('20230424174544'),
|
('20230424174544'),
|
||||||
('20230519143500'),
|
('20230519143500'),
|
||||||
('20230524190240');
|
('20230524190240'),
|
||||||
|
('20230731195050'),
|
||||||
|
('20230829204127'),
|
||||||
|
('20230921155401'),
|
||||||
|
('20230927153926');
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue