Миграция базы данных Capifony Doctrine на нескольких серверах
Я пытаюсь запустить миграцию доктрины Symfony на нескольких серверах, используя capifony, но похоже, что она выполняет миграцию только на одном сервере. например: Вот как я устанавливаю адреса своих серверов:
role :web, "192.168.56.102","192.168.56.103" # Your HTTP server, Apache/etc
role :app, "192.168.56.102","192.168.56.103", :primary => true # This may be the same as your `Web` server
Миграции выполняются только на первом сервере, хотя развертывание кода происходит на обоих.
Вот мой сценарий развертывания:
#### Basic Deploying Script Config ####
set :application, "eConnect"
###set :domain, "192.168.56.102"
set :user, "vagrant"
set :use_sudo, false
set :deploy_to, "/var/www/SchoolEconnectDeployment"
set :app_path, "app"
set :repository, "."
set :local_repository, "."
set :deploy_via, :copy
set :scm, :mercurial
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `subversion`, `mercurial`, `perforce`, or `none`
set :model_manager, "doctrine"
set :interactive_mode, false
# Or: `propel`
role :web, "192.168.56.102","192.168.56.103" # Your HTTP server, Apache/etc
role :app, "192.168.56.102","192.168.56.103", :primary => true # This may be the same as your `Web` server
set :copy_vendors, true
set :cache_warmup, false
set :keep_releases, 3
set :shared_children, %w()
#############################################################################################################################################
#### Created Custom Methods for Deployment ####
namespace :deploy do
task :create_release_dir, :except => {:no_release => true} do
run "mkdir -p #{fetch :releases_path}"
end
#### Copying the Latest release to any specified directory ####
task :move_latest_release, :roles => %w{app web db} do
run "mkdir -p /var/www/school_econnect"
run "yes | cp -rf #{ current_release }/* /var/www/school_econnect"
end
#### Econnect Migrations Custom Method ####
desc "Executes a Econnect migration to a specified version or the latest available version"
task :econnect_migrate, :roles => :app, :only => { :primary => true }, :except => { :no_release => true } do
currentVersion = nil
run "#{try_sudo} sh -c 'cd /var/www/school_econnect && #{php_bin} #{symfony_console} --no-ansi doctrine:migrations:status #{console_options}'", :once => true do |ch, stream, out|
if stream == :out and out =~ /Current Version:.+\(([\w]+)\)/
currentVersion = Regexp.last_match(1)
end
if stream == :out and out =~ /Current Version:\s*0\s*$/
currentVersion = 0
end
end
if currentVersion == nil
raise "Could not find current database migration version"
end
logger.info " Current database version: #{currentVersion}"
on_rollback {
if !interactive_mode || Capistrano::CLI.ui.agree("Do you really want to migrate #{symfony_env_prod}'s database back to version #{currentVersion}? (y/N)")
run "#{try_sudo} sh -c 'cd /var/www/school_econnect && #{php_bin} #{symfony_console} doctrine:migrations:migrate #{currentVersion} #{console_options} --no-interaction'", :once => true
end
}
if !interactive_mode || Capistrano::CLI.ui.agree("Do you really want to migrate #{symfony_env_prod}'s database? (y/N)")
run "#{try_sudo} sh -c ' cd /var/www/school_econnect && #{php_bin} #{symfony_console} doctrine:migrations:migrate #{console_options} --no-interaction'", :once => true
end
end
#### View the status of the migrations available ####
desc "Views the status of a set of migrations"
task :econnect_migrate_status, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} sh -c 'cd /var/www/school_econnect && #{php_bin} #{symfony_console} doctrine:migrations:status #{console_options} '", :once => true
end
#### Econnect Migrations Rollback Custom Method ####
desc "Executes a Econnect migration Rollback to a specified version or the latest available version"
task :econnect_rollback_migrate, :roles => :app, :only => { :primary => true }, :except => { :no_release => true } do
currentVersion = nil
run "#{try_sudo} sh -c 'cd /var/www/school_econnect && #{php_bin} #{symfony_console} --no-ansi doctrine:migrations:status #{console_options}'", :once => true do |ch, stream, out|
if stream == :out and out =~ /Current Version:.+\(([\w]+)\)/
currentVersion = Regexp.last_match(1)
end
if stream == :out and out =~ /Current Version:\s*0\s*$/
currentVersion = 0
end
end
if currentVersion == nil
raise "Could not find current database migration version"
end
logger.info " Current database version: #{currentVersion}"
on_rollback {
if !interactive_mode || Capistrano::CLI.ui.agree("Do you really want to migrate #{symfony_env_prod}'s database back to version #{currentVersion}? (y/N)")
run "#{try_sudo} sh -c 'cd /var/www/school_econnect && #{php_bin} #{symfony_console} doctrine:migrations:migrate #{currentVersion} #{console_options} --no-interaction'", :once => true
end
}
if !interactive_mode || Capistrano::CLI.ui.agree("Do you really want to migrate #{symfony_env_prod}'s database? (y/N)")
run "#{try_sudo} sh -c ' cd /var/www/school_econnect && #{php_bin} #{symfony_console} doctrine:migrations:execute #{currentVersion} --down #{console_options} --no-interaction'", :once => true
end
end
end
####################################################################################################################
### Spinner Stuff ###
@spinner_running = false
@chars = ['|', '/', '-', '\\']
@spinner = Thread.new do
loop do
unless @spinner_running
Thread.stop
end
print @chars[0]
sleep(0.1)
print "\b"
@chars.push @chars.shift
end
end
def start_spinner
@spinner_running = true
@spinner.wakeup
end
# stops the spinner and backspaces over last displayed character
def stop_spinner
@spinner_running = false
print "\b"
end
###############################################################
STDOUT.sync
####### Custom Methods Hooks with Capifony's Deployment Methods #######
after "deploy", "deploy:cleanup"
after "deploy:setup", "deploy:create_release_dir"
before "deploy:move_latest_release" do
print " --> Moving the latest version to the correct Destination ........"
start_spinner()
end
after "deploy:move_latest_release" do
stop_spinner()
puts " Done.".green
end
after "deploy:rollback" do
print " --> Moving the latest version to the correct Destination ........"
start_spinner()
run "mkdir -p /var/www/school_econnect"
run "yes | cp -rf #{ previous_release }/* /var/www/school_econnect"
stop_spinner()
puts " Done.".green
end
after "deploy:cleanup", "deploy:move_latest_release"
after "deploy:move_latest_release", "deploy:econnect_migrate"
before "deploy:econnect_migrate" do
print " --> Running Migrations ......"
start_spinner()
end
after "deploy:econnect_migrate" do
stop_spinner()
puts " Done.".green
end
before "deploy:econnect_rollback_migrate" do
print " --> Rolling Back Latest Migration ......"
start_spinner()
end
after "deploy:econnect_rollback_migrate" do
stop_spinner()
puts " Done.".green
end
##############################################################################################################
# Be more verbose by uncommenting the following line
logger.level = Logger::MAX_LEVEL
Как вы можете видеть, я должен был сделать свою собственную функцию миграции, которая немного отличается (не так сильно, жестко закодированный путь, вот и все).
Я искал везде, но я не мог найти ничего, связанного с моей проблемой.
и если нет решения, я хотел бы знать, как я могу вызвать задачу в цикле и дать ей любой параметр, который я хочу записать в сценарии развертывания. я довольно новичок в рубине, так что вы знаете.
PS: я также попробовал многоступенчатый метод, но у меня ничего не получалось. Буду признателен за любую помощь. Заранее спасибо.
Редактировать:
Я пытался найти обходной путь, который я пытался с этим:
before "deploy:move_latest_release" do
machine_info = ['192.168.56.102','192.168.56.103']
machine_info.each do |value|
role :db, "#{value}", :primary => true
puts "#{value}".red
deploy.econnect_migrate
end
print " --> Moving the latest version to the correct Destination ........"
start_spinner()
end
цикл работает нормально, но роль:db не меняется.
Я тоже попробовал это
cap HOSTS=192.168.56.102,192.168.56.103 deploy:econnect_migrate
Все та же проблема.