Capistrano 上限生产部署在迁移时失败但上限生产 deploy:migrate 通过
Capistrano cap production deploy fails on migration but cap production deploy:migrate passes
我在准备生产服务器时遇到了 Capistrano 的一个奇怪问题。当我 运行 cap production deploy
时,它总是在 deploy:migrate 步骤上失败
ActiveRecord::AdapterNotSpecified: 'production' database is not
configured. Available: ["defaul…
然而,当我 运行 cap production deploy:migrate
时,Capistrano 成功完成。
在实际服务器上,我也能够 运行 RAILS_ENV=production bundle exec rake:migrate
没有任何问题。
Capistrano 日志为两者吐出相同的命令:
[deploy:migrate] Run 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 环境,如下所示: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 的新手。
经过大量搜索,我找到了根本原因。
我没有意识到 "current" 目录(或符号链接是公平的)是在 Capistrano 进程结束时创建的,因为我之前用 运行 试用过 [=31] =]=开发,我已经在服务器上有了当前的符号链接。
在 deploy:migrate 步骤之前,我通过使用此命令的自定义任务将我的 database.yml 从安全位置上传到服务器:
upload! "#{SECURE_DATA}database.yml", "#{current_path}/config/"
在 deploy:migrate 之前,令我困惑的是,我认为耙子 db:migrate 是来自当前符号链接的 运行,但实际上是 运行 从最新的发布目录。最新版本目录没有生产数据库信息,因为文件已上传到指向旧版本的当前符号链接。
总而言之,我的自定义任务导致了这个问题,如果其他人遇到类似情况,请改用此命令:
upload! "#{SECURE_DATA}database.yml", "#{release_path}/config/"
关键是 release_path
变量而不是 current_path
变量。
我在准备生产服务器时遇到了 Capistrano 的一个奇怪问题。当我 运行 cap production deploy
时,它总是在 deploy:migrate 步骤上失败
ActiveRecord::AdapterNotSpecified: 'production' database is not configured. Available: ["defaul…
然而,当我 运行 cap production deploy:migrate
时,Capistrano 成功完成。
在实际服务器上,我也能够 运行 RAILS_ENV=production bundle exec rake:migrate
没有任何问题。
Capistrano 日志为两者吐出相同的命令:
[deploy:migrate] Run
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 环境,如下所示: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 的新手。
经过大量搜索,我找到了根本原因。
我没有意识到 "current" 目录(或符号链接是公平的)是在 Capistrano 进程结束时创建的,因为我之前用 运行 试用过 [=31] =]=开发,我已经在服务器上有了当前的符号链接。
在 deploy:migrate 步骤之前,我通过使用此命令的自定义任务将我的 database.yml 从安全位置上传到服务器:
upload! "#{SECURE_DATA}database.yml", "#{current_path}/config/"
在 deploy:migrate 之前,令我困惑的是,我认为耙子 db:migrate 是来自当前符号链接的 运行,但实际上是 运行 从最新的发布目录。最新版本目录没有生产数据库信息,因为文件已上传到指向旧版本的当前符号链接。
总而言之,我的自定义任务导致了这个问题,如果其他人遇到类似情况,请改用此命令:
upload! "#{SECURE_DATA}database.yml", "#{release_path}/config/"
关键是 release_path
变量而不是 current_path
变量。