Ответ 1
Хорошо, исправил его.
Я добавил следующее:
set :default_env, { path: "~/.rbenv/shims:~/.rbenv/bin:$PATH" }
на мой deploy.rb
.
Я не уверен, что это лучшее решение, но оно сработало.
Я использую capistrano, capistrano/rbenv, capistrano/bundler и capistrano/rails. Я получаю эту ошибку на этапе, когда capistrano компилирует активы:
DEBUG [49a50df6] /usr/bin/env:
DEBUG [49a50df6] ruby
DEBUG [49a50df6] : No such file or directory
DEBUG [49a50df6]
В производственном сервере /usr/bin/env ruby -v
является правильным. Я знаю об этом: почему-то-то-работает-в-моем-ssh-сеанс-но-не-в-капистрано Но я не могу заставить его работать.
Это мой 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 }
Это мой 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
И это моя 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 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'
И это полный след:
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
Между прочим, я думаю, что это не связано с $PATH
, потому что bundle install
работает просто отлично.
Кто-нибудь знает, что происходит?
Спасибо!
Хорошо, исправил его.
Я добавил следующее:
set :default_env, { path: "~/.rbenv/shims:~/.rbenv/bin:$PATH" }
на мой deploy.rb
.
Я не уверен, что это лучшее решение, но оно сработало.
Хорошо, поскольку у меня была такая же проблема, и мне потребовалось довольно много времени, чтобы решить эту проблему:
Возможно, вам интересно, почему эта команда не работает, пока она работает, когда вы входите в систему с помощью оболочки ssh.
Я не эксперт (так исправьте меня, когда я ошибаюсь): Дело в том, что существует несколько различий при входе на удаленный сервер с использованием ssh. Процитировать документацию capistrano:
Это действительно вопрос о том, какой тип оболочки Capistrano использует, это матрица возможностей, касающихся логина, не-входа, интерактивный или неинтерактивный.
У них есть причудливый графический здесь (внизу), где они иллюстрируют путь к файлам, которые выполняются в процессе входа в систему. - данный источник также интересен, если вы хотите продолжить чтение по этой теме.
Что происходит не так?
Когда вы регистрируетесь с помощью ssh, вы (при входе) выполняете несколько файлов (например,.bash_profile при использовании bash). Обычно ваша переменная $PATH расширяется несколькими путями к важным функциям в вашей среде. НО разные "стили" входа в систему включают в себя разные файлы.
Как говорится в документации:
По умолчанию Capistrano всегда назначает не-логин, не интерактивный оболочки.
В моем случае это приводит к случаю, когда мой файл входа .bash_profile не включен, но он включал настройки для моего rvm. В результате сеанс входа в capistrano не знал о моем пути rvm.
Как я могу это исправить?
Для меня это оказалось просто раскомментированием строки "capistrano/rvm" (как я использую RVM) в Capfile (расположенной в корне вашего рельса-проекта.
Надеюсь помочь кому-то.
EDIT:
И обязательно включите gem 'capistrano-rvm'
в Gemfile!
Я думаю, вы должны выполнить
apt-get install git-core
на вашем сервере
У меня была такая же проблема с использованием rbenv. Для меня это решило включить библиотеку rbenv перед сборщиком - не после него. Приказ оказался важным. Вот что в моем Capfile:
require 'capistrano/rbenv'
require 'capistrano/bundler'
Если вы сделали это правильно, вы должны увидеть команду bundle, выполненную с префиксом rbenv, в следующих строках:
XX RBENV_ROOT=$HOME/.rbenv RBENV_VERSION=2.3.0 $HOME/.rbenv/bin/rbenv exec bundle install ...
Убедитесь, что вы требуете всех этих драгоценных камней в своем Capfile.
Решение для ОШИБКИ:
/usr/bin/env git нет такого файла или каталога capistrano
Установите git на удаленном сервере, на котором выполняется развертывание.
apt-get install git
Моя проблема:
DEBUG [3132b2c2] /usr/bin/env: ‘bundle: No such file or directory
DEBUG [3132b2c2]
Я решил это так:
В Debian в вашем ~/.bashrc есть блок кода, который говорит:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Когда вы запускаете Capistrano, он на самом деле будет использовать ваш ~/.bashrc, но не будет запускать никакие команды ниже этого блока кода.
Итак, я исправил проблему с добавлением строк кода, которые требовались средой загрузки ruby, над этим блоком кода, чтобы Capistrano мог загружать пакет.
source /usr/local/share/chruby/chruby.sh
source /usr/local/share/chruby/auto.sh
PS: я использую Chruby на моем сервере.
Когда я набрал bundle install
в терминале, он работал. Теперь, когда я использую его через Capistrano, он не работает.
Я решил это так:
В Ubuntu в вашем ~/.bashrc
есть блок кода, который говорит:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Когда вы запускаете Capistrano, он на самом деле будет использовать ваш ~/.bashrc
но не будет запускать никаких команд ниже этого блока кода.
Итак, я исправил проблему с перемещением строк кода, необходимых для bundle install
над этим блоком кода, чтобы Capistrano мог их загрузить.
Вы можете получить подсказку, какие линии перемещать, запустив which bundle
.
Я столкнулся с той же ошибкой. После попыток исправить ее, я вспомнил, что случайно удалил несколько пакетов со своего сервера, на котором развертывал код.
Так что я также случайно удалил git. sudo apt-get install git
починил.