Ponownie skompiluj plik Heroku bez wypychania lub zmiany konfiguracji

147

Zastanawiam się, czy istnieje sposób, aby zmusić Heroku do ponownej kompilacji informacji o pracy bez wprowadzania nowych zatwierdzeń i / lub aktualizowania zmiennych konfiguracyjnych.

Dlaczego miałbym to zrobić ?:

Używam stosu Cedar na Heroku dla aplikacji Rails 3.2 i mam problemy z rake assets:precompileniepowodzeniem zadania (tylko podczas kompilacji - później działa dobrze z a heroku run). Podejrzewam, że jest to spowodowane tym, że pewne zmienne środowiskowe nie są dostępne w czasie kompilacji ślimaka i myślę, że heroku labs:enable user_env_compilefunkcja eksperymentalna rozwiąże ten problem.

Jednak przy user_env_compilewłączonej funkcji zmiany konfiguracji nie powodują ponownej kompilacji informacji o pracy, a mój kod się nie zmienił, więc nie mam żadnych nowych zatwierdzeń do wypchnięcia.

Oczywiście, mógłbym wcisnąć „fałszywe” zatwierdzenie z trywialną zmianą, co jest prawdopodobnie najprostszą odpowiedzią - ale zastanawiam się, czy istnieje polecenie heroku, które pozwoli mi bezpośrednio ponownie skompilować ślimak.

Dzięki!

Nathan
źródło
1
Nic w kliencie heroku CLI?
Matt Ball
Nie jest to bezpośrednia odpowiedź, ale zawsze rozsądnie jest dokumentować zmiany zależności, takie jak poleganie na funkcjach SAAS, itp. Radzę dodać wpis do CHANGELOG gdzieś, w którym wspomina, że ​​teraz polegasz na tej funkcji, i wypchnąć tę zmianę, aby uruchomić przebudowę ślimak.
patcoll

Odpowiedzi:

93

Kompilacja Slug jest wywoływana za pomocą podpięcia git pre-recieve, więc jedynym sposobem na rekompilację jest wypchnięcie nowego zatwierdzenia.

Pełne informacje znajdziesz w tym artykule o Heroku dla kompilatora slug . Omówiono użycie haka pre-recieve do wywołania procesu kompilacji slug w sekcji Compilation.

nmott
źródło
23
Dziękuję za odpowiedź. Prawdą jest, że hak git przed odbiorem kompiluje ślimak. (patrz na przykład: devcenter.heroku.com/articles/slug-compiler ). Nie musi to oznaczać, że heroku nie zapewnia (lub nie może) alternatywnego mechanizmu wywoływania kompilacji informacji o pracy, takiego jak polecenie heroku CLI. To powiedziawszy, nikt nie wspomniał o takim poleceniu, więc przypuszczam, że twoja odpowiedź jest trafna, przynajmniej na razie. Dzięki!
Nathan
1
@Nathan Może mógłbyś poprosić obsługę Heroku o sposób na uruchomienie kompilacji ślimaków za pomocą paska narzędzi Heroku? Jeśli się na to zgodzą, dodaj kolejną odpowiedź!
culix
7
Teraz jest rozwiązanie. Heroku-repo add-on
Refael Ackermann
FYI dla mnie to rozwiązanie nie działało, gdy miałem nową wartość ENV dla ustawienia w pliku js, który jest kompilowany do aplikacji Rails application.js. Wymagało przydzielenia spacji do pliku js i naciśnięcia, aby zasób faktycznie się ponownie skompilował.
Josh Diehl
12
repo:rebuildnie jest już prawidłowym poleceniem we wtyczce, jak można zobaczyć tutaj: github.com/heroku/heroku-repo/commit/…
blindstuff
234

Najprostszym rozwiązaniem na razie jest wypchnięcie pustego zatwierdzenia .

git commit --allow-empty -m "empty commit"
git push heroku master
Brad Koch
źródło
53
Można to zrobić i zachować czystą historię popełnienia przez siły pchania poprzedni popełnić potem: git reset HEAD~; git push -f heroku master. Wiąże się z kosztem czasu kolejnego wdrożenia Heroku, ale czysta historia FTW.
Paul Annesley,
2
Aby to uzupełnić, alias w Twoim ~/.profiledodaniu: alias heroku-rebuild="git reset HEAD~; git push -f heroku master"lub alias heroku-rebuild="git commit --allow-empty -m 'empty commit' && git push heroku master"tak możesz po prostu wpisaćheroku-rebuild
unmultimedio
30

