web-dev-qa-db-fra.com

/ usr/bin/env Ruby aucun fichier ou répertoire de ce type: Utilisation de capistrano 3, capistrano/rbenv, capistrano/bundler et capistrano/Rails (utilisation de Rails 4)

J'utilise capistrano, capistrano/rbenv, capistrano/bundler et capistrano/rails. J'obtiens cette erreur dans l'étape où capistrano compile les actifs:

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

Dans le serveur de production, /usr/bin/env Ruby -v est correct . Je suis conscient de ceci: pourquoi-fait-quelque-chose-travaille-dans-ma-ssh-session-mais-pas-dans-capistrano . Je ne peux pas le faire fonctionner.

C'est ma 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 }

C'est mon 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

Et voici mon 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{[email protected]}
#role :web, %w{[email protected]}
#role :db,  %w{[email protected]}

# 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'

Et voici la trace complète:

 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 <top (required)>'
/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 <top (required)>'
/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 <top (required)>'
/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

En passant, je pense que ce n'est pas lié à $PATH, parce que bundle install fonctionne très bien.

Est-ce que quelqu'un sait ce qui se passe?

Je vous remercie!

25
patriciomacadden

Ok, corrige ça.

J'ai ajouté ceci:

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

à mon deploy.rb.

Je ne suis pas sûr que ce soit la meilleure solution, mais cela a fonctionné.

19
patriciomacadden

D'accord, comme j'avais le même problème et qu'il m'a fallu un certain temps pour le résoudre:

Vous vous demandez probablement pourquoi cette commande ne fonctionne pas alors que IS fonctionne lorsque vous vous connectez à Shell avec ssh. 

Je ne suis pas un expert (corrigez-moi quand je me trompe): le problème est qu'il existe plusieurs différences de connexion sur un serveur distant utilisant ssh. Pour citer la documentation de capistrano:

C'est vraiment une question de quel type de Shell Capistrano utilise, c'est une matrice de possibilités concernant la connexion, la non-connexion, interactif ou non interactif.

Ils ont un graphique fantaisie ici (en bas) où ils illustrent le chemin des fichiers exécutés lors du processus de connexion. - la source donnée est également intéressante si vous souhaitez continuer à lire sur ce sujet.

Qu'est-ce qui ne va pas?

Lorsque VOUS vous connectez à l’aide de ssh, vous exécutez plusieurs fichiers (par exemple, en tant que .bash_profile lorsque vous utilisez bash). Généralement, votre variable $ PATH est étendue avec plusieurs chemins vers des fonctions importantes de votre environnement. MAIS différents "styles" de connexion incluent différents fichiers.

Comme le dit la documentation: 

Par défaut, Capistrano attribue toujours un identifiant non-login, non interactif Coquille.

Dans mon cas, cela a conduit à un cas où mon fichier de connexion .bash_profile n'est pas inclus MAIS il incluait les paramètres de ma rvm. Le résultat que la session de connexion capistrano ne connaissait pas mon chemin d'accès RVM.

Comment puis-je réparer cela?

Pour moi, il s’est avéré qu’il ne s’agissait que de la ligne {sans commentaire de la ligne nécessite 'capistrano/rvm' (car je me sers de RVM) dans la Capfile (située dans le répertoire racine). de votre projet Rails. 

J'espère aider quelqu'un.

MODIFIER:

Et pour sûr inclure gem 'capistrano-rvm' dans le Gemfile!

48
Langusten Gustel

Je pense que tu devrais exécuter 

apt-get install git-core

chez votre serveur

18
ethan

J'ai eu le même problème en utilisant Rbenv. Ce qui a résolu le problème pour moi, c’était d’inclure la bibliothèque rbenv avant bundler - et non après. L'ordre s'est avéré être important. Voici ce qu'il y a dans mon Capfile:

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

Si vous l'avez bien fait, vous devriez voir la commande bundle exécutée avec le préfixe rbenv, selon les lignes suivantes:

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

Solution à ERREUR:

/ usr/bin/env git pas de tel fichier ou répertoire capistrano

Installez git sur un serveur distant, la machine sur laquelle le déploiement doit être effectué.

apt-get install git
1
Dilshad PT

Assurez-vous que vous avez besoin de toutes ces pierres précieuses dans votre Capfile.

0
Kir

Après avoir fait de mon mieux pour résoudre le problème, je me suis rappelé que j'avais retiré quelques paquets au hasard de mon serveur, où je déployais le code.

Donc, j'ai aussi supprimé git accidentellement. Exécuter Sudo apt-get install git l'a corrigé.

0
Milind

Lorsque j'ai tapé bundle install de manière interactive sur un terminal, cela a fonctionné. Maintenant, quand je l’utilise avec Capistrano, ça ne marche pas.

Je l'ai résolu de cette façon:

Dans Ubuntu, votre ~/.bashrc contient un bloc de code qui dit:

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

Lorsque vous exécutez Capistrano, il utilisera votre ~/.bashrcmais ce ne sera pas le cas exécuter une commande sous ce bloc de code.

J'ai donc corrigé le problème de déplacement des lignes de code requises par bundle installci-dessus ce bloc de code afin que Capistrano puisse les charger.

Vous pourriez avoir une idée des lignes à déplacer en exécutant which bundle.

0
Is Ma