2011-01-31 3 views
11

J'utilise Heroku pour héberger une application Rails, ce qui signifie que je dois utiliser Git pour déployer sur Heroku. En raison du "workflow Git pur" sur Heroku, tout ce qui doit aller en amont vers le serveur doit être configuré de manière identique sur ma boîte locale.Déploiement GI + fichiers de configuration + Heroku

Cependant, j'ai besoin que certains fichiers de configuration soient différents selon que je suis dans la configuration locale ou déployé sur Heroku. Encore une fois, à cause de la méthode de déploiement qu'utilise Heroku, je ne peux pas utiliser .gitignore et un template (comme je l'ai vu plusieurs fois, et utilisé dans d'autres projets). Ce dont j'ai besoin, c'est que git puisse en quelque sorte suivre les changements sur un fichier, mais disons simplement à git de ne pas surcharger certains fichiers lorsque vous utilisez un repo particulier - pour effectuer certains changements uniquement dans un sens.

Est-ce que cela peut être fait? J'apprécierais toutes les suggestions!

+0

Est-ce que faire des branches git n'est pas une option? – freedrull

Répondre

16

Vous pouvez avoir des vars config stockés de manière persistante sur la configuration locale de chaque application heroku afin qu'ils ne soient pas du tout dans votre code! donc le même code peut fonctionner sur plusieurs sites heroku mais avec une configuration différente. C'est très simple, facile, élégant ...

C'est l'approche que nous avons utilisée. (Nous l'avons utilisé pour la MÊME chose ... nous avons plusieurs clones de l'application SAME chez Heroku, mais nous voulons seulement une source à github, dans notre répertoire local dev nous faisons le PUSH to ORIGIN (github), puis quand nous avons comme nous l'aimons, nous CD au répertoire local de prod, qui va au MÊME dépôt github, et nous seulement PULL de GITHUB dans ce répertoire, ne poussez jamais (par exemple, tous les pousse à github viennent de notre répertoire de développement, le répertoire prod est juste une zone de transit pour l'autre application Heroku.)

par ayant les différentes configs sur les différents sites Heroku (comme expliqué ci-dessous), les EXACT même code travaux sur les deux sites Heroku.

Donc, notre flux de travail est la suivante: (la clé est que les deux répertoires pointent Repo MÊME github)

cd myDEVdir 
*....develop away....* 
git add . 
git commit -am "another day, another push" 
git push origin *(to our SINGLE github repo)* 
git push heroku *(test it out on heroku #1)* 

cd ../myPRODdir 
git pull   *(grabs SAME code as used on other site *) 
git push heroku *(now the SAME code runs on Heroku #2)* 

c'est tout!

Maintenant, voici comment vous gardez votre configuration spécifique au site vars sur le site Heroku:

http://docs.heroku.com/config-vars

sur votre ligne de commande locale, pour chacun de vos deux répertoires locaux, faites:

$ heroku config:add FIRST_CONFIGVAR=fooheroku1 
Adding config vars: 
    FIRST_CONFIGVAR => fooheroku1 

$ heroku config:add SECOND_CONFIGVAR=barheroku1 
Adding config vars: 
    SECOND_CONFIGVAR => barheroku1 

pour voir ceux que vous avez défini:

$ heroku config 
FIRST_CONFIGVAR => fooheroku1 
SECOND_CONFIGVAR => barheroku1 

puis cd dans votre autre répertoire myPRODdir et faites la même chose, ne définissez que les mêmes variables distantes heroku sur fooheroku2 et barheroku2.

puis dans vos rails vous application simple référence à eux comme si:

a = ENV['FIRST_CONFIGVAR'] 

Une application va lire « fooheroku1 » l'autre application va lire « fooheroku2 »

Et enfin, sur votre répertoire local myDEVdir, où vous exécutez en mode dEV, mettre les mêmes commandes de configuration dans votre fichier config/environment/development.rb votre version « dev » des vars de configuration sera réglé sur ce qu'ils devraient être:

ENV['FIRST_CONFIGVAR'] = "foodev" 
ENV['SECOND_CONFIGVAR'] = "bardev" 

Facile, élégant. Merci, Heroku!

+0

Wow, c'est une approche * vraiment * bonne. Merci beaucoup, c'est une aide énorme !! – Andrew

+0

ne hésitez pas à voter pour cela si cela a aidé! – jpwynn

+0

C'est génial, merci! –

5

Voici quelques solutions:

1) Si vous voulez ignorer les fichiers uniquement sur Heroku, utilisez slugignore

2) Si vos modifications sont mineures, rester au sec et utiliser les fichiers de configuration universels, l'insertion de commutateurs pour un comportement spécifique au serveur

if Rails.env == "production" 
    #production server code 
elsif Rails.env == "development" 
    #development server code 
else 
    #test server code 
end 

3) Si vos changements sont majeurs, écrire un fichier de configuration et add a "smudge file" config/initialisations pour chaque serveur supplémentaire. Fondamentalement, vous auriez des fichiers séparés en utilisant la technique dans (2).

4) Si vos modifications sont en BALAYAGE (improbable), maintenez des branches séparées pour chaque serveur.

5) This script peut faire exactement ce que vous avez demandé, mais peut être exagéré.

je l'espère, qui a aidé.

+0

Eh bien, pour être plus précis le problème est que j'ai déjà deux branches que je veux pouvoir modifier, mais l'une est la branche de production (dont je veux utiliser les configs de production) et l'autre est une branche test (que je Je veux utiliser les configs de test) ... donc à chaque fois que je mettrai à jour la branche de test, je dois revenir en arrière et m'assurer de changer toutes les configs de la prod. paramètres, et vice versa si je tire des changements en arrière puis je dois copier les configs et remplacer les tirées avec les copies de sauvegarde. C'est boiteux. Merci pour les suggestions, cependant! – Andrew

+0

Je pense que "smudge" pourrait le faire fonctionner, je vais regarder dans cela et si cela fonctionne, je vais accepter cette réponse :) – Andrew