17

当我开始

上限生产部署

它像这样失败:

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, 'git@github.com: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

数据库.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,但这对我来说看起来像是硬编码,我相信有更好的解决方案。

4

6 回答 6

17

编辑:根据此拉取请求,它现在已修复1.1.0capistrano-rails.

根据这个 Github 问题,另一个解决方法是编辑您的Capfile. 注释掉这两行

#require 'capistrano/rails/assets'
#require 'capistrano/rails/迁移'

并将这条线放入

需要'capistrano/rails'

这将正确设置您的RAILS_ENV变量。

于 2013-11-09T02:57:20.813 回答
13

使用 Cap 3 和capistrano_railsrails 4 我得到了同样的错误;在正在部署的环境文件中,我设置

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

文档在这里:https ://github.com/capistrano/rails

于 2013-11-08T21:34:15.613 回答
9

根据马克的回答,这绝对是正确的,

您可以通过将其添加到“命名空间:deploy”块中的 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"

这将在 assets:precompile 被调用之前强制加载 env 和配置 RAILS_ENV。

于 2013-10-29T16:29:46.757 回答
8

似乎是 capistrano-rails 中的错误。

有一个任务(rails.rake)可以从 rails_env 或 stage 设置环境:

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

但是这个任务在assets:precompile 之前没有被调用。所以这:

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 如果没有明确设置,则为 nil。

如果我有时间深入挖掘,我会提交一份错误报告。

于 2013-10-28T15:37:31.307 回答
3

如果您使用乘客,则需要添加

rails_env production;

在 web 服务器(例如:nginx)的 .conf 中,您为passenger_ruby和指定了值passenger_root

于 2014-05-07T17:11:33.630 回答
1

如果添加文件会发生什么:

deploy/production.rb

有了这条线:

set :stage, :production
于 2013-10-27T11:40:30.647 回答