У меня есть настройка 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]
Дайте мне знать, если у вас есть какие-либо идеи относительно того, что здесь может быть не так. Спасибо!
:db
в свой файл ролей staging.rb и даже попытался явно установить:migration_role
на этом сервере, как в строке ниже, но массив в исходном коде по-прежнему пуст и та же проблема сохраняется.role :db, %w{[email protected]}, :primary => true, :migration_role => %w(db)
- person Aaron   schedule 12.07.2014