Развертывание Capistrano 3: миграция не выполняется из-за отсутствия основного

У меня есть настройка capistrano для развертывания приложения rails на удаленном сервере. При развертывании кода все работает нормально, но хотя у меня был установлен гем capistrano-rails, он не переносил базу данных. Миграции работают, когда я переношу их вручную на сервер, но было бы гораздо лучше, если бы они запускались автоматически.

Чтобы попытаться выяснить, что пошло не так, я зашел в исходный код capistrano-rails и скопировал метод deploy:migrate прямо в свой файл deploy.rb. Я добавил несколько строк печати и обнаружил, что при вводе метода он ничего не возвращает, потому что строка: on primary fetch(:migration_role) возвращает пустой массив.

В документации capistrano говорится, что первый указанная роль является основной по умолчанию, если она не указана.

Вот исходный код capistrano-rails, который я вставил в свой файл deploy.rb, моя единственная модификация — это две строки 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{[email protected]}
role :web, %w{[email protected]}


# 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]

Дайте мне знать, если у вас есть какие-либо идеи относительно того, что здесь может быть не так. Спасибо!


person Aaron    schedule 11.07.2014    source источник
comment
Обновление Я попытался добавить роль :db в свой файл ролей staging.rb и даже попытался явно установить :migration_role на этом сервере, как в строке ниже, но массив в исходном коде по-прежнему пуст и та же проблема сохраняется. role :db, %w{[email protected]}, :primary => true, :migration_role => %w(db)   -  person Aaron    schedule 12.07.2014


Ответы (2)


Добавьте «db» к ролям вашего сервера:

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

Кроме того, в вашем Capfile:

require 'capistrano/rails/migrations'

Я полагаю, что вам также понадобятся эти операторы require в вашем Capfile:

require 'capistrano/bundler'
require 'capistrano/rails/assets'
person Eric Francis    schedule 11.07.2014
comment
У меня уже были эти требования в моем Capfile, и, к сожалению, добавление «db» к ролям сервера, похоже, не имело значения. Вызов on primary fetch(:migration_role) по-прежнему возвращает пустой массив в источнике и препятствует выполнению фактической задачи миграции rake. Может ли быть какая-то настройка, которую мне не хватает для :migration_role? Я нашел запрос на вытягивание, добавляющий его, но он не проливает много света. Что делает on primary? Может ли проблема исходить оттуда? Я обновил вопрос несколькими вещами. - person Aaron; 12.07.2014

Я понял, что проблема была в дублировании определений серверов. Потому что у меня были определения ролей:

role :app, %w{[email protected]}
role :web, %w{[email protected]}

и определение сервера:

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

возник конфликт между этими двумя, который мешал правильному распознаванию чего-либо кодом миграции.

person Aaron    schedule 14.07.2014