Rails 3 и Heroku: автоматически "rake db:migrate" на push?
у меня есть небольшое раздражение с моим heroku push/deploy process, который в противном случае был радостью обнаружить и использовать.
Если я добавлю новую миграцию в свое приложение, единственный способ, которым я могу получить его на сервер heroku, - это нажать на пульт heroku. Это загружает его и перезапускает приложение. Но он не запускает миграцию, поэтому я должен сделать heroku rake db:migrate --app myapp, потом heroku restart --app myapp. В то же время приложение не работает, потому что оно не запускает миграции, и код ссылается на полей/таблиц и т. д. В миграции.
должен быть способ изменить процесс развертывания для запуска rake db:migrate автоматически как часть процесса развертывания, но я не могу разобраться.
Это то, что я установил в cpanel heroku? Это вариант, который я передаю heroku из командной строки? Это ГИТ крюк? Кто - нибудь может меня поправить? спасибо, Макс
10 ответов:
вот грабли задача, которая оборачивает все в один лайнер (а также поддерживает откат):
https://gist.github.com/362873
вы все еще можете завершить развертывание поверх демо вашего босса, но по крайней мере вы не тратите время на ввод между
git pushиrake db:migrate.
Как насчет этого простого решения для цепочки команд:
git push heroku master && heroku run rake db:migrateон автоматически запустит миграцию, как только первый завершится успешно. Это типично 1-2 секунд задержки или меньше.
Heroku теперь имеет возможность обрабатывать это как часть их функции "фазы выпуска".
вы можете добавить процесс под названием
releaseнаProcfileи это будет выполняться во время каждого развертывания.Рельсы >= 5 Пример
release: bundle exec rails db:migrateрельсы
release: bundle exec rake db:migrate
Я создал пользовательский buildpack это заставляет Героку бежать
rake db:migrateдля вас автоматически при развертывании. Это просто форк Руби по умолчанию в Heroku buildpack-пакет, но сrake db:migrateзадач добавил.чтобы использовать его с вашим приложением, вы могли бы сделать это:
heroku config:set BUILDPACK_URL=https://github.com/dtao/rake-db-migrate-buildpackТакже обратите внимание, что для того, чтобы он работал, вам нужно включить user-env-compile Heroku Labs особенность. Вот как вы это делаете:
heroku labs:enable user-env-compileи вот мои доказательства, что это работает:
возможно, вы могли бы попробовать разделить ваши коммиты схемы (миграции и т. д.) коммиты из кода коммиты (модели, проверки и т. д.).
(обратите внимание, что ниже предполагается, что ваши изменения миграции не являются разрушительными, поскольку вы указали, что они охватывают большинство ваших вариантов использования.)
ваш процесс развертывания может быть:
- нажмите изменения схемы в Heroku
- migrate
- нажмите код приложения к Heroku
Это конечно, форма far оптимальна, но это эффективный способ избежать простоя в описанной вами ситуации: к тому времени, когда приложение получит код для динамических полей, БД уже будет перенесена.
(конечно, самым простым решением было бы просто нажать и мигрировать, пока ваш босс выходит на обед ; - D)
в противном случае, даже если изменения схемы были выполнены автоматически, вы все равно рискуете получить запрос, проходящий прямо перед миграцией была запущена.
только для тех людей, которые гуглят, как я, я хочу дать простое решение здесь.
Я использую Rails 4 и должен был добавить простую задачу рейка к развертыванию в heroku. Поскольку я использую кнопку " развернуть в heroku "в github, нет возможности запустить" heroku run ..."сразу после развертывания.
что я сделал: я расширена стандартная задача рейка 'assets: clean' это автоматически запускается во время развертывания в heroku. Задача по-прежнему работает нормально, но Я прикрепил свои собственные вещи к его концу. Это делается с помощью 'enhance' метод. В приведенном ниже примере я добавляю db: migrate, потому что это, вероятно, то, что большинство людей хотят:
# in lib/tasks/assets_clean_enhance.rake Rake::Task['assets:clean'].enhance do Rake::Task['db:migrate'].invoke endЯ признаю, что это не идеальное решение. Но в Heroku buildpack-пакет Руби по-прежнему не поддерживает любым другим способом. И написание моего собственного buildback казалось немного излишним для такой простой вещи.
Я использую задачу rake, чтобы перевести приложение в режим обслуживания, нажать, перенести и переместить его из режима обслуживания.
Я писал SmartMigrate buildpack который представляет собой простой Heroku buildpack для предупреждения ожидающих миграций после сборки ruby всякий раз, когда обнаруживаются новые миграции. Этот buildpack предназначен для того, чтобы быть частью Мультипака, который имеет предыдущий Ruby buildpack.
при должном уважении к другим решениям здесь, этот buildpack имеет 3 преимущества перед теми:
- нет необходимости в режим обслуживания
- нет необходимости в устаревших вилках ruby buildpack, которые просто вставляют миграция в конце
- нет необходимости запускать миграции все время, предупреждение отображается только в том случае, если новые миграции обнаружены с момента последнего развертывания
Я думаю, что подход Дэвида Сулька является единственным, который гарантирует, что вы избегаете запросов, проходящих в то время как приложение находится в сломанном состоянии.
это немного больно, но может быть необходимо в некоторых обстоятельствах.
как он заявил, Это требует, чтобы миграции БД были неразрушающими.
однако, может быть трудно подтолкнуть ваши миграции и изменения схемы до остальной части кода, как очевидный подход ('git push heroku {revnum}') полагается на то, что вы проверили миграции перед остальной частью кода.
если вы еще не сделали этого, это все еще можно сделать с помощью временной ветви:
создайте ветку, основанную на ревизии git, которую вы совсем недавно нажали на heroku:
git branch <branchname> <revnum-or-tag>проверьте эту ветку:
git checkout <branchname>если ваша миграция БД фиксирует только содержащиеся миграции, и никаких изменений кода, выбирать коммиты, которые содержат изменения в базе:
git cherry-pick <revnum1> <revnum2>...если вы ввели изменения БД в ревизиях, которые также содержали изменения кода, Вы можете использовать "git cherry-pick-n", который не будет автоматически фиксироваться; используйте "git reset HEAD", чтобы удалить файлы, которые не являются изменениями БД из набора вещей, которые будут введены. Как только вы получите только изменения БД, зафиксируйте их во временной ветке.
git cherry-pick -n <revnum1> <revnum2>... git reset HEAD <everything that's modified except db/> git status ... check that everything looks ok ... git commitPush эта временная ветвь к heroku (в идеале к промежуточному приложению, чтобы проверить, что у вас все правильно, так как во избежание простоя весь смысл прыгать через эти обручи)
git push heroku <branchname>:masterвыполнить миграцию
heroku run rake db:migrateв этот момент Вы можете подумать, что вы можете просто нажать "master" на heroku, чтобы получить изменения кода. Однако вы не можете, так как это не быстрое слияние. Способ продолжить-объединить оставшуюся часть "master" во временную ветвь, а затем объединить его обратно в master, который рекомбинирует истории фиксации двух ветвей:
git checkout <branchname> git merge master git diff <branchname> master ... shouldn't show any differences, but just check to be careful ... git checkout master git merge <branchname>теперь вы можете нажать master на heroku как обычно, что приведет к изменению остальной части вашего кода.
на предпоследнем шаге я не уверен на 100%, необходимо ли слияние master to {branchname}. Делая это таким образом, следует убедиться, что слияние "быстрой перемотки вперед" выполнено, что делает git счастливым, когда вы нажимаете для heroku, но можно было бы получить тот же результат, просто объединив {branchname}, чтобы освоить без этого шага.
конечно, если вы не используете "master", замените соответствующее имя ветви в соответствующих местах выше.
Я использую heroku_san gem как мой инструмент развертывания на некоторое время. Это хороший небольшой, целенаправленный инструмент для push + миграции. Он добавляет некоторые другие команды rake, которые облегчают доступ к другим функциям (например, консоли). Помимо того, что мне не нужно запоминать миграции баз данных, моя любимая функция – это файл конфигурации Heroku, поэтому я могу назвать все свои серверы (производство, постановка, playground4, shirley) все, что захочу, и держать их прямо в голове.

Comments