Instancia de ensayo en Heroku

85

Me gustaría poder enviar código dev.myapp.compara probar y luego www.myapp.compara uso en producción. ¿Es esto posible con Heroku?

Tom Lehman
fuente

Respuestas:

142

Su interfaz con Heroku es esencialmente una rama de Git. La gema Heroku hace un trabajo a través de su API, pero dentro de su repositorio Git, es solo una nueva rama remota.

heroku create yourapp # production
git br -D heroku # delete the default branch

heroku create staging-yourapp # staging
git br -D heroku # delete the default branch

Una vez que haya configurado múltiples aplicaciones en Heroku, debería poder configurar su repositorio Git de esta manera:

git remote add staging [email protected]:staging-yourapp.git
git push origin staging

git remote add production [email protected]:yourapp.git
git push origin production

Normalmente trabajo en una rama "en funcionamiento" y uso Github como maestro.

Suponiendo que ese sea su caso, su flujo de trabajo de implementación probablemente se vería así:

git co -b working
# do some work

# push to github:
git co master
git merge working
git push

# push to staging:
git co staging
git merge master
git push origin staging

# push to production
git co production
git merge master
git push origin production
Luke Bayes
fuente
Gracias, esto tiene algo de sentido (soy una mierda). Pregunta: Suponga que estoy trabajando en algunos cambios de vanguardia en el "borde" de la rama. ¿Cómo puedo enviar esa rama a staging-myapp sin afectar a myapp (que actualmente se está ejecutando en la rama maestra)? ¿Tiene git push staging edge work?
Tom Lehman
Con el interés de ponerte en marcha, simplemente fusiona el borde con tu rama de preparación y lo empuja. Su rama de producción está separada y limpia. Siempre puede bifurcarlo y realizar cambios que solo se fusionan allí.
Luke Bayes
5
En lugar de crear aplicaciones con la rama remota predeterminada 'heroku' y después de eliminarla, puede usar una solución mucho más agradable como:heroku create yourapp --remote your-remote
dombesz
2
Una vez que haya configurado esto, todos sus herokucomandos deben incluir --app stagingo --app production. ¿Hay alguna forma de establecer un valor predeterminado? (Preguntar como comentario porque esto parece demasiado específico para ser una pregunta SO completa.)
Paul A Jungwirth
3
@PaulAJungwirth Para configurar una aplicación Heroku predeterminada, use algo como "git config heroku.remote staging". Más información en los documentos de Heroku en devcenter.heroku.com/articles/multiple-environments .
Grifaton
10

Una parte clave de la pregunta original es vincular la aplicación de ensayo a un subdominio (dev.myapp.com) de la aplicación principal (www.myapp.com). Esto no se ha abordado en ninguna de las respuestas.

Paso 1: Configure las versiones de producción ('myapp') y de ensayo ('staging-myapp') de su aplicación como se indica en la respuesta de Luke Bayes

Paso 2: En su sistema de administración de dominio (por ejemplo, GoDaddy):

Create a CNAME record:  dev.myapp.com 
that points to:   proxy.heroku.com

Paso 3: Configure Heroku para enrutar dev.myapp.com a staging-myapp:

heroku domains:add dev.myapp.com --app staging-myapp

Una vez que el registro CNAME haya tenido tiempo de propagarse, podrá ejecutar su aplicación de ensayo en dev.myapp.com.

Don Leatham
fuente
1
¿Qué tal el control de acceso para que no aparezca en Google, etc. y la gente no se tropiece con él y piense que es real? alguna buena solución?
brittohalloran
Sí, la forma más fácil es omitir el paso de GoDaddy y acceder a la versión "dev" de su aplicación directamente desde el dominio de Heroku usando la URL de Heroku. (p . ej ., stormy-lake-5483.heroku.com. ) Sin embargo, si desea tener "dev" fuera de su dominio como se describe aquí, siempre puede instalar un archivo robots.txt para informar a google, bing, et. Alabama. para no indexar su sitio de desarrollo. Eso ayudará a mantenerlo fuera de los motores de búsqueda.
Don Leatham
Terminé agregando un before_filtergancho a mi application_controllerpara atrapar TODO en la puesta en escena y forzar al usuario a iniciar sesión como administrador, luego configuré una cookie de administrador para poder ver la aplicación desde el punto de vista de un 'no administrador'. Trabajando bastante bien para mí.
brittohalloran
8

Deberías comprobar el heroku_san

Hace un buen trabajo haciendo malabares con los entornos de heroku.

jlfenaux
fuente
7

Las cosas son más fáciles ahora. Así es como se hace ...

Crea una aplicación para cada entorno

$ heroku create myapp --remote production
$ heroku create myapp-staging --remote staging

Esto creará repositorios remotos con nombre para cada aplicación, que puede ver en .git/config.

Ahora puede usar los interruptores --app o --remote para apuntar a una aplicación en particular:

$ heroku info --app myapp-staging
$ heroku info --remote staging

Establecer entornos de Rails

Para las aplicaciones Rails, Heroku utiliza el entorno de "producción" de forma predeterminada . Si desea que su aplicación de prueba se ejecute en un entorno de prueba , cree el entorno en su proyecto y configure las variables de entorno RAILS_ENV y RAKE_ENV correspondientes en la aplicación:

$ heroku config:set RACK_ENV=staging RAILS_ENV=staging --remote staging

Configurar entornos

Si tiene otras variables de configuración, deberá pasarlas también para cada entorno.

$ heroku config:set AWS_KEY=abc --remote staging
$ heroku config:set AWD_SECRET=123 --remote staging
...etc

Sin embargo, eso es un gran dolor, así que solo uso mi gema snappconfig y ejecuto

$ rake heroku:config:load[myapp-staging]

para cargar los archivos de configuración YAML de mi proyecto en Heroku.

Desplegar

Ahora simplemente empuja a Heroku de esta manera:

$ git push staging master
$ git push production master

y migrar así:

$ heroku run rake db:migrate --remote staging
$ heroku run rake db:migrate --remote production

(Consulte Gestión de varios entornos para una aplicación | Centro de desarrollo de Heroku para obtener más información y accesos directos).

Yarin
fuente
Heroku desaconseja configurar RAILS_ENVy RACK_ENVto staging: "Puede ser tentador crear otro entorno personalizado como" staging "y crear un config / environment / staging.rb e implementarlo en una aplicación Heroku con RAILS_ENV = staging. Esta no es una buena práctica . En su lugar, recomendamos ejecutar siempre en modo de producción y modificar cualquier comportamiento estableciendo sus variables de configuración ". Más sobre esto aquí: devcenter.heroku.com/articles/…
Koen.
@ Koen- Tratar de administrar configuraciones complejas de Rails sin el contexto de los entornos es totalmente impráctico en mi experiencia, ya sea en Heroku o de otra manera. Si tiene un conjunto completo de cadenas de conexión, claves de API, etc. para su aplicación de ensayo y otro para su aplicación de producción, ¿realmente va a establecer esas variables de configuración individualmente para cada una? Eso es solo buscar problemas, Heroku está dando un mal consejo aquí.
Yarin
Gracias. Estoy buscando una puesta en escena que realmente obtenga una URL real, probablemente con commithash. Creo que esto es algo que Zeit Now o Netlify facilitaron.
Encuesta