/ usr / bin / env ruby ​​no existe tal archivo o directorio: usando capistrano 3, capistrano / rbenv, capistrano / bundler y capistrano / Rails (usando los Rails 4)

Estoy usando capistrano, capistrano / rbenv, capistrano / bundler y capistrano / Rails. Me sale este error en el paso donde Capistrano comstack los activos:

DEBUG [49a50df6] /usr/bin/env: DEBUG [49a50df6] ruby DEBUG [49a50df6] : No such file or directory DEBUG [49a50df6] 

En el servidor de producción /usr/bin/env ruby -v es correcto. Soy consciente de esto: por qué-hace-algo-trabaja-en-mi-ssh-sesión-pero-no-en-capistrano Pero no puedo hacer que funcione.

Este es mi Capfile :

 # Load DSL and Setup Up Stages require 'capistrano/setup' # Includes default deployment tasks require 'capistrano/deploy' # Includes tasks from other gems included in your Gemfile # # For documentation on these, see for example: # # https://github.com/capistrano/rvm # https://github.com/capistrano/rbenv # https://github.com/capistrano/chruby # https://github.com/capistrano/bundler # https://github.com/capistrano/rails/tree/master/assets # https://github.com/capistrano/rails/tree/master/migrations # # require 'capistrano/rvm' require 'capistrano/rbenv' # require 'capistrano/chruby' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' # Loads custom tasks from `lib/capistrano/tasks' if you have any defined. Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r } 

Este es mi deploy.rb :

 # rbenv set :rbenv_type, :user set :rbenv_ruby, '2.0.0-p247' # bundler set :bundle_gemfile, -> { release_path.join('Gemfile') } set :bundle_dir, -> { shared_path.join('bundle') } set :bundle_flags, '--deployment --quiet' set :bundle_without, %w{development test}.join(' ') set :bundle_binstubs, -> { shared_path.join('bin') } set :bundle_roles, :all # rails set :rails_env, 'production' set :application, 'MY APP' set :repo_url, 'MY_REPO.git' # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp } # set :deploy_to, '/var/www/my_app' # set :scm, :git # set :format, :pretty # set :log_level, :debug # set :pty, true set :linked_files, %w{.env config/database.yml} # set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system} # set :default_env, { path: "/opt/ruby/bin:$PATH" } set :keep_releases, 5 namespace :deploy do desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do # Your restart mechanism here, for example: # execute :touch, release_path.join('tmp/restart.txt') end end after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do # Here we can do anything such as: # within release_path do # execute :rake, 'cache:clear' # end end end after :finishing, 'deploy:cleanup' end 

Y esta es mi staging.rb .

 set :stage, :staging # Simple Role Syntax # ================== # Supports bulk-adding hosts to roles, the primary # server in each group is considered to be the first # unless any hosts have the primary property set. #role :app, %w{deploy@example.com} #role :web, %w{deploy@example.com} #role :db, %w{deploy@example.com} # Extended Server Syntax # ====================== # This can be used to drop a more detailed server # definition into the server list. The second argument # something that quacks like a has can be used to set # extended properties on the server. #server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value server 'my_server', user: 'my_user', roles: %w{web app db} # you can set custom ssh options # it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options # you can see them in [net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start) # set it globally # set :ssh_options, { # keys: %w(/home/rlisowski/.ssh/id_rsa), # forward_agent: false, # auth_methods: %w(password) # } # and/or per server # server 'example.com', # user: 'user_name', # roles: %w{web app}, # ssh_options: { # user: 'user_name', # overrides user setting above # keys: %w(/home/user_name/.ssh/id_rsa), # forward_agent: false, # auth_methods: %w(publickey password) # # password: 'please use keys' # } # setting per server overrides global ssh_options # fetch(:default_env).merge!(rails_env: :staging) set :deploy_to, '/home/my_user' 

