2016-11-10 114 views
0

我在Capistrano遇到一个奇怪的问题,同时准备好生产服务器。当我运行cap production deploy,它总是失败的部署:迁移与Capistrano帽子生产部署失败,但迁移帽子生产部署:迁移通过

的ActiveRecord :: AdapterNotSpecified步:“生产”数据库不是 配置。可用:“defaul ......

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

在实际的服务器,我可以运行RAILS_ENV=production bundle exec rake:migrate没有任何问题,无论是

的Capistrano的日志。吐出相同的命令两者:

[部署:迁移]运行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 

我还要提到的是我已经设置了轨道ENV我deploy.rb像这样: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新手。

+0

是否有机会在提取最新代码(新文件夹...)时尝试在database.yml正确设置之前运行迁移? – Andreyy

+0

根据日志我不相信发生这种情况,我可以看到它在迁移前6个步骤运行git命令等。 – gwnp

回答

1

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

我没有意识到“当前”目录(或符号链接是公平的)是在Capistrano进程结束时创建的,并且由于我有一个RAKE_ENV = development的早期试运行,所以我已经有了当前的符号链接在服务器上。

部署之前:

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

这在时间之前部署:迁移一步,我通过使用此命令自定义任务,从一个安全的位置上传我的database.yml到服务器迁移,对于我的困惑,我认为rake db:migrate是从当前的符号链接运行的,但实际上它是从最新版本目录运行的。由于文件已上载到指向旧版本的当前符号链接,因此最新版本目录中没有生产数据库信息。

所有的一切,我的自定义任务导致此问题,如果任何人遇到了类似的情况,我们这个命令:

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

该键为release_path变量,而不是current_path变量。