Kompilieren Sie den Heroku-Slug ohne Push oder Konfigurationsänderung neu

147

Ich frage mich, ob es eine Möglichkeit gibt, Heroku zu zwingen, den Slug neu zu kompilieren, ohne neue Commits zu pushen und / oder die Konfigurationsvariablen zu aktualisieren.

Warum sollte ich das tun wollen?:

Ich verwende den Cedar-Stack auf Heroku für eine Rails 3.2-App und habe Probleme mit dem rake assets:precompileFehlschlagen der Aufgabe (nur während der Kompilierung - später funktioniert es einwandfrei mit a heroku run). Ich vermute sehr, dass dies darauf zurückzuführen ist, dass bestimmte Umgebungsvariablen während der Slug-Kompilierungszeit nicht verfügbar sind, und ich denke, dass die heroku labs:enable user_env_compileexperimentelle Funktion dies lösen wird.

Doch mit der user_env_compileFunktion eingeschaltet, Konfigurationsänderungen auslösen keine Neuübersetzung des Rohlings, und mein Code nicht geändert hat, so dass ich keine neue Commits Push verfügen.

Natürlich könnte ich ein "Dummy" -Commit mit einer trivialen Änderung drücken, was wahrscheinlich die einfachste Antwort ist - aber ich frage mich, ob es einen Heroku-Befehl gibt, mit dem ich den Slug direkt neu kompilieren kann.

Vielen Dank!

Nathan
quelle
1
Nichts im Heroku CLI Client?
Matt Ball
Keine direkte Antwort, aber es ist immer ratsam, Abhängigkeitsänderungen wie das Verlassen auf SAAS-Funktionen usw. zu dokumentieren. Mein Rat ist, irgendwo einen Eintrag in ein CHANGELOG einzufügen, in dem erwähnt wird, dass Sie sich jetzt auf diese Funktion verlassen, und diese Änderung zu drücken, um eine Neuerstellung der auszulösen Schnecke.
Patcoll

Antworten:

93

Die Slug-Kompilierung wird mit einem Git-Pre-Recieve-Hook aufgerufen. Die einzige Möglichkeit zum Neukompilieren besteht darin, ein neues Commit zu pushen.

Der Vollständigkeit halber lesen Sie diesen Artikel über Heroku für den Slug-Compiler . Es wurde die Verwendung des Pre-Recieve-Hooks zum Aufrufen des Slug-Kompilierungsprozesses unter der Überschrift Compilation erläutert.

nmott
quelle
23
Danke für deine Antwort. Es ist wahr, dass ein Git-Pre-Receive-Hook den Slug kompiliert. (Siehe zum Beispiel: devcenter.heroku.com/articles/slug-compiler ). Dies bedeutet nicht unbedingt, dass Heroku keinen alternativen Mechanismus zum Aufrufen der Slug-Kompilierung bereitstellt (oder nicht bereitstellen kann), z. B. einen Heroku-CLI-Befehl. Das heißt, niemand hat einen solchen Befehl erwähnt, daher gehe ich davon aus, dass Ihre Antwort zumindest vorerst genau richtig ist. Vielen Dank!
Nathan
1
@ Nathan Vielleicht könnten Sie den Heroku-Support um eine Möglichkeit bitten, die Slug-Kompilierung über den Heroku-Toolbelt auszulösen? Wenn sie es wollen, fügen Sie eine weitere Antwort hinzu!
culix
7
Jetzt gibt es eine Lösung. Das Heroku-Repo- Add-On
Refael Ackermann
Zu Ihrer Information, diese Lösung hat nicht funktioniert, als ich einen neuen ENV-Wert für eine Einstellung in einer js-Datei hatte, die in die Rails application.js kompiliert wird. Es dauerte ein Festschreiben eines Leerzeichens für die js-Datei und einen Push, um das Asset tatsächlich neu zu kompilieren.
Josh Diehl
12
repo:rebuildist kein gültiger Befehl mehr im Plug-In, wie hier zu sehen ist: github.com/heroku/heroku-repo/commit/…
blindstuff
234

Die derzeit einfachste Problemumgehung besteht darin , ein leeres Commit zu pushen .

git commit --allow-empty -m "empty commit"
git push heroku master
Brad Koch
quelle
53
Sie können dies tun und einen sauberen Commit-Verlauf beibehalten, indem Sie das vorherige Commit anschließend erzwingen : git reset HEAD~; git push -f heroku master. Entsteht die Zeitkosten für eine andere Heroku-Bereitstellung, aber eine saubere Geschichte FTW.
Paul Annesley
2
Nur um dies zu ergänzen, ~/.profilefügen Sie einen Alias hinzu: alias heroku-rebuild="git reset HEAD~; git push -f heroku master"oder alias heroku-rebuild="git commit --allow-empty -m 'empty commit' && git push heroku master"so können Sie einfachheroku-rebuild
unmultimedio
30

