Capistrano上限生产部署在迁移时失败,但上限生产部署:迁移通道

时间:2016-11-10 07:19:16

标签: ruby ruby-on-rails-3 deployment capistrano3

在准备好生产服务器时,我遇到了Capistrano的一个奇怪问题。当我运行cap production deploy时,它始终在使用

的deploy:migrate步骤失败
  

ActiveRecord :: AdapterNotSpecified:'production'数据库不是   配置。可用:[“defaul ...

然而,当我运行cap production deploy:migrate时,Capistrano成功完成。

在实际的服务器上,我可以毫无问题地运行RAILS_ENV=production bundle exec rake:migrate

Capistrano日志为这两个命令发出相同的命令:

  

[deploy:migrate]运行rake db:migrate

我的数据库配置如下所示:

production:
  adapter: mysql2
  encoding: utf8
  database: foo
  host: localhost
  pool: 5
  timeout: 5000
  username: bar
  password: password
  socket: /opt/bitnami/mysql/tmp/mysql.sock

我还应该提一下,我已经在deploy.rb中设置了rails env,如下所示:set :rails_env, :production

以下是我的gemfile中的相关信息:

gem 'mysql2', '~> 0.4.5'
group :development do
  gem 'capistrano', '~> 3.6', '>= 3.6.1'
  gem 'capistrano-rvm'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano-passenger'
end

任何人都可以了解我在这里缺少的东西吗?我是Capistrano的新手。

1 个答案:

答案 0 :(得分:1)

经过大量搜索后,我找到了根本原因。

我没有意识到"当前"目录(或符号链接是公平的)是在Capistrano进程结束时创建的,因为我之前使用RAKE_ENV = development进行了试运行,所以我已经在服务器上安装了当前的符号链接。

在部署:迁移步骤之前,我通过使用此命令的自定义任务将我的database.yml从安全位置上传到服务器:

upload! "#{SECURE_DATA}database.yml", "#{current_path}/config/"

在部署之前:迁移,这令我感到困惑,我认为rake db:migrate是从当前符号链接运行的,但它实际上是从最新版本目录运行的。最新版本目录没有生成数据库信息,因为文件已上载到指向旧版本的当前符号链接。

总而言之,我的自定义任务导致了这个问题,如果其他人遇到类似的情况,请改为使用此命令:

upload! "#{SECURE_DATA}database.yml", "#{release_path}/config/"

关键是release_path变量而不是current_path变量。