/ / ¿Cómo estructuro una tarea personalizada y cómo obtengo resultados bonitos? - capistrano, capistrano3

¿Cómo estructuro una tarea personalizada y cómo obtengo resultados bonitos? - capistrano, capistrano3

Estoy escribiendo una tarea personalizada en Capistrano 3 (lib / capistrano / tasks / revision) que está obteniendo la revisión de una aplicación en ejecución mediante curl.

Luego compara la versión en ejecución con la última implementada y las compara, si no son las mismas, se debe lanzar un error.

Llegué al punto de que la revisión de la aplicación en ejecución se recupera y se compara con una cadena vacía para lanzar un error.

El problema que tengo es que el resultado de esta tarea no es bonito, es solo un texto en blanco.

¿Qué me estoy perdiendo? He estado cavando en la documentación todo el día.

¡Saludos!

revision.rake:

namespace :revision do
desc "Check revision of all applications to determine if the application is running the latest deployed revison"
task :check do
puts "Checking revision of all supported applications"

invoke "revision:httpapi"
end

task :httpapi do
on roles(:httpapi), in: :sequence do |host|
puts "Checking revision of httpapi on #{host}"
begin
response = capture "curl -L "http://#{fetch(:diagnostics_username)}:#{fetch(:diagnostics_password)}@#{host}/diagnostics/status?mode=extended&output=detailed""
object = JSON.parse(response, object_class: OpenStruct)

unless object.result.revision == "" #For test, just compare to empty string so error is thrown
raise "The running revision is not the same as the installed, please restart all applications"
end
rescue Exception => e
raise e.message
end
end
end
end

Salida:

gonace@ubuntu ~/Development/tulo-deployment (master) $ cap test revision:check
Enter a branch or tag name to deploy (defaults to develop)
Please enter branch (develop):
Deploying branch/tag: develop
rvm 1.28.0 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]
rvm 1.28.0 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]
ruby-1.9.3-p545
ruby-1.9.3-p545
ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-linux]
ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-linux]
Checking revision of all supported applications
Checking revision of httpapi on 10.30.1.1
(Backtrace restricted to imported tasks)
cap aborted!
The running revision is not the same as the installed, please restart all applications
/home/gonace/Development/tulo-deployment/lib/capistrano/tasks/revision.rake:20:in `rescue in block (3 levels) in <top (required)>"
/home/gonace/Development/tulo-deployment/lib/capistrano/tasks/revision.rake:12:in `block (3 levels) in <top (required)>"
/home/gonace/Development/tulo-deployment/lib/capistrano/tasks/revision.rake:10:in `block (2 levels) in <top (required)>"
/home/gonace/Development/tulo-deployment/lib/capistrano/tasks/revision.rake:6:in `block (2 levels) in <top (required)>"
The running revision is not the same as the installed, please restart all applications
/home/gonace/Development/tulo-deployment/lib/capistrano/tasks/revision.rake:17:in `block (3 levels) in <top (required)>"
/home/gonace/Development/tulo-deployment/lib/capistrano/tasks/revision.rake:10:in `block (2 levels) in <top (required)>"
/home/gonace/Development/tulo-deployment/lib/capistrano/tasks/revision.rake:6:in `block (2 levels) in <top (required)>"
Tasks: TOP => revision:httpapi
(See full trace by running task with --trace)

Respuestas

1 para la respuesta № 1

Un buen ejemplo de un problema similar que se resuelve en el núcleo es aquí: https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/deploy.rake#L91

En ese sentido, probablemente querrás codificar algo como esto:

task :httpapi do
on roles(:httpapi), in: :sequence do |host|
puts "Checking revision of httpapi on #{host}"
response = capture "curl -L "http://#{fetch(:diagnostics_username)}:#{fetch(:diagnostics_password)}@#{host}/diagnostics/status?mode=extended&output=detailed""
object = JSON.parse(response, object_class: OpenStruct)

unless object.result.revision == "" #For test, just compare to empty string so error is thrown
error "The running revision is not the same as the installed, please restart all applications"
exit 1
end
end
end

Editar:

Para generar el texto coloreado, puede utilizar:

Airbrussh::Colors.green("Your message")

De: https://github.com/mattbrictson/airbrussh/blob/master/lib/airbrussh/colors.rb