#ruby-on-rails #ruby #capistrano #capistrano3
#ruby-on-rails #ruby #capistrano #capistrano3
Вопрос:
У меня возникли проблемы с запуском команд ruby gem при использовании Capistrano 3 с capistrano-rbenv (я предполагаю, что он не может найти интерпретатор ruby), в частности delayed_job. Я разместил необходимые файлы, связанные с проблемой:
`require': no such file to load -- rubygems (LoadError)
Любая помощь будет высоко оценена.
Gemfile
gem 'capistrano', "~> 3.6"
gem 'capistrano-rbenv', '~> 2.0'
Capfile
# Load DSL and set up stages
require "capistrano/setup"
# Include default deployment tasks
require "capistrano/deploy"
require "capistrano/rbenv"
# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
deploy.rb
# config valid only for current version of Capistrano
lock '3.6.1'
set :application, 'youtube_rank_tracker'
set :repo_url, './.git'
# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp
# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, '/dogecoin'
# Default value for :scm is :git
set :scm, :git
# Default value for :format is :airbrussh.
set :format, :airbrussh
# You can configure the Airbrussh format using :format_options.
# These are the defaults.
set :format_options, command_output: true, log_file: 'log/capistrano.log', color: :auto, truncate: :auto
# Default value for :pty is false
set :pty, true
# Default value for :linked_files is []
# append :linked_files, 'config/database.yml', 'config/secrets.yml'
# Default value for linked_dirs is []
# append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system'
# Default value for default_env is {}
# set :default_env, { path: '$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH' }
# Default value for keep_releases is 5
set :keep_releases, 5
# set :default_env, { path: "$HOME/.rbenv/bin:$PATH" }
set :rbenv_type, :user # or :system, depends on your rbenv setup
set :rbenv_ruby, '2.1.2'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby rails}
set :rbenv_roles, :all # default value
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:all) do |host|
execute :mkdir, "-p #{release_path}/tmp"
execute :touch, release_path.join('tmp/restart.txt')
execute "cd #{release_path} amp;amp; RAILS_ENV=production bin/delayed_job restart;"
# execute "cd #{release_path} amp;amp; bundle exec rake -T"
end
end
end
after 'deploy:publishing', 'deploy:restart'
Ошибка
he deploy has failed with an error: Exception while executing as root@.....: cd /.... amp;amp; RAILS_ENV=production bin/delayed_job restart; exit status: 1
cd /.... amp;amp; RAILS_ENV=production bin/delayed_job restart; stdout: /usr/lib/ruby/vendor_ruby/bundler/shared_helpers.rb:2:in `require': no such file to load -- rubygems (LoadError)
from /usr/lib/ruby/vendor_ruby/bundler/shared_helpers.rb:2
from /usr/lib/ruby/vendor_ruby/bundler/setup.rb:1:in `require'
from /usr/lib/ruby/vendor_ruby/bundler/setup.rb:1
Ответ №1:
Короткий ответ
Вместо того, чтобы писать его самостоятельно, используйте полуофициальный драгоценный камень интеграции отложенных заданий Capistrano 3: https://github.com/AgileConsultingLLC/capistrano3-delayed-job
Длинный ответ
Если бы вы действительно написали это самостоятельно, capistrano-rbenv влияет только на небольшой список команд по умолчанию, как показано здесь: https://github.com/capistrano/rbenv/blob/master/lib/capistrano/tasks/rbenv.rake#L47
В этом случае вам, вероятно, потребуется что-то вроде следующего:
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:all) do |host|
within release_path do
execute :ruby, "bin/delayed_job", 'restart'
end
end
end
end
Вместо создания tmp/
каталога добавьте его :linked_dirs
в свою конфигурацию.
Кроме того, похоже, что вы касаетесь tmp/restart.txt
перезапуска Passenger. В качестве альтернативы, используйте для этого драгоценный камень capistrano-passenger. Он может работать в более новом режиме, который использует пассажирские команды для перезапуска вашего приложения, или вы можете указать ему использовать механизм touch file.
Наконец, вместо использования cd ${release_path}
используйте метод within
DSL. Это выполнит то же самое и не нарушит отображение команд.
Комментарии:
1. Спасибо, уилл! Я попробовал камень отложенного задания для capistrano, и он не работал должным образом, выдавая ошибку пакета, но просто эмулируя код, который вы опубликовали, сработал.