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 из командной строки? Это ГИТ крюк? Кто - нибудь может меня поправить? спасибо, Макс

594   10  

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

и вот мои доказательства, что это работает:

rake db:migrate on Heroku deployment

возможно, вы могли бы попробовать разделить ваши коммиты схемы (миграции и т. д.) коммиты из кода коммиты (модели, проверки и т. д.).

(обратите внимание, что ниже предполагается, что ваши изменения миграции не являются разрушительными, поскольку вы указали, что они охватывают большинство ваших вариантов использования.)

ваш процесс развертывания может быть:

  1. нажмите изменения схемы в Heroku
  2. migrate
  3. нажмите код приложения к 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 преимущества перед теми:

  1. нет необходимости в режим обслуживания
  2. нет необходимости в устаревших вилках ruby buildpack, которые просто вставляют миграция в конце
  3. нет необходимости запускать миграции все время, предупреждение отображается только в том случае, если новые миграции обнаружены с момента последнего развертывания

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

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

как он заявил, Это требует, чтобы миграции БД были неразрушающими.

однако, может быть трудно подтолкнуть ваши миграции и изменения схемы до остальной части кода, как очевидный подход ('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 commit
    
  • Push эта временная ветвь к 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

    Ничего не найдено.