mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-23 19:16:21 +00:00
Merge branch 'informative-deploys' into panel.sutty.nl
This commit is contained in:
commit
d0368e7d42
3 changed files with 90 additions and 45 deletions
|
@ -40,12 +40,16 @@ class DeployJob < ApplicationJob
|
||||||
}
|
}
|
||||||
|
|
||||||
# No es opcional
|
# No es opcional
|
||||||
unless @deployed[:deploy_local]
|
unless @deployed[:deploy_local][:status]
|
||||||
# Hacer fallar la tarea
|
# Hacer fallar la tarea
|
||||||
raise DeployException, deploy_local.build_stats.last.log
|
raise DeployException, "#{@site.name}: Falló la compilación"
|
||||||
end
|
end
|
||||||
|
|
||||||
deploy_others
|
deploy_others
|
||||||
|
rescue DeployTimedOutException => e
|
||||||
|
notify_exception e
|
||||||
|
rescue DeployException => e
|
||||||
|
notify_exception e, deploy_local
|
||||||
ensure
|
ensure
|
||||||
@site&.update status: 'waiting'
|
@site&.update status: 'waiting'
|
||||||
|
|
||||||
|
@ -56,6 +60,18 @@ class DeployJob < ApplicationJob
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# @param :exception [StandardError]
|
||||||
|
# @param :deploy [Deploy]
|
||||||
|
def notify_exception(exception, deploy = nil)
|
||||||
|
data = {
|
||||||
|
site: @site.id,
|
||||||
|
deploy: deploy&.type,
|
||||||
|
log: deploy&.build_stats&.last&.log
|
||||||
|
}
|
||||||
|
|
||||||
|
ExceptionNotifier.notify_exception(exception, data: data)
|
||||||
|
end
|
||||||
|
|
||||||
def deploy_local
|
def deploy_local
|
||||||
@deploy_local ||= @site.deploys.find_by(type: 'DeployLocal')
|
@deploy_local ||= @site.deploys.find_by(type: 'DeployLocal')
|
||||||
end
|
end
|
||||||
|
@ -66,14 +82,21 @@ class DeployJob < ApplicationJob
|
||||||
|
|
||||||
def deploy_others
|
def deploy_others
|
||||||
@site.deploys.where.not(type: 'DeployLocal').find_each do |d|
|
@site.deploys.where.not(type: 'DeployLocal').find_each do |d|
|
||||||
status = d.deploy(output: @output)
|
begin
|
||||||
build_stat = d.build_stats.last
|
status = d.deploy(output: @output)
|
||||||
|
seconds = d.build_stats.last.try(:seconds)
|
||||||
|
rescue StandardError => e
|
||||||
|
status = false
|
||||||
|
seconds = 0
|
||||||
|
|
||||||
|
notify_exception e, d
|
||||||
|
end
|
||||||
|
|
||||||
@deployed[d.type.underscore.to_sym] = {
|
@deployed[d.type.underscore.to_sym] = {
|
||||||
status: status,
|
status: status,
|
||||||
seconds: build_stat.try(:seconds) || 0,
|
seconds: seconds || 0,
|
||||||
size: d.size,
|
size: d.size,
|
||||||
urls: d.respond_to?(:urls) ? d.urls : [d.url]
|
urls: d.respond_to?(:urls) ? d.urls : [d.url].compact
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
# Notifica excepciones a una instancia de Gitlab, como incidencias
|
# Notifica excepciones a una instancia de Gitlab, como incidencias
|
||||||
# nuevas o como comentarios a las incidencias pre-existentes.
|
# nuevas o como comentarios a las incidencias pre-existentes.
|
||||||
class GitlabNotifierJob < ApplicationJob
|
class GitlabNotifierJob < ApplicationJob
|
||||||
|
class GitlabNotifierError < StandardError; end
|
||||||
|
|
||||||
include ExceptionNotifier::BacktraceCleaner
|
include ExceptionNotifier::BacktraceCleaner
|
||||||
|
|
||||||
# Variables que vamos a acceder luego
|
# Variables que vamos a acceder luego
|
||||||
|
@ -18,22 +20,28 @@ class GitlabNotifierJob < ApplicationJob
|
||||||
@issue_data = { count: 1 }
|
@issue_data = { count: 1 }
|
||||||
# Necesitamos saber si el issue ya existía
|
# Necesitamos saber si el issue ya existía
|
||||||
@cached = false
|
@cached = false
|
||||||
|
@issue = {}
|
||||||
|
|
||||||
# Traemos los datos desde la caché si existen, sino generamos un
|
# Traemos los datos desde la caché si existen, sino generamos un
|
||||||
# issue nuevo e inicializamos la caché
|
# issue nuevo e inicializamos la caché
|
||||||
@issue_data = Rails.cache.fetch(cache_key) do
|
@issue_data = Rails.cache.fetch(cache_key) do
|
||||||
issue = client.new_issue confidential: true, title: title, description: description, issue_type: 'incident'
|
@issue = client.new_issue confidential: true, title: title, description: description, issue_type: 'incident'
|
||||||
@cached = true
|
@cached = true
|
||||||
|
|
||||||
{
|
{
|
||||||
count: 1,
|
count: 1,
|
||||||
issue: issue['iid'],
|
issue: @issue['iid'],
|
||||||
user_agents: [user_agent].compact,
|
user_agents: [user_agent].compact,
|
||||||
params: [request&.filtered_parameters].compact,
|
params: [request&.filtered_parameters].compact,
|
||||||
urls: [url].compact
|
urls: [url].compact
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
unless @issue['iid']
|
||||||
|
Rails.cache.delete(cache_key)
|
||||||
|
raise GitlabNotifierError, @issue.dig('message', 'title')&.join(', ')
|
||||||
|
end
|
||||||
|
|
||||||
# No seguimos actualizando si acabamos de generar el issue
|
# No seguimos actualizando si acabamos de generar el issue
|
||||||
return if cached
|
return if cached
|
||||||
|
|
||||||
|
@ -104,6 +112,7 @@ class GitlabNotifierJob < ApplicationJob
|
||||||
# @return [String]
|
# @return [String]
|
||||||
def description
|
def description
|
||||||
@description ||= ''.dup.tap do |d|
|
@description ||= ''.dup.tap do |d|
|
||||||
|
d << log_section
|
||||||
d << request_section
|
d << request_section
|
||||||
d << javascript_section
|
d << javascript_section
|
||||||
d << javascript_footer
|
d << javascript_footer
|
||||||
|
@ -151,6 +160,19 @@ class GitlabNotifierJob < ApplicationJob
|
||||||
@client ||= GitlabApiClient.new
|
@client ||= GitlabApiClient.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [String]
|
||||||
|
def log_section
|
||||||
|
return '' unless options[:log]
|
||||||
|
|
||||||
|
<<~LOG
|
||||||
|
# Log
|
||||||
|
|
||||||
|
```
|
||||||
|
#{options[:log]}
|
||||||
|
```
|
||||||
|
LOG
|
||||||
|
end
|
||||||
|
|
||||||
# Muestra información de la petición
|
# Muestra información de la petición
|
||||||
#
|
#
|
||||||
# @return [String]
|
# @return [String]
|
||||||
|
|
|
@ -18,46 +18,46 @@ class DeployMailer < ApplicationMailer
|
||||||
subject = t('.subject', site: site.name)
|
subject = t('.subject', site: site.name)
|
||||||
hostname = site.hostname
|
hostname = site.hostname
|
||||||
|
|
||||||
@hi = t('.hi')
|
|
||||||
@explanation = t('.explanation', fqdn: hostname)
|
|
||||||
@help = t('.help')
|
|
||||||
|
|
||||||
@headers = %w[type status url seconds size].map do |header|
|
|
||||||
t(".th.#{header}")
|
|
||||||
end
|
|
||||||
|
|
||||||
@table = deploys.each_pair.map do |deploy, value|
|
|
||||||
{
|
|
||||||
title: t(".#{deploy}.title"),
|
|
||||||
status: t(".#{deploy}.#{value[:status] ? 'success' : 'error'}"),
|
|
||||||
urls: value[:urls],
|
|
||||||
seconds: {
|
|
||||||
human: distance_of_time_in_words(value[:seconds].seconds),
|
|
||||||
machine: "PT#{value[:seconds]}S"
|
|
||||||
},
|
|
||||||
size: number_to_human_size(value[:size], precision: 2)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
@terminal_table = Terminal::Table.new do |t|
|
|
||||||
t << @headers
|
|
||||||
t.add_separator
|
|
||||||
@table.each do |row|
|
|
||||||
row[:urls].each do |url|
|
|
||||||
t << (row.map do |k, v|
|
|
||||||
case k
|
|
||||||
when :seconds then v[:human]
|
|
||||||
when :urls then url
|
|
||||||
else v
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Informamos a cada quien en su idioma y damos una dirección de
|
# Informamos a cada quien en su idioma y damos una dirección de
|
||||||
# respuesta porque a veces les usuaries nos escriben
|
# respuesta porque a veces les usuaries nos escriben
|
||||||
I18n.with_locale(usuarie.lang) do
|
I18n.with_locale(usuarie.lang) do
|
||||||
|
@hi = t('.hi')
|
||||||
|
@explanation = t('.explanation', fqdn: hostname)
|
||||||
|
@help = t('.help')
|
||||||
|
|
||||||
|
@headers = %w[type status url seconds size].map do |header|
|
||||||
|
t(".th.#{header}")
|
||||||
|
end
|
||||||
|
|
||||||
|
@table = deploys.each_pair.map do |deploy, value|
|
||||||
|
{
|
||||||
|
title: t(".#{deploy}.title"),
|
||||||
|
status: t(".#{deploy}.#{value[:status] ? 'success' : 'error'}"),
|
||||||
|
urls: value[:urls],
|
||||||
|
seconds: {
|
||||||
|
human: distance_of_time_in_words(value[:seconds].seconds),
|
||||||
|
machine: "PT#{value[:seconds]}S"
|
||||||
|
},
|
||||||
|
size: number_to_human_size(value[:size], precision: 2)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
@terminal_table = Terminal::Table.new do |t|
|
||||||
|
t << @headers
|
||||||
|
t.add_separator
|
||||||
|
@table.each do |row|
|
||||||
|
row[:urls].each do |url|
|
||||||
|
t << (row.map do |k, v|
|
||||||
|
case k
|
||||||
|
when :seconds then v[:human]
|
||||||
|
when :urls then url
|
||||||
|
else v
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
mail(to: usuarie.email, reply_to: "sutty@#{Site.domain}", subject: subject)
|
mail(to: usuarie.email, reply_to: "sutty@#{Site.domain}", subject: subject)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue