62 votes

Rails 3 et Heroku: automatiquement "rake db: migrate" sur push?

J'ai des ennuis avec mon push heroku/déployer des processus, qui a par ailleurs été une joie de les découvrir et les utiliser.

Si j'ajoute une nouvelle migration vers mon appli, la seule façon que je peux obtenir sur le heroku serveur est de faire un coup de pouce à la heroku à distance. Cette télécharge et de redémarrage de l'application. Mais il n'a pas d'exécuter la migration, de sorte que j'ai à faire, heroku rake db:migrate --app myapp, alors heroku restart --app myapp. Dans l'intervalle, l'application est cassé parce qu'il n'a pas exécuté les migrations et le code fait référence à des champs/tables etc dans la migration.

Il doit y avoir un moyen de changer le processus de déploiement pour exécuter l' rake db:migrate automatiquement dans le cadre du processus de déploiement, mais je ne peux pas travailler.

Est-ce quelque chose que j'ai mis dans un heroku cpanel? Est-il une option que je passe à heroku à partir de la ligne de commande? Est-il un git crochet? Quelqu'un peut-il me droite? merci, max

33voto

Cristian Points 1272

Qu'en est-il de cette solution de chaînage de commande simple:

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

Il exécutera automatiquement la migration dès que le premier se terminera avec succès. C'est typiquement 1-2 secondes de retard ou moins.

29voto

Paul A Jungwirth Points 3580

Voici une tâche de rake qui résume tout dans une ligne (et prend également en charge la restauration):

https://gist.github.com/362873

Vous risquez peut-être encore de vous installer en plus de la démo de votre patron, mais au moins vous ne perdez pas de temps à taper entre git push et rake db:migrate .

14voto

Dan Tao Points 60518

J'ai créé un custom buildpack qui obtient Heroku pour exécuter rake db:migrate pour vous automatiquement sur le déploiement. C'est juste une fourchette de Heroku par défaut de Ruby buildpack, mais avec l' rake db:migrate de la tâche ajoutée.

Pour l'utiliser avec votre application, vous feriez ceci:

heroku config:set BUILDPACK_URL=https://github.com/dtao/rake-db-migrate-buildpack

Notez également que pour que cela fonctionne, vous devez activer l' utilisateur-env-compiler Heroku Laboratoires de fonctionnalité. Voici comment faire:

heroku labs:enable user-env-compile

Et voici la preuve que cela fonctionne:

rake db:migrate on Heroku deployment

9voto

David Sulc Points 13259

Peut-être que vous pourriez essayer de séparer votre schéma s'engage (migrations, etc.) s'engage à partir du code s'engage (les modèles, les validations, etc.).

(Note de ce qui suit suppose de la migration, les modifications ne sont PAS destructeurs, comme vous l'avez indiquer couvre la plupart de vos cas d'utilisation.)

Votre processus de déploiement pourrait alors être:

  1. Pousser des modifications de schéma Heroku
  2. migrer
  3. Poussez le code de l'application à Heroku

C'est bien sûr loin de l'optimum, mais est un moyen efficace pour éviter les temps d'arrêt dans la situation que vous avez décrite: le temps de l'application de recevoir le code pour la dynamique des champs, la DB ont déjà migré.

(Bien sûr, la solution la plus simple serait tout simplement de pousser et de migrer pendant que votre patron est sorti pour déjeuner ;-D)

Sinon, même si le schéma des modifications ont été effectuées automatiquement, vous auriez toujours courir le risque d'une demande en passant par la droite avant les migrations ont été exécutés.

2voto

Aditya Sanghi Points 7754

J'utilise une tâche de rake pour mettre l'application en mode maintenance, pousser, migrer et la déplacer hors du mode maintenance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X