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!


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.


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

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.


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

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


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


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

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

Spowoduje to „Push odrzucony, nie można usunąć gałęzi głównej”.
skalee

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.