Capistrano 3 / SSHKit escribe en un file en una tarea personalizada

Quiero marcar el directory desplegado actual con mi número de versión.

Intenté este enfoque:

Obtenga localmente la versión de la aplicación, guárdela en una variable y en el host remoto, guárdela en un file.

namespace :deploy do desc "Set a release number as the app version" task :mark_release do release_number = `git describe` on roles(:web) do execute("echo #{release_number} > #{current_path}/RELEASE") end end end 

El problema es cuando ejecuto esto a través de:

 cap deploy:mark_release 

el command se ve así:

 echo v9.3.0-254-g178d1f8; > /foo/bar/current/RELEASE 

El punto y coma está causando problemas. y mi file RELEASE está, por supuesto, vacío.

Creo que se debe a un escape hecho por SSHKit.

Alguna pista ?

Lo logré:

1) Tomé el número de versión del directory de repositorys en la máquina

2) ¡Lo escribí con una secuencia en un file a través de la carga! método

 namespace :deploy do desc "Set a release number as the app version" task :mark_release do on roles(:web) do within "/foo/bar/repo/" do upload! StringIO.new(capture(:git, "describe")), "#{current_path}/RELEASE" end end end end 

Aquí está la solución que se me ocurrió que no requiere cargar un file local. Va a la ruta de repository para ejecutar el command git para extraer la versión y luego networkingirige la salida al file. El file puede ser leído por la aplicación Rails. La ejecución requiere que los diferentes parameters pasen por separado. https://github.com/capistrano/sshkit#the-command-map tiene más información sobre el map de commands y por qué es necesario, debido al problema de escapes y espacios en blanco.

 namespace :deploy do before :restart, :add_revision_file task :add_revision_file do on roles(:app) do within repo_path do execute(:git, :'rev-parse', :'--short', :'HEAD', ">#{release_path}/REVISION") end end end end 

Use SSHKit::Command

 SSHKit::Command.new("echo #{release_number} > #{current_path}/RELEASE")