Recompiler le slug Heroku sans pousser ni modifier la configuration

147

Je me demande s'il existe un moyen de forcer Heroku à recompiler le slug sans pousser de nouveaux commits et / ou mettre à jour les variables de configuration.

Pourquoi voudrais-je faire cela?:

J'utilise la pile Cedar sur Heroku pour une application Rails 3.2, et j'ai des problèmes avec l' rake assets:precompileéchec de la tâche (pendant la compilation seulement - plus tard, cela fonctionne bien avec a heroku run). Je soupçonne fortement que cela est dû au fait que certaines variables d'environnement ne sont pas disponibles pendant la compilation du slug, et je pense que la heroku labs:enable user_env_compilefonctionnalité expérimentale résoudra ce problème.

Cependant, avec la user_env_compilefonctionnalité activée, les changements de configuration ne déclenchent pas une recompilation du slug, et mon code n'a pas changé, donc je n'ai pas de nouveaux commits à pousser.

Bien sûr, je pourrais pousser un commit "factice" avec un changement trivial, ce qui est probablement la réponse la plus simple --- mais je me demande s'il existe une commande heroku qui me permettra de recompiler directement le slug.

Merci!

Nathan
la source
1
Rien dans le client CLI heroku?
Matt Ball
Ce n'est pas une réponse directe, mais il est toujours sage de documenter les changements de dépendance comme le fait de s'appuyer sur des fonctionnalités SAAS, etc. limace.
patcoll

Réponses:

93

La compilation Slug est appelée avec un hook git pre-recieve, donc la seule façon de recompiler est de pousser un nouveau commit.

Pour être complet, consultez cet article sur Heroku pour le compilateur de slug . Il a discuté de l'utilisation du hook de pré-réception pour appeler le processus de compilation de slug sous l'en-tête Compilation.

nmott
la source
23
Merci pour votre réponse. Il est vrai qu'un hook de pré-réception git compile le slug. (voir, par exemple: devcenter.heroku.com/articles/slug-compiler ). Cela ne signifie pas nécessairement que heroku ne fournit pas (ou ne peut pas) fournir un mécanisme alternatif pour invoquer la compilation de slug comme une commande CLI heroku. Cela dit, personne n'a mentionné une telle commande, donc je suppose que votre réponse est juste, du moins pour le moment. Merci!
Nathan
1
@Nathan Vous pourriez peut-être demander au support Heroku un moyen de déclencher la compilation de slug via la ceinture à outils Heroku? S'ils y vont, ajoutez une autre réponse!
culix
7
Il y a maintenant une solution. The heroku-repo add-on
Refael Ackermann
Pour ma part, cette solution ne fonctionnait pas lorsque j'avais une nouvelle valeur ENV pour un paramètre dans un fichier js qui était compilé dans l'application Rails.js. Il a fallu consacrer un espace dans le fichier js et une poussée pour que l'actif se recompile réellement.
Josh Diehl
12
repo:rebuildn'est plus une commande valide dans le plug-in, comme on peut le voir ici: github.com/heroku/heroku-repo/commit/…
blindstuff
234

La solution de contournement la plus simple pour le moment est de pousser un commit vide .

git commit --allow-empty -m "empty commit"
git push heroku master
Brad Koch
la source
53
Vous pouvez le faire et de garder un historique des commits propre par la force de poussée la précédente livraison après: git reset HEAD~; git push -f heroku master. Entraîne le coût en temps d'un autre déploiement Heroku, mais nettoie l'historique FTW.
Paul Annesley
2
Juste pour compléter cela, un alias dans votre ~/.profileajoutez ceci: alias heroku-rebuild="git reset HEAD~; git push -f heroku master"ou alias heroku-rebuild="git commit --allow-empty -m 'empty commit' && git push heroku master"alors vous pouvez simplement taperheroku-rebuild
unmultimedio
30

Mon approche générale est de faire:

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

Je ne suis pas sûr de le faire en production sans en être certain, car cela réécrit techniquement le dernier commit, mais cela ne devrait pas poser de problèmes en théorie. C'est parfaitement bien lorsque vous testez des choses en staging.

En prime, car la plupart des gens ont du mal à utiliser Vim pour modifier les messages de validation SHIFT-ZZ , enregistrera et quittera rapidement le message de validation pour vous sans y apporter de modifications.

Sur une note connexe, je suis légèrement choqué que Heroku ne dispose toujours pas de cette fonctionnalité. J'ai souvent vu Heroku échouer à se déployer en raison de problèmes de son côté.

Merci à Michael Mior pour l'idée d'utiliser -C HEADpour éviter d'ouvrir un éditeur.

Chris Nicola
la source
2
Ou utilisez simplement git commit --amend -C HEADpour éviter d'ouvrir un éditeur et conserver le même message de validation.
Michael Mior
Merci @MichaelMior, cela a très bien fonctionné pour moi et n'a pas gâché mon histoire de git perçue.
James Ward
Une chose à laquelle il faut faire attention ici est si vous avez un dépôt central différent (en plus de heroku). Si tel est le cas, cela entraînera une fusion / duplication du commit dans l'historique la prochaine fois que vous tirerez si vous avez déjà poussé le dernier commit.
Nick F
pourquoi est-ce si anti-utilisateur?
Lucke le
20

Heroku a publié un plugin qui demande: https://github.com/heroku/heroku-repo

Pour l'installer:

$ heroku plugins:install heroku-repo

Pour forcer une reconstruction:

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

Mise à jour: repo heroku: la reconstruction a été supprimée .

Heroku a une API de construction que vous pouvez utiliser, voir: Construire et publier à l'aide de l'API


Vous pouvez utiliser la commande repo: rebuild si le module complémentaire heroku-repo .

heroku repo:rebuild -a appname

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

khamaileon
la source
3
Juste a commenté l'autre fil aussi, mais il vaut la peine de répéter ici: Le addon heroku-pension est joli, mais après l' avoir essayé , je ne pas le recommander. Il y a un mauvais bug: il ignore l'indicateur --app. Cela m'a amené à reconstruire accidentellement notre environnement de production, alors que je voulais reconstruire le staging. Ce bogue est ouvert contre le repo depuis plus d'un an maintenant sans résolution. J'ai désinstallé ce plugin.
jasoncrawford
6
La version actuelle de heroku-repo n'a pas la sous
Mike Slinn
Je dois réinitialiser le dépôt distant car la commande de reconstruction ne fonctionne pas
vaibhav jain
Vous avez mis à jour et vous dites que ça marche avec la "Build API" mais je ne comprends pas vraiment comment ça marche ... Une aide? Dois-je envoyer une requête HTTP POST à ​​l'API pour reconstruire mon application? Sur quoi? Il y a un jeton (raison de sécurité)?
Dam Fa
5

Il existe un plugin heroku pour cela.

$ 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
la source
3
Cela réessayera les versions après une version ayant échoué. Il ne réessaiera pas une compilation ayant échoué.
Jeremy
-3

Retirez la branche, puis repoussez-la. Pas besoin d'utiliser un plugin.

git push heroku :master
git push heroku master
Elliot Winkler
la source
Cela entraînera "Push rejeté, impossible de supprimer la branche principale".
skalee
-15

git push --force devrait marcher :)

patcon
la source
3
Hmm, je reçois un "Tout à jour".
Brad Koch