Узнайте, нужна ли миграция на Heroku - PullRequest
0 голосов
/ 25 октября 2019

Я хочу автоматически определить, нужно ли мне запускать heroku run rake db:migration после развертывания новой версии. Если я нахожу, что миграция не требуется, тогда нет необходимости переводить работающий сайт в режим обслуживания.

Одним из подходов будет файл сценария ruby, который будет запускать system("run rake db:version") для поиска текущей версии, а затем проверьтеотметка времени в файлах в db/migrate, чтобы найти последнюю версию и выполнить db:migrate, если текущая версия старше, чем самая последняя отметка времени в каталоге db/migrate.

Однако это выглядит хрупко,Есть ли более надежный способ?

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Еще лучше, почему бы не запустить rake db:migrate как часть вашего развертывания конвейера? Если нет миграций для применения, это ничего не повредит, и если они есть, они будут применены автоматически. В качестве бонуса, если миграция не удалась, все развертывание завершится неудачей.

Для этого добавьте release фазовое задание к вашему Procfile, например,

release: rake db:migrate
web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}

Зафиксируйте и разверните как обычно. Вы должны увидеть, что rake db:migrate автоматически запускается в выводе развертывания.

1 голос
/ 25 октября 2019

Исходя из этих вопросов и ответов , похоже, что вы должны быть в состоянии сделать что-то вроде:

rails db:migrate:status
0 голосов
/ 12 ноября 2019

Мой текущий подход заключается в том, чтобы скрипт проверял, синхронизирована ли удаленная база данных с выпуском, который вот-вот будет выдвинут, используя метод versions_check, описанный ниже. Если удаленная версия синхронизирована, нажмите новую версию, не переводя ее в режим обслуживания. Если он не синхронизирован, запустите режим обслуживания, создайте резервную копию базы данных, отправьте новую версию, выполните миграции, а затем выйдите из режима обслуживания. Также опубликуйте временное предупреждение всем пользователям о начале обслуживания.

require 'ostruct'   
def versions_check(remote: 'production')
      last_migration = Dir['db/migrate/*'].sort.last
      version = last_migration.gsub('db/migrate/','').split('_').first
      remote_migration = `heroku run rake db:version -r #{remote}`
      remote_version = remote_migration.split(' ').last
      OpenStruct.new(ok?: (version == remote_version), version: version, remote_version: version)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...