Recompile la bala de Heroku sin empujar o cambiar la configuración

147

Me pregunto si hay una manera de obligar a Heroku a recompilar la babosa sin presionar nuevas confirmaciones y / o actualizar las variables de configuración.

¿Por qué querría hacer esto ?:

Estoy usando la pila Cedar en Heroku para una aplicación Rails 3.2, y tengo problemas con la rake assets:precompilefalla de la tarea (solo durante la compilación --- más tarde funciona bien con a heroku run). Sospecho que esto se debe a que ciertas variables de entorno no están disponibles durante el tiempo de compilación de slug, y creo que la heroku labs:enable user_env_compilefunción experimental resolverá esto.

Sin embargo, con la user_env_compilefunción activada, los cambios de configuración no desencadenan una recompilación de la babosa, y mi código no ha cambiado, por lo que no tengo nuevas confirmaciones para impulsar.

Por supuesto, podría impulsar una confirmación "ficticia" con un cambio trivial, que es probablemente la respuesta más simple, pero me pregunto si hay un comando heroku que me permita recompilar directamente la babosa.

¡Gracias!

Nathan
fuente
1
¿Nada en el cliente heroku CLI?
Matt Ball
No es una respuesta directa, pero siempre es aconsejable documentar los cambios de dependencia, como confiar en las funciones SAAS, etc. babosa.
patcoll

Respuestas:

93

La compilación de Slug se invoca con un gancho de pre-recepción de git, por lo que la única forma de recompilar es presionar una nueva confirmación.

Para completar, vea este artículo sobre Heroku para el compilador de slug . Discutió el uso del gancho de pre-recepción para invocar el proceso de compilación slug bajo el encabezado Compilación.

nmott
fuente
23
Gracias por tu respuesta. Es cierto que un gancho de pre-recepción de git compila la babosa. (ver, por ejemplo: devcenter.heroku.com/articles/slug-compiler ). Eso no significa necesariamente que heroku no (o no pueda) proporcionar un mecanismo alternativo para invocar la compilación de slug, como un comando heroku CLI. Dicho esto, nadie mencionó tal orden, así que supongo que su respuesta es acertada, al menos por ahora. ¡Gracias!
Nathan
1
@Nathan ¿Tal vez podrías pedirle al soporte de Heroku una manera de activar la compilación de babosas a través del Heroku Toolbelt? Si lo hacen, ¡agrega otra respuesta!
culix
77
Ahora hay una solución. El heroku-repo add-on
Refael Ackermann
Para su información, esta solución no funcionó cuando tenía un nuevo valor ENV para una configuración en un archivo js que se compila en la aplicación Rails.js. Tomó comprometer un espacio en el archivo js y presionar para que el activo se volviera a compilar.
Josh Diehl
12
repo:rebuildya no es un comando válido en el complemento, como se puede ver aquí: github.com/heroku/heroku-repo/commit/…
blindstuff
234

La solución más simple por ahora es empujar una confirmación vacía .

git commit --allow-empty -m "empty commit"
git push heroku master
Brad Koch
fuente
53
Puede hacer esto y mantener un historial limpio comprometerse por la fuerza de empuje confirmación anterior después: git reset HEAD~; git push -f heroku master. Incurre en el costo de tiempo de otro despliegue de Heroku, pero limpia el historial FTW.
Paul Annesley
2
Solo para complementar esto, un alias en su ~/.profileagregar esto: alias heroku-rebuild="git reset HEAD~; git push -f heroku master"o alias heroku-rebuild="git commit --allow-empty -m 'empty commit' && git push heroku master"simplemente puede escribirheroku-rebuild
unmultimedio
30

Mi enfoque general es hacer:

git commit --amend -C HEAD
git push heroku:master -f

No estoy seguro de que haría esto en producción sin estar seguro, ya que técnicamente reescribe el último commit pero no debería causar ningún problema en teoría. Sin embargo, está perfectamente bien cuando estás probando cosas en la puesta en escena.

Como una ventaja adicional ya que la mayoría de las personas tienen problemas al usar Vim para editar mensajes de confirmación SHIFT-ZZ, guardará y saldrá rápidamente del mensaje de confirmación por usted sin hacer ningún cambio.

En una nota relacionada, estoy un poco sorprendido de que Heroku todavía no tenga esta característica. A menudo he visto que Heroku no se implementa debido a problemas de su parte.

Gracias a Michael Mior por la idea de usar -C HEADpara evitar abrir un editor.

Chris Nicola
fuente
2
O simplemente use git commit --amend -C HEADpara evitar abrir un editor y mantenga el mensaje de confirmación igual.
Michael Mior
Gracias @MichaelMior, esto funcionó muy bien para mí y no se metió con mi percibido historial git.
James Ward
Una cosa con la que debe tener cuidado aquí es si tiene un repositorio central diferente (además de heroku). Si es así, esto dará como resultado una fusión / duplicación de la confirmación en el historial la próxima vez que retire si ya ha eliminado la última confirmación.
Nick F
¿Por qué es esto tan anti usuario?
Lucke
20

Heroku ha lanzado un plugin que pregunta: https://github.com/heroku/heroku-repo

Para instalarlo:

$ heroku plugins:install heroku-repo

Para forzar una reconstrucción:

$ heroku repo:purge_cache -a appname
$ heroku repo:reset -a appname
$ git push heroku
Flimm
fuente
15

Actualización: heroku repo: reconstruir ha sido eliminado .

Heroku tiene una API de compilación que puede usar, consulte: Compilación y lanzamiento con la API


Puede usar el comando repo: rebuild si el complemento heroku-repo .

heroku repo:rebuild -a appname

https://github.com/heroku/heroku-repo

khamaileon
fuente
3
También comenté el otro hilo, pero vale la pena repetirlo aquí: el complemento heroku-repo se ve bien, pero después de probarlo no lo recomiendo. Hay un error grave: ignora la bandera --app. Esto me hizo reconstruir accidentalmente nuestro entorno de producción, cuando quise reconstruir la puesta en escena. Este error ha estado abierto contra el repositorio durante más de un año sin resolución. He desinstalado este complemento.
jasoncrawford
66
La versión actual de heroku-repo no tiene el subcomando de reconstrucción
Mike Slinn
Tengo que restablecer el repositorio remoto ya que el comando de reconstrucción no funciona
vaibhav jain
Has actualizado y dices que funciona con la "API de compilación", pero realmente no entiendo cómo funciona ... ¿Alguna ayuda? ¿Tengo que enviar una solicitud HTTP POST a la API para reconstruir mi aplicación? En que ? Hay un token (razón de seguridad)?
Dam Fa
5

Hay un complemento heroku para esto.

$ heroku plugins:install heroku-releases-retry
Installing plugin heroku-releases-retry... done
$ heroku releases:retry
Retrying v16 on ⬢ murmuring-lowlands-3398... done, v17
Matt Joiner
fuente
3
Esto volverá a intentar versiones después de una versión fallida. No volverá a intentar una compilación fallida.
Jeremy
-3

Retire la rama, luego vuelva a empujarla. No es necesario usar un complemento.

git push heroku :master
git push heroku master
Elliot Winkler
fuente
Resultará en "Push rechazado, no se puede eliminar la rama maestra".
skalee
-15

git push --force Deberia trabajar :)

Patcon
fuente
3
Hmm, me sale un "Todo actualizado".
Brad Koch