Après un long et dur mois à essayer différentes choses et à me faire mordre à chaque fois que j'ai réalisé,
juste parce que Heroku utilise un référentiel git comme mécanisme de déploiement, vous ne devriez pas le traiter comme un référentiel git
ça aurait pu être rsync tout aussi bien, ils sont allés pour git, ne vous laissez pas distraire à cause de ça
si vous le faites, vous vous exposez à toutes sortes de blessures. Toutes les solutions susmentionnées échouent lamentablement quelque part:
- il faut faire quelque chose à chaque fois, ou périodiquement, ou des choses inattendues se produisent (pousser des sous-modules, synchroniser des sous-arbres, ...)
- si vous utilisez un moteur par exemple pour modulariser votre code, Bundler vous dévorera vivant, il est impossible de décrire le degré de frustration que j'ai eu avec ce projet pendant la quête pour trouver une bonne solution pour cela
- vous essayez d'ajouter le moteur en tant que lien de repo git +
bundle deploy
- échec, vous devez regrouper la mise à jour à chaque fois
- vous essayez d'ajouter le moteur en tant qu'échec
:path
+ bundle deploy
-, l'équipe de développement considère l' :path
option comme "vous n'utilisez pas Bundler avec cette option de gemme" donc elle ne sera pas groupée pour la production
- De plus, chaque actualisation du moteur veut mettre à jour votre pile de rails -_-
- la seule solution que j'ai trouvée est d'utiliser le moteur comme
/vendor
lien symbolique dans le développement, et de copier les fichiers pour la production
La solution
L'application en question a 4 projets dans git root:
- api - selon le profil fonctionnera sur 2 hôtes heroku différents - téléchargement et api
- web - le site web
- web-old - l'ancien site Web, toujours en migration
- common - les composants communs extraits dans un moteur
Tous les projets ont un vendor/common
lien symbolique regardant la racine du common
moteur. Lors de la compilation du code source pour le déploiement sur heroku, nous devons supprimer le lien symbolique et rsync son code doit être physiquement dans le dossier du fournisseur de chaque hôte séparé.
- accepte une liste de noms d'hôte comme arguments
- exécute un git push dans votre dépôt de développement, puis exécute un git pull propre dans un dossier séparé, en s'assurant qu'aucune modification sale (non validée) n'est automatiquement transmise aux hôtes
- déploie les hôtes en parallèle - chaque repo heroku git est extrait, le nouveau code est rsynced aux bons endroits, commité avec les informations push de base dans le commentaire git commit,
- à la fin, nous envoyons un ping avec curl pour dire aux hôtes amateurs de se réveiller et de suivre les journaux pour voir si tout est allé du vin
- joue également bien avec jenkins: D (push de code automatique pour tester les serveurs après des tests réussis)
Fonctionne très très bien dans la nature avec un minimum de problèmes (non?) 6 mois maintenant
Voici le script https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Mise à jour 1
@AdamBuczynski, ce n'est jamais aussi simple.
Premièrement, vous aurez toujours au moins un environnement de production et de test - et un tas de clusters spécifiques à une fonction au pire - tout à coup, un dossier doit être mappé à des projets n heroku comme une exigence assez basique et tout doit être organisé d'une manière ou d'une autre pour que le script "sait" quelle source vous souhaitez déployer où,
Deuxièmement, vous voudrez partager du code entre les projets - vient maintenant la sync_common
partie, les manigances avec des liens symboliques en développement étant remplacées par du code rsynced réel sur Heroku parce que Heroku nécessite une certaine structure de dossiers et un bundler et des rubygems vraiment vraiment vraiment vraiment les choses très moche si vous veulent extraire les fils communs dans une gemme
Troisièmement, vous voudrez brancher CI et cela changera un peu la façon dont les sous-dossiers et git repo doivent être organisés, à la fin, dans le cas d'utilisation le plus simple possible, vous vous retrouverez avec l'essentiel susmentionné.
Dans d'autres projets, j'ai besoin de brancher des versions Java, lors de la vente de logiciels à plusieurs clients, vous devrez filtrer les modules qui seront installés en fonction des exigences d'installation et autres,
Je devrais vraiment envisager d'explorer le regroupement de choses dans un Rakefile ou quelque chose comme ça et tout faire de cette façon ...