Capistrano 3, Rails 4, конфигурация базы данных не определяет адаптер

Когда я запустил

развертывание крышек

он терпит неудачу следующим образом:

DEBUG [4ee8fa7a] Command: cd /home/deploy/myapp/releases/releases/20131025212110 && (RVM_BIN_PATH=~/.rvm/bin RAILS_ENV= ~/.rvm/bin/myapp_rake assets:precompile )
DEBUG [4ee8fa7a]        rake aborted!
DEBUG [4ee8fa7a]        database configuration does not specify adapter

Вы можете видеть, что "RAILS_ENV =" на самом деле пуст, и мне интересно, почему это может произойти? Я предполагаю, что это причина последней ошибки, что у меня нет конфигурации базы данных.

Файл deploy.rb находится ниже:

set :application, 'myapp'
set :repo_url, '[email protected]:developer/myapp.git'
set :branch, :master
set :deploy_to, '/home/deploy/myapp/releases'
set :scm, :git
set :devpath, "/home/deploy/myapp_development"
set :user, "deploy"
set :use_sudo, false
set :default_env, { rvm_bin_path: '~/.rvm/bin' }

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:
      within release_path do
        execute " bundle exec thin restart -O -C config/thin/production.yml"
      end
    end
  end

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      within release_path do

      end
    end
  end

  after :finishing, 'deploy:cleanup'
end

database.yml:

production:
  adapter: mysql2
  encoding: utf8
  database: myapp_production
  pool: 5
  username: user
  password: pass
  host: localhost

development:
  adapter: mysql2
  encoding: utf8
  database: myapp_development
  pool: 5
  username: user
  password: pass
  host: localhost

Проблема будет решена, если я добавлю

set :rails_env, "production"

для моего deploy.rb, но это выглядит как hardcoding для меня, и я уверен, что там более приятное решение.

Ответы

Ответ 1

Изменить: Per этот запрос на перенос, теперь он исправлен в версии 1.1.0 от capistrano-rails.

Per этот вопрос Github, еще одно исправление - отредактировать Capfile. Прокомментируйте эти две строки

#require 'capistrano/rails/assets'
#require 'capistrano/rails/migrations'

и поместите эту строку в

require 'capistrano/rails'

который правильно установит вашу переменную RAILS_ENV.

Ответ 2

Используя Cap 3 и capistrano_rails на рельсах 4, я получал ту же ошибку; в файлах среды, которые были развернуты, я установил

set :stage, :production
set :rails_env, 'production' # even though doc says only need to do this if it different

Doc здесь: https://github.com/capistrano/rails

Ответ 3

На основе ответа Marc, который определенно кажется правильным,

вы можете обойти это до тех пор, пока оно не будет зафиксировано вверх, добавив это в ваш config/deploy.rb в блоке "пространство имен: развернуть":

  desc 'Provision env before assets:precompile'
  task :fix_bug_env do
    set :rails_env, (fetch(:rails_env) || fetch(:stage))
  end

  before "deploy:assets:precompile", "deploy:fix_bug_env"

Это приведет к загрузке env и обеспечению RAILS_ENV перед активами: вызывается предварительная компиляция.

Ответ 4

Кажется, это ошибка в capistrano-rails.

Существует задача (rails.rake), которая устанавливает среду как из rails_env, так и для этапа:

namespace :deploy do
  before :starting, :set_rails_env do
    set :rails_env, (fetch(:rails_env) || fetch(:stage))
  end
end

Но эта задача не вызывается до того, как активы будут прекомпилированы. Итак:

namespace :assets do
  task :precompile do
    on roles :web do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "assets:precompile"
        end
      end
    end
  end
end

не работает, потому что rails_env равен нулю, если он не установлен явно.

Если у меня есть время, чтобы копать немного глубже, я напишу отчет об ошибке.

Ответ 5

Что произойдет, если вы добавите файл:

deploy/production.rb

С помощью этой строки:

set :stage, :production

Ответ 6

Если вы используете пассажира, вам нужно добавить

rails_env production;

на веб-сервере (например: nginx).conf, где вы указали значения для passenger_ruby и passenger_root.