Y esta es la huella completa:

  INFO [c24b8f94] Running RBENV_ROOT=~/.rbenv RBENV_VERSION=2.0.0-p247 ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile on 162.243.16.201 DEBUG [c24b8f94] Command: cd /home/my_app/releases/20131101193513 && ( RAILS_ENV=production RBENV_ROOT=~/.rbenv RBENV_VERSION=2.0.0-p247 ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile ) DEBUG [c24b8f94] /usr/bin/env: DEBUG [c24b8f94] ruby DEBUG [c24b8f94] : No such file or directory DEBUG [c24b8f94] cap aborted! rake stdout: Nothing written rake stderr: Nothing written /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/command.rb:94:in `exit_status=' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:125:in `block (4 levels) in _execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:551:in `call' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:551:in `do_request' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:561:in `channel_request' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:465:in `dispatch_incoming_packets' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:221:in `preprocess' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:205:in `process' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `block in loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:269:in `wait' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:147:in `block (2 levels) in _execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:514:in `call' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/channel.rb:514:in `do_open_confirmation' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:545:in `channel_open_confirmation' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:465:in `dispatch_incoming_packets' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:221:in `preprocess' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:205:in `process' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `block in loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/connection/session.rb:169:in `loop' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:149:in `block in _execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:106:in `tap' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:106:in `_execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:54:in `execute' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/capistrano-rails-1.0.0/lib/capistrano/tasks/assets.rake:61:in `block (6 levels) in ' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/abstract.rb:89:in `with' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/capistrano-rails-1.0.0/lib/capistrano/tasks/assets.rake:60:in `block (5 levels) in ' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/abstract.rb:81:in `within' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/capistrano-rails-1.0.0/lib/capistrano/tasks/assets.rake:59:in `block (4 levels) in ' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:42:in `instance_exec' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb:42:in `run' /Users/patricio/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sshkit-1.1.0/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute' Tasks: TOP => deploy:assets:precompile 

Por cierto, creo que no está relacionado con $PATH , porque la bundle install funciona bien.

¿Alguien sabe lo que está pasando?

¡Gracias!

Bueno, ya que tuve el mismo problema y me tomó bastante tiempo resolverlo:

Probablemente se esté preguntando por qué este comando no funciona mientras está funcionando cuando inicia sesión con su shell usando ssh.

No soy un experto (corríjame cuando me equivoque): el problema es que hay varias diferencias en el inicio de sesión en un servidor remoto usando ssh. Para citar la documentación de capistrano:

Realmente es una cuestión de qué tipo de shell está usando Capistrano, es una matriz de posibilidades con respecto al inicio de sesión, no inicio de sesión, interactivo o no interactivo.

Tienen un gráfico elegante aquí (en la parte inferior) donde ilustran la ruta de los archivos que se ejecutan en el proceso de inicio de sesión. – la fuente dada también es interesante si desea continuar leyendo sobre este tema.

¿Qué va mal?

Cuando USTED inicia sesión con ssh, está (al iniciar sesión) ejecutando varios archivos (por ejemplo, .bash_profile cuando usa bash). Comúnmente, su variable $ PATH se extiende con varias rutas a funciones importantes en su entorno. PERO diferentes “estilos” de inicio de sesión incluyen diferentes archivos.

Como reza la documentación:

De forma predeterminada, Capistrano siempre asigna un shell no interactivo y sin inicio de sesión.

En mi caso, esto condujo a un caso en el que mi archivo de inicio de sesión .bash_profile no está incluido, PERO incluyó la configuración de mi rvm. El resultado de que la sesión de inicio de sesión de capistrano no sabía acerca de mi ruta rvm.

¿Cómo puedo arreglar esto?

Para mí, resultó ser simplemente el comentario de la línea requerida ‘capistrano / rvm’ (como estoy usando RVM) en el archivo de Cap (ubicado en la raíz de su proyecto de Rails).

Espero poder ayudar a alguien.

EDITAR:

¡Y seguro que incluye la gem 'capistrano-rvm' en el Gemfile!

Ok, lo arreglaste.

Agregué esto:

 set :default_env, { path: "~/.rbenv/shims:~/.rbenv/bin:$PATH" } 

a mi deploy.rb .

No estoy seguro de que sea la mejor solución, pero funcionó.

Creo que deberias ejecutar

 apt-get install git-core 

en su servidor

Tuve el mismo problema usando rbenv. Lo que lo resolvió para mí fue incluir la biblioteca rbenv antes del agrupador, no después. El orden resultó ser importante. Esto es lo que hay en mi Capfile:

 require 'capistrano/rbenv' require 'capistrano/bundler' 

Si lo hizo bien, debería ver el comando de paquete ejecutado con el prefijo rbenv, en estas líneas:

 XX RBENV_ROOT=$HOME/.rbenv RBENV_VERSION=2.3.0 $HOME/.rbenv/bin/rbenv exec bundle install ... 

Solución a ERROR:

/ usr / bin / env git no existe tal archivo o directorio capistrano

Instale git en el servidor remoto, la máquina en la que se realizará la implementación.

 apt-get install git 

Asegúrate de que requieres todas estas gems en tu Capfile.

Cuando escribí bundle install interactivamente en una Terminal, funcionó. Ahora, cuando lo uso a través de Capistrano, no funciona.

Lo resolví de esta manera:

En Ubuntu, hay un bloque de código en tu ~/.bashrc que dice:

 # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac 

Cuando ejecute Capistrano, realmente utilizará su ~/.bashrc pero no ejecutará ningún comando debajo de ese bloque de código.

Por lo tanto, solucioné el problema al mover las líneas de código requeridas por la bundle install sobre ese bloque de código, para que Capistrano pudiera cargarlas.

Podrías obtener una pista de qué líneas mover al ejecutar which bundle .