Развертывание приложения Rails: как загружать и заполнять БД во время самого первого развертывания? - PullRequest
1 голос
/ 14 октября 2019

В настоящее время я нахожусь в процессе рефакторинга процесса развертывания моих приложений 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

Что мне не нравится в этом, так это две строки, которые необходимо закомментировать после первого развертывания. Я ищу способ сделать это автоматически. До сих пор мои попытки были:

  1. Поместить рассматриваемые строки в задачу setup, но это, похоже, пока не загружает полный стек Rails (это только создание и символическая ссылка на некоторые каталоги).
  2. Чтобы попытаться программно решить, является ли развертывание первым, или нет, но я не мог понять, как сам.

Опять я задал еще один вопрос: Как узнать, является ли это первым развертыванием (в самой команде deploy)? :

Я хотел бы выполнить некоторые команды в зависимости от того, является ли развертывание первым или нет.

В следующем псевдокоде я использую гипотетический метод first_deploy?:

invoke :'rails:db_schema_load' if first_deploy?
...
command %{#{fetch(:rails)} db:seed} if first_deploy?

Но, опять же, никаких реакций не получено.

Кто-нибудьимеет твердое мнение на эту тему? Как бы вы сделали это с Capistrano или любым другим автоматическим развертыванием?

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