Moje ogólne podejście to:

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

Nie jestem pewien, czy zrobiłbym to na produkcji bez pewności, ponieważ technicznie przepisuje ostatnie zatwierdzenie, ale nie powinno powodować żadnych problemów w teorii. Jest to jednak w porządku, gdy testujesz rzeczy w inscenizacji.

Jako dodatkowy bonus, ponieważ większość ludzi ma problemy z używaniem Vima do edycji, SHIFT-ZZwiadomości o zmianach szybko zapiszą i wyjdą z zatwierdzenia bez wprowadzania jakichkolwiek zmian.

A propos, jestem lekko zszokowany, że Heroku nadal nie ma tej funkcji. Często widziałem, jak Heroku nie udało się wdrożyć z powodu problemów po ich zakończeniu.

Podziękowania dla Michaela Miora za pomysł, -C HEADaby uniknąć otwierania edytora.

Chris Nicola
źródło
2
Lub po prostu użyj, git commit --amend -C HEADaby w ogóle uniknąć otwierania edytora i zachować ten sam komunikat o zatwierdzeniu.
Michael Mior
Dzięki @MichaelMior, to zadziałało świetnie i nie zepsuło mojej postrzeganej historii git.
James Ward,
Jedną rzeczą, na którą należy zachować ostrożność, jest to, że masz inne centralne repozytorium (oprócz heroku). Jeśli tak, spowoduje to scalenie / powielenie zatwierdzenia w historii następnym razem, gdy wyciągniesz, jeśli już wypchnąłeś ostatnie zatwierdzenie.
Nick F
dlaczego to jest takie antyużytkownikowe?
Lucke
20

Heroku wydało wtyczkę, o którą pytano: https://github.com/heroku/heroku-repo

Aby go zainstalować:

$ heroku plugins:install heroku-repo

Aby wymusić przebudowę:

$ heroku repo:purge_cache -a appname
$ heroku repo:reset -a appname
$ git push heroku
Flimm
źródło
15

Aktualizacja: Heroku repo: rebuild zostało usunięte .

Heroku ma Build API, którego możesz użyć, zobacz: Tworzenie i wydawanie za pomocą API


Możesz użyć polecenia repo: rebuild, jeśli dodatek heroku-repo .

heroku repo:rebuild -a appname

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

khamaileon
źródło
3
Właśnie skomentowałem również inny wątek, ale tutaj warto powtórzyć: dodatek heroku-repo wygląda ładnie, ale po wypróbowaniu go nie polecam. Wystąpił zły błąd: ignoruje flagę --app. To spowodowało, że przypadkowo przebudowałem nasze środowisko produkcyjne, gdy miałem zamiar odbudować staging. Ten błąd jest otwarty w repozytorium od ponad roku bez rozwiązania. Odinstalowałem tę wtyczkę.
jasoncrawford
6
Obecna wersja heroku-repo nie ma
podkomendy
Muszę zresetować zdalne repozytorium, ponieważ polecenie przebudowy nie działa
vaibhav jain
Zaktualizowałeś i powiedziałeś, że działa z „Build API”, ale tak naprawdę nie rozumiem, jak to działa ... Jakaś pomoc? Czy muszę wysłać żądanie HTTP POST do interfejsu API, aby odbudować aplikację? Który na? Czy jest token (powód bezpieczeństwa)?
Dam Fa
9

Wygląda na to, że to nie jest jeszcze dostępne. Jednak żądanie funkcji zostało otwarte w repozytorium heroku github

Wspomina również o „alternatywnym sposobie budowania, który nie jest zależny od git push

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

Kostia
źródło
5

Jest do tego wtyczka heroku .

$ 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
źródło
3
Spowoduje to ponowienie wersji po nieudanej wersji. Nie będzie ponawiać próby nieudanej kompilacji.
Jeremy
-3

Usuń gałąź, a następnie ponownie ją pchnij. Nie ma potrzeby używania wtyczki.

git push heroku :master
git push heroku master
Elliot Winkler
źródło
Spowoduje to „Push odrzucony, nie można usunąć gałęzi głównej”.
skalee
-15

git push --force powinno działać :)

patcon
źródło
3
Hmm, dostaję komunikat „Wszystko aktualne”.
Brad Koch