Rails 3 и Heroku: автоматически "rake db: migrate" при нажатии? - PullRequest
61 голосов
/ 11 мая 2011

У меня небольшое раздражение из-за процесса загрузки / развертывания heroku, который в остальном было радостью обнаружить и использовать.

Если я добавлю новую миграцию в свое приложение, единственный способ установить ее на сервере heroku - это нажать на пульте heroku.Это загрузит его и перезапустит приложение.Но он не запускает миграцию, поэтому мне нужно сделать heroku rake db:migrate --app myapp, затем heroku restart --app myapp.В то же время приложение не работает, поскольку оно не запустило миграцию, а код ссылается на поля / таблицы и т. Д. В процессе миграции.

Должен быть способ изменить процесс развертывания, чтобы запустить rake db:migrate автоматически как часть процесса развертывания, но я не могу решить это.

Это что-то, что я установил в Heroku Cpanel?Это вариант, который я передаю герою из командной строки?Это мерзавец?Кто-нибудь может привести меня в порядок?спасибо, макс

Ответы [ 10 ]

34 голосов
/ 11 августа 2016

Heroku теперь имеет возможность обрабатывать это как часть их функции "фазы выпуска".

Вы можете добавить процесс с именем release к вашему Procfile, который будет запускаться при каждом развертывании.

Rails> = 5 Пример

release: bundle exec rails db:migrate

Rails <5 пример </strong>

release: bundle exec rake db:migrate

32 голосов
/ 03 марта 2013

Как насчет этого простого решения для цепочки команд:

git push heroku master && heroku run rake db:migrate

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

29 голосов
/ 07 июня 2011

Вот грабли, которые упаковывают все в одну строку (и также поддерживают откат):

https://gist.github.com/362873

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

14 голосов
/ 16 августа 2013

Я создал пользовательский пакет сборки , который заставляет Heroku автоматически запускать rake db:migrate для вас при развертывании. Это просто ответвление стандартного пакета сборки Ruby от Heroku, но с добавленной задачей 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

9 голосов
/ 11 мая 2011

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

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

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

  1. Push-схема меняется на Heroku
  2. 1010 * мигрировать *
  3. Нажмите код приложения в Heroku

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

(Конечно, самым простым решением было бы просто подтолкнуть и мигрировать, пока ваш начальник на обед ;-D)

В противном случае, даже если изменения схемы были выполнены автоматически, вы все равно рискуете пройти через запрос непосредственно перед выполнением миграций.

5 голосов
/ 28 ноября 2014

Просто для тех, кто гуглит, как я, я хочу дать простое решение здесь.

Я использую Rails 4 и мне нужно было добавить простую задачу Rake в развертывание на heroku.Поскольку в github я использую кнопку «развернуть на heroku», у меня нет шансов запустить «heroku run ...» сразу после развертывания.

Что я сделал: я расширил стандартную задачу Rake 'assets: clean ', который автоматически запускается при развертывании на героку.Задача по-прежнему выполняется нормально, но я добавил свои вещи к ее концу.Это делается с помощью метода Enhancement .В приведенном ниже примере я добавляю db: migrate, потому что это, вероятно, то, чего хочет большинство людей:

# in lib/tasks/assets_clean_enhance.rake
Rake::Task['assets:clean'].enhance do
  Rake::Task['db:migrate'].invoke
end

Я признаю, что это не идеальное решение.Но герою Ruby Buildpack по-прежнему не поддерживает никакой другой способ.И написание моей собственной компоновки выглядело немного излишним для такой простой вещи.

2 голосов
/ 01 ноября 2014

Я написал SmartMigrate buildpack , который представляет собой простой сборочный пакет Heroku для предупреждения об ожидающих миграциях после сборки ruby ​​при обнаружении новых миграций.Этот сборочный пакет предназначен для использования в составе мультипакета, который имеет предыдущий сборочный пакет Ruby.

Принимая во внимание другие решения, этот сборочный пакет имеет 3 преимущества по сравнению с:

  1. Нет необходимостидля режима обслуживания
  2. Нет необходимости в устаревших вилках ruby ​​buildpack, которые просто вставляют миграцию в конце
  3. Нет необходимости запускать миграции ВСЕ ВРЕМЯ, предупреждение отображается только в том случае, если новые миграцииобнаружено с момента последнего развертывания
2 голосов
/ 11 мая 2011

Я использую задачу rake, чтобы перевести приложение в режим обслуживания, переместить, перенести и вывести его из режима обслуживания.

1 голос
/ 31 января 2014

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

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

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

Однако может быть сложно подтолкнуть ваши миграции и изменения схемы до остальной части кода, поскольку очевидный подход ('git push heroku {revnum}') полагается на то, что вы проверили миграции доостальная часть кода.

Если вы этого не сделали, все еще возможно сделать это, используя временную ветвь:

  • Создать ветку, основанную наgit revision, которую вы недавно добавили в heroku:

    git branch <branchname> <revnum-or-tag>
    
  • Проверьте эту ветку:

    git checkout <branchname>
    
  • Если ваша миграция БД фиксируетсятолько содержит миграции, и без изменений кода, cherry-pick коммиты, которые содержат изменения базы данных:

    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
    
  • Переместите эту временную ветку в 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%объединение мастера с {branchname} необходимо.Выполнение этого должно гарантировать слияние «быстрой перемотки вперед», что делает git счастливым, когда вы нажимаете на heroku, но можно получить тот же результат, просто объединяя {branchname} и master без этого шага.

Конечно, если вы не используете 'master', подставьте соответствующее название ветки в соответствующие места выше.

0 голосов
/ 19 апреля 2015

Я уже некоторое время использую камень heroku_san в качестве инструмента развертывания.Это хороший маленький, сфокусированный инструмент для push + миграции.Он добавляет некоторые другие команды rake, которые упрощают доступ к другим функциям (например, к консоли).Помимо того, что мне не нужно запоминать миграции баз данных, моя любимая функция - это файл конфигурации Heroku - так что я могу называть все свои серверы (производственные, промежуточные, plays4, shirley) как угодно - и держать их прямо в голове.

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