Google App Engine: Ruby on Rails - автоматически выполнять миграцию - PullRequest
1 голос
/ 13 июня 2019

Мне было интересно, можно ли было запускать миграции автоматически во время развертывания с помощью Google App Engine. Некоторое время я использовал AWS Elasticbeanstalk, и они запускались автоматически, но сейчас я планирую перейти на Google App Engine для моих будущих проектов.

Сейчас я должен запустить эту команду вручную:

bundle exec rake appengine:exec -- bundle exec rake db:migrate GAE_CONFIG=app.yml

Спасибо

1 Ответ

5 голосов
/ 18 июня 2019

ПРЕДУПРЕЖДЕНИЕ: Как обсуждалось в комментариях, при переносе выполняется условие гонки, если развертывание выполняется на нескольких контейнерах параллельно, поскольку оно попытается запустить миграцию на всех контейнерах.Решение обсуждается в комментариях, я буду обновлять этот ответ, когда мы приземлимся на что-нибудь.

Отказ от ответственности: Этот ответ не совсем то, что было запрошено, но он решает ту же проблему, и он работает,И из того, что я могу сказать из вопроса, делать это с некоторыми настройками appengine не обязательно, скорее он просто хочет, чтобы миграции запускались автоматически.

Я более подробно остановлюсь на своем комментарии к вопросу, вот кое-что, что я попробовали это работает.Я твердо верю в ПОЦЕЛУЙ (пусть будет просто и глупо) .Таким образом, вместо того, чтобы пытаться выяснить appengine (который я никогда не использовал в любом случае), я бы выбрал общий подход.То есть подключить к процессу загрузки сервера rails и инициировать миграцию.Для этого у нас есть несколько подходов.

С моим пониманием appengine и предложением этой официальной ссылки на документ appengine содержит файл app.yaml, в этом файле есть запись вроде :

entrypoint: rails server

Таким образом, мы будем использовать эту точку входа для подключения нашего кода для запуска миграций перед запуском сервера.Для этого я сделал это:

  1. Создайте новый файл в каталоге bin, я назвал его rails_with_migrations.sh Вы можете назвать его как угодно.
  2. Дайте ему разрешения на выполнение с chmod +x bin/rails_with_migrations.sh
  3. Вставьте в него этот код:
#!/bin/bash
bundle exec rake db:migrate
bundle exec rails $@

Конечно, вы можете дать все, что вы хотите дать RAILS_ENVэто.

Теперь в app.yaml в секции entrypoint вместо rails server укажите bin/rails_with_migrations.sh server и оно должно быть.Он работал на локальном, должен работать везде.

ПРИМЕЧАНИЕ: В entrypoint: у меня есть bin/rails_with_migrations.sh server здесь, сервер - это параметр команды rails, вы можете передать столько параметров, скольковам нравится все это будет передано команде rails server с магией $@.Он позволяет вам передавать порт и любые другие параметры, которые вам могут потребоваться для вашей среды.Также он позволяет вам запускать rails console локально с bin/rails_with_migrations.sh console, что также приведет к запуску миграций.

UPDATE1: В соответствии с комментарием я проверил, что произойдет, если миграция завершится неудачно, ион запускает сервер, даже если миграция не удалась.Конечно, мы можем изменить это поведение в нашем sh файле.

UPDATE2: Shell-скрипт с обработкой кода ошибки миграции будет выглядеть примерно так:

#!/bin/bash
bundle exec rake db:migrate
if [ $? -eq 0 ]
then
  bundle exec rails $@
else
  echo "Failure: migrations failed, please check application logs for more details." >&2
  exit 1
fi

Это обновление предотвратит запуск сервера и вызовет ненулевой код выхода из скрипта, который должен указывать на сбой этой команды.

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