Mein allgemeiner Ansatz ist:

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

Ich bin mir nicht sicher, ob ich dies in der Produktion tun würde, ohne sicher zu sein, da es das letzte Commit technisch umschreibt, aber theoretisch keine Probleme verursachen sollte. Es ist jedoch vollkommen in Ordnung, wenn Sie Dinge in der Inszenierung testen.

Als zusätzlichen Bonus, da die meisten Leute Probleme haben, Vim zum Bearbeiten von Commit-Nachrichten zu verwenden SHIFT-ZZ schnell gespeichert und beendet, ohne Änderungen daran vorzunehmen.

In einem ähnlichen Zusammenhang bin ich leicht schockiert, dass Heroku diese Funktion immer noch nicht hat. Ich habe oft gesehen, dass Heroku aufgrund von Problemen am Ende nicht bereitgestellt werden konnte.

Vielen Dank an Michael Mior für die Idee, -C HEADeinen Editor nicht zu öffnen.

Chris Nicola
quelle
2
Oder verwenden Sie einfach git commit --amend -C HEAD, um das Öffnen eines Editors zu vermeiden und die Commit-Nachricht gleich zu halten.
Michael Mior
Danke @MichaelMior, das hat großartig für mich funktioniert und sich nicht mit meiner wahrgenommenen Git-Geschichte angelegt.
James Ward
Eine Sache, mit der Sie hier vorsichtig sein sollten, ist, wenn Sie ein anderes zentrales Repo haben (zusätzlich zu Heroku). In diesem Fall führt dies beim nächsten Abrufen zu einer Zusammenführung / Vervielfältigung des Commits im Verlauf, wenn Sie das letzte Commit bereits verschoben haben.
Nick F
Warum ist das so Anti-User?
Lucke
20

Heroku hat ein Plugin veröffentlicht, das gefragt wird: https://github.com/heroku/heroku-repo

So installieren Sie es:

$ heroku plugins:install heroku-repo

So erzwingen Sie einen Wiederaufbau:

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

Update: Heroku Repo: Neuaufbau wurde entfernt .

Heroku verfügt über eine Build-API, die Sie verwenden können (siehe: Erstellen und Freigeben mithilfe der API)


Sie können den Befehl repo: rebuild verwenden, wenn das Heroku-Repo- Add-On verwendet wird.

heroku repo:rebuild -a appname

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

Khamaileon
quelle
3
Ich habe gerade auch den anderen Thread kommentiert, aber es lohnt sich, ihn hier zu wiederholen: Das Heroku-Repo-Addon sieht gut aus, aber nachdem ich es ausprobiert habe, empfehle ich es nicht . Es gibt einen schlechten Fehler: Das Flag --app wird ignoriert. Dies führte dazu, dass ich versehentlich unsere Produktionsumgebung neu erstellte, als ich die Bereitstellung neu inszenieren wollte. Dieser Fehler ist seit weit über einem Jahr ohne Lösung gegen das Repo offen. Ich habe dieses Plugin deinstalliert.
Jasoncrawford
6
Die aktuelle Version von Heroku-Repo hat nicht den Unterbefehl zum Wiederherstellen
Mike Slinn
Ich muss das Remote-Repo zurücksetzen, da der Wiederherstellungsbefehl nicht funktioniert
Vaibhav Jain
Sie haben aktualisiert und Sie sagen, dass es mit der "Build API" funktioniert, aber ich verstehe nicht wirklich, wie es funktioniert ... Hilfe? Muss ich eine HTTP-POST-Anfrage an die API senden, um meine App neu zu erstellen? Welches auf? Gibt es ein Token (Sicherheitsgrund)?
Dam Fa
9

Sieht so aus, als wäre dies noch nicht verfügbar. Auf dem Heroku Github Repo wurde jedoch eine Feature-Anfrage geöffnet

Es wird auch erwähnt, "eine alternative Art zu bauen, die nicht abhängig ist git push"

https://github.com/ddollar/heroku-anvil

Kostia
quelle
5

Dafür gibt es ein Heroku-Plugin .

$ 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
quelle
3
Dadurch werden Releases nach einem fehlgeschlagenen Release erneut versucht. Ein fehlgeschlagener Build wird nicht wiederholt.
Jeremy
-3

Entfernen Sie den Zweig und drücken Sie ihn erneut. Sie müssen kein Plugin verwenden.

git push heroku :master
git push heroku master
Elliot Winkler
quelle
Wird zu "Push abgelehnt, Hauptzweig kann nicht gelöscht werden" führen.
Skalee
-15

git push --force sollte arbeiten :)

Patcon
quelle
3
Hmm, ich bekomme ein "Alles auf dem neuesten Stand".
Brad Koch