Después de un largo y duro mes de probar cosas diferentes y ser mordido cada vez que me di cuenta,
solo porque Heroku usa un repositorio git como mecanismo de implementación, no debe tratarlo como un repositorio git
podría haber sido rsync igual de bien, fueron por git, no te distraigas por esto
si lo hace, se abre a todo tipo de heridas. Todas las soluciones mencionadas fallan miserablemente en alguna parte:
- requiere que se haga algo cada vez, o periódicamente, o suceden cosas inesperadas (empujar submódulos, sincronizar subárboles, ...)
- si usa un motor, por ejemplo, para modularizar su código, Bundler lo comerá vivo, es imposible describir la cantidad de frustración que he tenido con ese proyecto durante la búsqueda para encontrar una buena solución para esto
- intenta agregar el motor como enlace de repositorio de git +
bundle deploy
- falla, necesita actualizar el paquete cada vez
- Intentas agregar el motor como
:path
+ bundle deploy
- falla, el equipo de desarrollo considera la :path
opción como "no estás usando Bundler con esta opción de gema", por lo que no se empaquetará para producción.
- Además, cada actualización del motor quiere actualizar su pila de rieles -_-
- La única solución que he encontrado es usar el motor como
/vendor
enlace simbólico en desarrollo y copiar los archivos para producción.
La solución
La aplicación en cuestión tiene 4 proyectos en git root:
- api: dependiendo del perfil, se ejecutará en 2 hosts heroku diferentes: carga y api
- web - el sitio web
- web-old: el sitio web antiguo, aún en proceso de migración
- común: los componentes comunes extraídos en un motor
Todos los proyectos tienen un vendor/common
enlace simbólico que busca en la raíz del common
motor. Al compilar el código fuente para la implementación en heroku, necesitamos eliminar el enlace simbólico y rsync, su código para que esté físicamente en la carpeta del proveedor de cada host por separado.
- acepta una lista de nombres de host como argumentos
- ejecuta un git push en su repositorio de desarrollo y luego ejecuta un git pull limpio en una carpeta separada, asegurándose de que no se envíen cambios sucios (no confirmados) a los hosts automáticamente
- despliega los hosts en paralelo: se extrae cada repositorio de heroku git, se sincroniza el nuevo código en los lugares correctos, se confirma con información push básica en el comentario de confirmación de git,
- al final, enviamos un ping con curl para decirle a los anfitriones del hobby que se despierten y sigan los registros para ver si todo se volvió vino
- también juega bien con jenkins: D (código automático para probar servidores después de pruebas exitosas)
Funciona muy, muy bien en la naturaleza con problemas mínimos (¿no?) 6 meses ahora
Aquí está el script https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Actualización 1
@AdamBuczynski, nunca es tan sencillo.
Primero, siempre tendrá un entorno de producción y prueba al menos, y un montón de clústeres específicos de funciones en el peor de los casos, de repente, 1 carpeta debe mapearse en n proyectos de heroku como un requisito bastante básico y todo debe organizarse de alguna manera para que la secuencia de comandos "sabe" qué fuente desea implementar y dónde,
En segundo lugar, querrá compartir código entre proyectos; ahora viene la sync_common
parte, los shennanigans con enlaces simbólicos en desarrollo se reemplazan por código real sincronizado en Heroku porque Heroku requiere una cierta estructura de carpetas y un paquete y rubygems realmente realmente hacen que las cosas sean feas, muy mal si usted quiero extraer los hilos comunes en una gema
En tercer lugar, querrá conectar CI y cambiará un poco la forma en que las subcarpetas y el repositorio de git deben organizarse, al final, en el caso de uso más simple posible, terminará con la esencia mencionada anteriormente.
En otros proyectos, necesito conectar compilaciones de Java, cuando venda software a varios clientes, necesitará filtrar los módulos que se instalan según los requisitos de instalación y otras cosas,
Realmente debería considerar explorar la posibilidad de agrupar cosas en un Rakefile o algo así y hacer todo de esa manera ...