Я использую Capistrano для развертывания приложения Sinatra в хостинговой компании (https://railsplayground.com/).
Хостинговая компания поддерживает 3 версии Ruby:
$ ruby -v
ruby 2.0.0p645 (2015-04-13 revision 50299) [x86_64-linux]
$ /usr/local/bin/ruby224 -v
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-linux]
$ /usr/local/bin/ruby233 -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
Поскольку Sinatra 2.0.3 требует Ruby> = 2.2.0 , я решил использовать Ruby 2.3.3. Хостинг-компания создала соответствующие исполняемые файлы:
$ /usr/local/bin/ruby233 /usr/local/bin/gem233 -v
2.5.2
$ /usr/local/bin/ruby233 /usr/local/bin/bundle233 -v
Bundler version 1.14.4
Чтобы протестировать процесс установки Gem, я создал папку с Gemfile:
$ cat Gemfile
source 'http://rubygems.org'
gem 'sinatra'
Я запустил упаковщик ($ /usr/local/bin/ruby233 /usr/local/bin/bundle233 install --path=vendor/bundle
), и гемы были установлены в директорию vendor/bundle
приложения:
$ ll vendor/bundle/ruby/2.3.0/gems/
total 28
drwxrwxr-x 7 foobar foobar 4096 Sep 10 06:35 ./
drwxrwxr-x 9 foobar foobar 4096 Sep 10 06:35 ../
drwxrwxr-x 5 foobar foobar 4096 Sep 10 06:35 mustermann-1.0.3/
drwxrwxr-x 7 foobar foobar 4096 Sep 10 06:35 rack-2.0.5/
drwxrwxr-x 3 foobar foobar 4096 Sep 10 06:35 rack-protection-2.0.3/
drwxrwxr-x 4 foobar foobar 4096 Sep 10 06:35 sinatra-2.0.3/
drwxrwxr-x 7 foobar foobar 4096 Sep 10 06:35 tilt-2.0.8/
Затем я создал простое приложение Sinatra и попытался развернуть его.
Gemfile
:
source "http://rubygems.org"
gem "sinatra"
group :development do
# deployment
gem 'capistrano'
gem 'capistrano-bundler'
gem 'capistrano-passenger'
end
config.ru
require 'bundler'
Bundler.setup
# desired
#/usr/local/bin/ruby233 /usr/local/bin/bundle233 install --path=vendor/bundle
require File.join(File.dirname(__FILE__), 'app')
run Sinatra::Application
deploy.rb
set :git_user, 'foobar'
set :application, "cap"
set :repo_url, "git@bitbucket.org:#{fetch(:git_user)}/#{fetch(:application)}.git"
set :branch, 'master'
set :passenger_restart_with_touch, true
staging.rb
set :stage, :staging
set :ssh_user, 'foobarbaz'
set :use_sudo, false
server "supersonic.webhostserver.biz", user: fetch(:ssh_user), roles: %w{app, web, db}
set :tmp_dir, "/home/#{fetch(:ssh_user)}/tmp"
set :deploy_to, "/home/#{fetch(:ssh_user)}/apps/#{fetch(:application)}"
Я запустил промежуточное развертывание (с рабочей станции):
$ bundle exec cap staging deploy
Когда скрипт пытается установить Gems, он терпит неудачу:
00:14 bundler:install
01 bundle install --path /home/foobarbaz/apps/cap/shared/bundle --without development test --deployment --quiet
01 stdin: is not a tty
01 An error occurred while installing mustermann (1.0.3), and Bundler cannot
01 continue.
01 Make sure that `gem install mustermann -v '1.0.3'` succeeds before bundling.
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as foobarbaz@supersonic.webhostserver.biz: bundle exit status: 5
bundle stdout: An error occurred while installing mustermann (1.0.3), and Bundler cannot
continue.
Make sure that `gem install mustermann -v '1.0.3'` succeeds before bundling.
bundle stderr: stdin: is not a tty
Сбой, потому что mustermann
требует Ruby> = 2.2.0, но скрипт пытается установить Gem, используя Ruby 2.0 (по умолчанию).
Как мне заставить capistrano (версия 3.11.0 на моей рабочей станции) использовать на сервере нужную версию bundler (bundle233)?