Миграция базы данных 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

Все та же проблема.

0 ответов

Другие вопросы по тегам