El script de shell de deployment de capistrano falla cuando se ejecuta a través de github webhook

Estoy tratando de implementar una rutina de implementación continua usando github webhooks y capistrano.

Mi plan es poner mi tarea de capistrano rake en un script de shell y llamarlo desde una acción de controller en otro proyecto de rails que es el github webhook.

Aquí está el script de shell (wallet_deploy.sh)

#!/bin/bash cd $HOME/work/wallet bundle exec cap production deploy > wallet_deploy_log 2>&1 

Aquí está el logging

 /home/deploy/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/bundler-1.11.2/lib/bundler/rubygems_integration.rb:304:in `block in replace_gem': capistrano is not part of the bundle. Add it to Gemfile. (Gem::LoadError) from /home/deploy/.rbenv/versions/2.2.4/bin/cap:22:in `<main>' 

Aquí está la acción del controller

 def release_request system("./wallet_deploy.sh") #DeployWorker.perform_async // tried using a worker too with no success render :text => params.to_s end 

La implementación de límites funciona perfectamente cuando la ejecuto manualmente en el shell

 deploy@ubuntu14-public:~/apps/ci/current$ ./wallet_deploy.sh 

¿No estoy seguro de lo que estoy haciendo mal y hay un enfoque diferente para implementar esto?

La aplicación Rails que está escuchando para el webhook ya tiene su propio entorno de Bundler. Cuando intenta pagar el script mediante el system , el script henetworkinga ese entorno actual de Bundler. Esta es probablemente la razón por la que está obteniendo un error de "capistrano no es parte del package".

Para asegurarse de que se utiliza un nuevo entorno de Bundler para su script, intente esto:

 Bundler.with_clean_env do system("./wallet_deploy.sh") end 

De la documentation del bundle exec :

Cualquier código de Ruby que abra una subshell (como sistema, backticks o% x {}) usará automáticamente el entorno actual de Bundler. Si necesita pagar un command de Ruby que no es parte de su package actual, use el método with_clean_env con un bloque.

Y:

El uso de with_clean_env también es necesario si está desembolsando un package diferente. Cualquier command de Bundler ejecutado en una subshell henetworkingará el Gemfile actual, por lo que los commands que necesitan ejecutarse en el context de un package diferente también deben usar with_clean_env.