【问题标题】:Capistrano 3 is not running rails migrations when deployedCapistrano 3 在部署时没有运行 rails 迁移
【发布时间】:2014-03-23 16:31:46
【问题描述】:

我想将应用程序部署到我的本地服务器的生产环境中。我正在使用 capistrano 3。

这是我的头文件

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rvm'
require 'capistrano/bundler'
require 'capistrano/rails'
#require 'capistrano/rails/migrations'
#require 'capistrano/rails/assets'


# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

这是我的 deploy.rb

# config valid only for Capistrano 3.1
lock '3.1.0'

set :application, 'ImpresaZiliani'
set :repo_url, 'francesco@10.0.1.8:repos/impresaziliani.git'
set :branch, 'master'
# Default branch is :master
# ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

# Default deploy_to directory is /var/www/my_app
set :deploy_to, '/home/francesco/impresaziliani'

# Default value for :scm is :git
set :scm, :git
set :deploy_user, "francesco"
set :rails_env, "production"

set :keep_releases, 5

namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      # execute :touch, release_path.join('tmp/restart.txt')
    end
  end

  after :publishing, :restart

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
   end
  end

end

set :rvm_ruby_version, '2.1.1'
set :default_env, { rvm_bin_path: '~/.rvm/bin' }
SSHKit.config.command_map[:rake] = "#{fetch(:default_env)[:rvm_bin_path]}/rvm ruby-#                   {fetch(:rvm_ruby_version)} do bundle exec rake"

我的 database.yml 没问题,因为如果我在它工作的服务器上手动运行迁移,我尝试取消注释 capistrano/rails/migrations 和资产行但没有任何变化:当我部署它时运行良好,直到捆绑器安装,然后在没有任何警告或错误的情况下,跳到资产预编译器并且不运行迁移。

我该如何解决这个问题?

谢谢

【问题讨论】:

    标签: ruby-on-rails capistrano


    【解决方案1】:

    还需要让部署的用户有db的角色,如:

    server 'you_ip_address', user: 'user_name', roles: %w{web app db}
    

    【讨论】:

      【解决方案2】:

      rake db:migrate 在 capistrano 3 中每次部署都是自动的 您只需在 Capfile 中取消注释 #require 'capistrano/rails/migrations'

      【讨论】:

      • 这与它无关 :) 要么为所有设置保留“capistrano/rails”,要么定义自定义设置。如果@aquajach 提到的角色中缺少“db”,则此问题与“角色”有关,那么默认情况下它不会执行与 db 相关的任务。
      • @BilalAhmed 是对的。查看require 'capistrano/rails 所需的capistrano/rails 文件。
      • 建议将:migration_role设置为:app,根据:github.com/capistrano/rails。我的问题是我没有 :migration_role 集。完成此操作后,一切都按预期进行。
      【解决方案3】:

      Jude Calimbas 和 hiveer 的答案都比公认的答案更准确 - 迁移任务作为部署任务的一部分自动运行。

      但是,他们的回答并不能解释观察到的问题。我唯一想到的是 database.yml 文件没有在 deploy.rb 文件中显式链接。所以像

      这样的一行
      set :linked_files, %w{config/database.yml}
      

      会修复的。

      我知道这是一个老问题,但从 OP 那里了解有关问题和修复的更多详细信息会很有趣。

      【讨论】:

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