ПРЕДУПРЕЖДЕНИЕ: Как обсуждалось в комментариях, при переносе выполняется условие гонки, если развертывание выполняется на нескольких контейнерах параллельно, поскольку оно попытается запустить миграцию на всех контейнерах.Решение обсуждается в комментариях, я буду обновлять этот ответ, когда мы приземлимся на что-нибудь.
Отказ от ответственности: Этот ответ не совсем то, что было запрошено, но он решает ту же проблему, и он работает,И из того, что я могу сказать из вопроса, делать это с некоторыми настройками appengine не обязательно, скорее он просто хочет, чтобы миграции запускались автоматически.
Я более подробно остановлюсь на своем комментарии к вопросу, вот кое-что, что я попробовали это работает.Я твердо верю в ПОЦЕЛУЙ (пусть будет просто и глупо) .Таким образом, вместо того, чтобы пытаться выяснить appengine (который я никогда не использовал в любом случае), я бы выбрал общий подход.То есть подключить к процессу загрузки сервера rails и инициировать миграцию.Для этого у нас есть несколько подходов.
С моим пониманием appengine и предложением этой официальной ссылки на документ appengine содержит файл app.yaml
, в этом файле есть запись вроде :
entrypoint: rails server
Таким образом, мы будем использовать эту точку входа для подключения нашего кода для запуска миграций перед запуском сервера.Для этого я сделал это:
- Создайте новый файл в каталоге
bin
, я назвал его rails_with_migrations.sh
Вы можете назвать его как угодно. - Дайте ему разрешения на выполнение с
chmod +x bin/rails_with_migrations.sh
- Вставьте в него этот код:
#!/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
Это обновление предотвратит запуск сервера и вызовет ненулевой код выхода из скрипта, который должен указывать на сбой этой команды.