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!
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é.
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!
Je pense que tu devrais exécuter
apt-get install git-core
chez votre serveur
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 ...
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
Assurez-vous que vous avez besoin de toutes ces pierres précieuses dans votre Capfile.
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é.
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 ~/.bashrc
mais 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 install
ci-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
.