2011-01-31 9 views
11

Estoy usando Heroku para alojar una aplicación de Rails, lo que significa usar Git para implementarla en Heroku. Debido al "flujo de trabajo de Git puro" en Heroku, todo lo que debe ir en sentido ascendente al servidor debe configurarse de manera idéntica en mi casilla local.GIt Deployment + Configuration Files + Heroku

Sin embargo, necesito que ciertos archivos de configuración sean diferentes dependiendo de si estoy en la configuración local o desplegado en Heroku. Nuevamente, debido al método de implementación que usa Heroku, no puedo usar .gitignore y una plantilla (como he visto sugerido muchas veces, y lo he usado en otros proyectos).

Lo que necesito es que git rastree de alguna forma los cambios en un archivo, pero selectivamente le pido a git que no invalide determinados archivos cuando extrae datos de un repositorio en particular, básicamente para realizar ciertos cambios en un solo sentido.

¿Se puede hacer esto? ¡Agradecería cualquier sugerencia!

+0

¿Hacer git branches no es una opción? – freedrull

Respuesta

16

¡Puede tener las configuraciones almacenadas persistentemente EN la configuración local de cada aplicación heroku para que no tengan que estar en su código en absoluto! entonces el mismo código puede ejecutarse en múltiples sitios heroku pero con diferente configuración. Es muy simple, fácil, elegante ...

Es el enfoque que utilizamos. (Lo usamos por el MISMO ... tenemos múltiples clones de la MISMA aplicación en Heroku, pero solo queremos UNA fuente en github, en nuestro directorio local de desarrollo hacemos la PULSACIÓN a ORIGEN (github), luego cuando tenemos de la manera que nos gusta, llevamos CD al directorio local de prod, que va al MISMO repositorio de github, y SÓLO PULL de GITHUB en este directorio, nunca presione (por ejemplo, todos los empujones a github provienen de nuestro directorio de desarrollo, el directorio prod es sólo un área de ensayo para la otra aplicación heroku.)

por tener las configuraciones diferentes en los distintos sitios heroku (como se explica más adelante), los EXACT mismo código funciona tanto en sitios Heroku.

Así que nuestro flujo de trabajo es: (la clave es que ambos directorios apuntan a repo github MISMO)

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)* 

eso es todo!

Ahora aquí es cómo mantener su configuración específica del sitio vars en el sitio heroku:

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

en su línea de mando local, para cada uno de sus dos directorios locales, haces:

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

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

a ver los que usted ha definido:

$ heroku config 
FIRST_CONFIGVAR => fooheroku1 
SECOND_CONFIGVAR => barheroku1 

luego cd a su otro directorio myPRODdir y haga lo MISMO, solo configure los mismos vars de heroku remotos para fooheroku2 y barheroku2.

entonces en sus rieles aplicación que sencilla refieren a ellos de esta manera:

a = ENV['FIRST_CONFIGVAR'] 

Una aplicación va a leer 'fooheroku1' la otra aplicación leerá 'fooheroku2'

Y, por último, en su directorio local myDEVdir, donde se ejecuta en modo dEV, puso a los mismos comandos de configuración en su config/environment/development.rb presentar su versión de 'dev' de los VARs de configuración se ajustará a lo que deben ser:

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

Fácil, elegante. Gracias, Heroku!

+0

Guau, ese es un enfoque realmente muy bueno. Muchas gracias, ¡esta es una gran ayuda! – Andrew

+0

¡siéntete libre de votar si ayuda! – jpwynn

+0

¡Esto es brillante, gracias! –

5

Estas son algunas soluciones:

1) Si desea ignorar los archivos sólo en heroku, utilice slugignore

2) Si los cambios son menores, a no mojarse y utilizar archivos de configuración universales, la inserción de interruptores para el comportamiento específico del servidor

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

3) Si los cambios son importantes, escribir un archivo de configuración y add a "smudge file" a config/inicializadores para cada servidor adicional. Básicamente, tendrías archivos separados usando la técnica en (2).

4) Si sus cambios son BARRANCOS (improbables), entonces mantenga ramas separadas para cada servidor.

5) This script puede hacer exactamente lo que usted solicitó, pero puede ser exagerado.

Espero que haya sido de ayuda.

+0

Bueno, para ser más específico, el problema es que ya tengo dos ramas de las que quiero poder hacer cambios, pero una es la rama de producción (que quiero usar las configuraciones de producción) y una es una rama de prueba (que yo quiero usar las configuraciones de prueba) ... así que cada vez que actualizo la rama de prueba, tengo que regresar y asegurarme de cambiar todas las configuraciones de la prod. configuración, y viceversa, si retiro los cambios, entonces tengo que copiar las configuraciones y reemplazar las extraídas con las copias de seguridad. Es cojo ¡Gracias por las sugerencias, sin embargo! – Andrew

+0

Creo que "mancha" podría hacer que funcione, lo investigaré y, si funciona, aceptaré esta respuesta :) – Andrew