В настоящее время я нахожусь в процессе рефакторинга процесса развертывания моих приложений Rails.
Единственное, что мне до сих пор неясно, как загружать схему БД недавно развернутого приложения.
Я использую Мина , так как это намного быстрее, чем Capistrano. Я задал вопрос в трекере, но пока не получил ответа, поэтому я снова попытал счастья:
С Как правильно загрузить схему БД? На "настройке"? Или при первом "развертывании"? :
Я все еще не уверен, когда загружать мою схему БД при настройке нового приложения с помощью Mina.
Я знаю о invoke:'rails:db_schema_load'
в развертывании, но мне нужно запустить его только при первом развертывании. Так почему бы не перенести его в настройку? Или, по крайней мере, запускать его только в первый раз - потому что теперь я должен раскомментировать его вручную после первого запуска, иначе:
rake aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
Код развертывания выглядит следующим образом:
task :deploy do
invoke :'git:ensure_pushed'
deploy do
invoke :'git:clone'
invoke :'deploy:link_shared_paths'
invoke :'bundle:install'
invoke :'rails:db_schema_load' # Only do the first time, then comment out, please!
invoke :'rails:db_migrate'
command %{#{fetch(:rails)} db:seed} # Also, only do the first time!
invoke :'rails:assets_precompile'
invoke :'deploy:cleanup'
end
end
Что мне не нравится в этом, так это две строки, которые необходимо закомментировать после первого развертывания. Я ищу способ сделать это автоматически. До сих пор мои попытки были:
- Поместить рассматриваемые строки в задачу
setup
, но это, похоже, пока не загружает полный стек Rails (это только создание и символическая ссылка на некоторые каталоги). - Чтобы попытаться программно решить, является ли развертывание первым, или нет, но я не мог понять, как сам.
Опять я задал еще один вопрос: Как узнать, является ли это первым развертыванием (в самой команде deploy)? :
Я хотел бы выполнить некоторые команды в зависимости от того, является ли развертывание первым или нет.
В следующем псевдокоде я использую гипотетический метод first_deploy?
:
invoke :'rails:db_schema_load' if first_deploy?
...
command %{#{fetch(:rails)} db:seed} if first_deploy?
Но, опять же, никаких реакций не получено.
Кто-нибудьимеет твердое мнение на эту тему? Как бы вы сделали это с Capistrano или любым другим автоматическим развертыванием?