【问题标题】:Capistrano 3 deploy:migrate not executing due to missing primaryCapistrano 3 部署:由于缺少主节点,迁移未执​​行
【发布时间】:2014-07-11 15:35:21
【问题描述】:

我有 capistrano 设置来将 Rails 应用程序部署到远程服务器。部署代码时一切正常,但即使我安装了capistrano-rails gem,它也没有迁移数据库。当我在服务器上手动迁移它们时,迁移工作正常,但让它们自动运行会更好

为了弄清楚出了什么问题,我进入了capistrano-rails 源,并将deploy:migrate 方法直接复制到了我的deploy.rb 文件中。我添加了一堆打印行,发现当它进入方法时,它没有返回任何内容,因为行:on primary fetch(:migration_role) 正在返回一个空数组。

capistrano documentation 指的是如何定义主要角色,如果未指定,则第一个列出的角色是默认主要角色。

这是我插入到 deploy.rb 文件中的capistrano-rails 源代码,我唯一的修改是两个puts 行。

namespace :deploy do
  desc 'Runs rake db:migrate if migrations are set'
  task :migrate => [:set_rails_env] do
    puts "on primary fetch(:migration_role) ==> #{on primary fetch(:migration_role)}"
    on primary fetch(:migration_role) do
      puts "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
      conditionally_migrate = fetch(:conditionally_migrate)
      info '[deploy:migrate] Checking changes in /db/migrate' if conditionally_migrate
      if conditionally_migrate && test("diff -q #{release_path}/db/migrate #{current_path}/db/migrate")
        info '[deploy:migrate] Skip `deploy:migrate` (nothing changed in db/migrate)'
      else
        info '[deploy:migrate] Run `rake db:migrate`' if conditionally_migrate
        within release_path do
          with rails_env: fetch(:rails_env) do
            execute :rake, "db:migrate"
          end
        end
      end
    end
  end

  after :updated, :migrate
end

以下是我的staging.rb 角色文件中可能相关的一些其他设置。我更改了我的特定服务器名称。

role :app, %w{deploy@example.com}
role :web, %w{deploy@example.com}


# Default deploy_to directory is /var/www/my_app
set :deploy_to, '/path/to/my/staging_dir'


# Define server(s)
server 'example.com', user: 'deploy', roles: %w{web app}

# Setup Options
set :migration_role, 'migrator'
set :conditionally_migrate, true
set :assets_roles, [:web, :app]

如果您对这里可能出现的问题有任何想法,请告诉我。谢谢!

【问题讨论】:

  • 更新 我尝试将:db 角色添加到我的staging.rb 角色文件中,甚至尝试在该服务器上显式设置:migration_role,如下行所示,但源代码中的数组仍然是空的,同样的问题仍然存在。 role :db, %w{deployer@buri.peckapp.com}, :primary => true, :migration_role => %w(db)

标签: ruby-on-rails migration rake capistrano capistrano3


【解决方案1】:

将“db”添加到您的服务器角色中:

server 'example.com', user: 'deploy', roles: %w{web app db}

另外,在你的Capfile:

require 'capistrano/rails/migrations'

我相信您也希望在您的Capfile 中使用这些 require 语句:

require 'capistrano/bundler'
require 'capistrano/rails/assets'

【讨论】:

  • 我的 Capfile 中确实已经有了这些要求,不幸的是,将“db”添加到服务器角色似乎并没有什么不同。对on primary fetch(:migration_role) 的调用仍会在源中返回一个空数组,并阻止实际的 rake 迁移任务执行。是否存在我缺少的设置:migration_role?我发现pull request 添加了它,但它并没有透露太多信息。 on primary 是做什么的?问题可能源于那里吗?我用一些东西更新了这个问题。
【解决方案2】:

我发现问题出在重复的服务器定义上。因为我有角色定义:

role :app, %w{deploy@example.com}
role :web, %w{deploy@example.com}

和服务器定义:

server 'example.com', user: 'deploy', roles: %w{web app db}

这两者之间出现了冲突,导致迁移代码无法正确识别任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多