【问题标题】:Capistrano cap production deploy fails on migration but cap production deploy:migrate passesCapistrano 上限生产部署在迁移时失败,但上限生产部署:迁移通过
【发布时间】:2016-11-10 07:19:16
【问题描述】:

我在准备生产服务器时遇到了 Capistrano 的一个奇怪问题。当我运行 cap production deploy 时,它总是在 deploy:migrate 步骤失败,使用

ActiveRecord::AdapterNotSpecified: 'production' 数据库不是 配置。可用:[“默认…

然而,当我运行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 的新手。

【问题讨论】:

  • 当它拉出最新代码(新文件夹...)时,它是否有可能在正确设置 database.yml 之前尝试运行迁移?
  • 根据日志,我不相信会发生这种情况,我可以看到它在迁移前 6 个步骤运行 git 命令等。

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


【解决方案1】:

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

我没有意识到“当前”目录(公平地说是符号链接)是在 Capistrano 进程结束时创建的,并且由于我之前使用 RAKE_ENV=development 进行了试运行,因此我已经打开了当前符号链接服务器。

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多