2009-09-28 10 views
28

¿Cuál es una buena estrategia de implementación para usar con Git + Heroku (Ruby on Rails)?¿Implementación de Good Git usando la estrategia de sucursales con Heroku?

Actualmente la forma en que trabajo con mi repositorio Git de origen: todas las características (o "historias") se comprueban primero como ramas, luego se fusionan con el maestro y se envían al origen.

Cualquier cosa que se envíe al origen/maestro desencadena un script que extrae el nuevo código de raíles al área de ensayo (servidor web simple de raíles).

Cuando llegue el momento de impulsar una nueva versión de producción a Heroku, ¿debería crear una nueva rama (llamada algo así como production_version_121) y llevarla de alguna manera a Heroku?

Idealmente, me gustaría elegir y elegir qué características de las versiones de desarrollo anteriores debería incluir en la rama de producción ... pruébelo, y presione a Heroku.

Por ejemplo, es posible que no desee que todo el último código pase a producción. Es posible que desee la función "a" en la que trabajé e incluir "c" fusionada en producción de alguna manera, sin incluir la función experimental "b" que necesita más depuración.

N.B. Voy a tratar de evitar Capistrano al principio y obtener algo que funcione manualmente por el momento.

¿Pensamientos? ¿Mejores prácticas?

Respuesta

32

En el proyecto Gemcutter simplemente tenemos una rama production.Cualquier cambio que queremos ver en el sitio de producción quedan fusionadas en esa rama, y ​​luego se despliegan con:

git push heroku production:master 

La rama staging sirve a un propósito similar para el sitio de ensayo (también en Heroku)

+0

Gracias David! Tenía curiosidad si alguien lo estaba haciendo de esa manera. Correcto, estoy usando mi control remoto "maestro" como producción ... así que para implementar simplemente sigo haciendo: git push heroku (cuando llegue el momento) El problema es que todavía no tengo las características que quiero para elegir y elegir incluir en una implementación de producción todavía ... Espero que surja la necesidad, en cuyo caso tendré que iniciar una rama legítima de "producción" en mi servidor remoto de git. La próxima vez que lo intente con: producción de git push heroku: maestro, supongo que se quejará y tendré que usar la bandera de "fuerza" para que heroku arroje lo que está rastreando. – Zaqintosh

+0

Mi única otra pregunta es, ¿está utilizando su control remoto maestro para algo? ¿O trabajas en sucursales y despliegas/fusionas hacia/desde sucursales el 100% del tiempo? – Zaqintosh

+0

Si debe o no forzar dependerá de si "producción" es un descendiente directo de lo que existe actualmente en el maestro remoto. Gemcutter utiliza la rama "principal" como troncal. Es donde van todos los últimos cambios. Las ramas de características se crean, luego se fusionan nuevamente en el tronco. En ocasiones, las transferencias de cometidos o entidades individuales se fusionan en la rama de producción, a veces el maestro se fusiona directamente si lo queremos todo. –

7

Hay una variedad de maneras de hacerlo, y realmente depende de su preferencia.

Te daré una posible estrategia: dado que ya tienes una configuración automática de etapas que utiliza master, te sugiero que crees una rama de 'producción'. Cuando desee promover una corrección/función a la producción, simplemente fusionaría la rama de tema en su rama de 'producción'.

git checkout production 
git pull . my-topic-branch 
(resolve any conflicts) 

Cuando esté listo para realmente empuje ese código en el servidor de producción, debe tag la rama usando un nombre único (probablemente con una marca de tiempo). Luego simplemente empuja la rama de producción a Heroku.

git checkout production 
git tag release-200910201249 

me gustaría sugerir la creación de un script o git alias para automatizar el etiquetado de las marcas de tiempo, ya que el uso de un esquema de nomenclatura coherente es importante. Utilizo algo como esto:

git config alias.dtag '!git tag release-`date "+%Y%m%d%H%M"`' 

que me permite no sólo tiene que escribir git dtag cuando quiero etiquetar un comunicado con una marca de tiempo.

Puede ver sus etiquetas usando git tag y verlas usando git show release-1234. Para obtener más información sobre las etiquetas, ejecute git help tag. También puede encontrar este Github guide en etiquetado útil. También recomendaría leer los flujos de trabajo de otras personas (aquí está a nice writeup) y escoger y elegir lo que funciona para usted.

+0

Gracias por la respuesta! No estoy muy familiarizado con el etiquetado o lo que realmente hace ... aunque entiendo (en su mayoría) cuál es su consejo, sería genial tener un pequeño ejemplo o un recorrido del proceso a través de los comandos de git. ¡Gracias de nuevo! – Zaqintosh

+0

He agregado comandos para etiquetar y un práctico alias que he usado en el pasado. Tenga en cuenta que estos son para un repositorio local. Puede insertar etiquetas en otro repositorio usando 'git push - tags'. –

+0

Así que digamos que presionas un lanzamiento-xxxxxxxxx (usando 'git push heroku production: master') y eso funciona. ¿Cómo retrocede a la última revisión conocida? En otras palabras, ¿cómo presionas una etiqueta específica? – brittohalloran

16

Alguna vez desde que leí el A successful Git branching model de Vincent Driessen, me enganché. Toda mi compañía (8 de nosotros) ya se ha estandarizado en este modelo y algunos otros lugares con los que he consultado también comenzaron a usarlo.

La mayoría de las personas a las que les he mostrado dicen que ya estaban haciendo algo similar y les resulta muy fácil adaptarse.

En pocas palabras, usted tiene 2 ramas que son permanentes (maestro y desarrollar). La mayoría de las veces solo harás que las ramas se desarrollen y se fusionen para desarrollarse. Las cosas se ponen un poco más complejas cuando empiezas a hacer lanzamientos de producción y revisiones, pero después de leer la publicación un par de veces, se vuelve incrustada.

Incluso hay una herramienta de línea de comandos llamada git-flow para ayudarte.

Cuestiones relacionadas