Capistrano «cap deploy: migrations» завершается ошибкой, поскольку пытается выполнить все миграции, а не только ожидающие - PullRequest
3 голосов
/ 05 сентября 2011

Я пытаюсь выполнить развертывание с помощью «cap deploy: migrations», поскольку у меня есть 3 новые миграции, которые необходимо выполнить на работающем сервере.Результат:

executing "cd /home/martin/public_html/project/releases/20110905131238; bundle exec rake RAILS_ENV=production  db:migrate"
    servers: ["50.56.82.190"]
    [50.56.82.190] executing command
 ** [out :: 50.56.82.190] ==  CreateUsers: migrating ====================================================
 ** [out :: 50.56.82.190] -- create_table(:users)
 ** [out :: 50.56.82.190] rake aborted!
 ** [out :: 50.56.82.190] An error has occurred, all later migrations canceled:
 ** [out :: 50.56.82.190] 
 ** [out :: 50.56.82.190] Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255), `email` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB
 ** [out :: 50.56.82.190] 
 ** [out :: 50.56.82.190] Tasks: TOP => db:migrate
 ** [out :: 50.56.82.190] (See full trace by running task with --trace)
    command finished in 5816ms
failed: "sh -c 'cd /home/martin/public_html/project/releases/20110905131238; bundle exec rake RAILS_ENV=production  db:migrate'" on 50.56.82.190

При предыдущем развертывании я создал рабочую базу данных на работающем сервере.Я создал 3 новые миграции (из-за загрузки изображений с новыми гемами carrierwave и rmagick), которые я хотел бы развернуть сейчас.Очевидно, что cap deploy: migrations пытается запустить все миграции из первой, а не только из ожидающих.

Мой deploy.rb:

require 'bundler/capistrano'
set :application, "otg.in"
set :domain, "otg.in"
set :user, "martin"
set :sudo_use, false
set :repository, "git@github.com:Martin118/otg.in.git"
set :local_repository,  '~/rails_projects/otg.in/.git'
set :port, 48000
set :deploy_to, "/home/martin/public_html/#{application}"
set :scm, :git
set :branch, "master"
default_run_options[:pty] = true
ssh_options[:forward_agent] = true

server "50.56.82.190", :app, :web, :db, :primary => true

after "deploy", "deploy:bundle_gems"
after "deploy:bundle_gems", "deploy:restart"
after "deploy:update_code", "deploy:migrate"
after "deploy", "deploy:cleanup"

# Passenger
namespace :deploy do
     task :bundle_gems do
    run "cd #{deploy_to}/current && bundle install vendor/gems"
  end
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end

require 'whenever/capistrano'

Я запускаю rails 3.0.8, capdeploy: check дает мне «У вас, похоже, установлены все необходимые зависимости».

Есть идеи?Или вам нужна дополнительная информация?

Спасибо за помощь!

schema.rb в прямом эфире:

ActiveRecord::Schema.define(:version => 20110130000344) do

  create_table "businesses", :force => true do |t|
    t.string   "business_name"
    t.string   "postal_code"
    t.string   "business_email"
    t.string   "phone"
    t.string   "fax"
    t.string   "web"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
    t.text     "address"
    t.integer  "city_id"
    t.integer  "state_id"
  end

  create_table "cities", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "state_id"
  end

  create_table "states", :force => true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "name"
  end

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "encrypted_password"
    t.string   "salt"
    t.boolean  "admin",              :default => false
  end

  add_index "users", ["email"], :name => "index_users_on_email", :unique => true

end

Еще одно обновление: выберите * из schema_migrations;в моей базе данных разработки дает мне:

+ ---------------- + |версия |+ ---------------- + |20110112163009 ||20110113141953 ||20110113192958 ||20110114214158 ||20110115002206 ||20110119100832 ||20110120134443 ||20110127171331 ||20110127171427 ||20110127171921 ||20110127172903 ||20110127183252 ||20110129201949 ||20110129204159 ||20110129205833 ||20110130000344 ||20110808142844 ||20110809133339 ||20110809142303 ||20110809154349 ||20110810092306 ||20110810093531 ||20110812085010 |+ ---------------- +

Но, проверяя это с MySQL, я получаю (все еще база данных разработки):

Ошибка: project_development.schema_migrations: данные таблицы недоступны для редактирования, поскольку для таблицы не определен первичный ключ

Кроме того, выбор * из schema_migrations в базе данных производств дает мне только одну миграцию (последнюю перед попыткой обновления):

+ ---------------- + |версия |+ ---------------- + |0 ||20110130000344 |+ ---------------- +

Кто-нибудь знает, что здесь произошло?

Спасибо!

1 Ответ

3 голосов
/ 07 сентября 2011

Решением было добавить вручную отсутствующие миграции в schema_migrations.Почему-то кажется, что эта таблица потеряла часть своих данных.В любом случае, добавив миграции, которые уже были выполнены непосредственно с помощью «INSERT, в значения schema_migrations (version) ('2011 ....');", затем cap deploy: миграции выполнялись плавно, начиная только с новых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...