Instancja inscenizacyjna na Heroku


85

Chciałbym móc wypchnąć kod do dev.myapp.comtestowania, a następnie do www.myapp.comużytku produkcyjnego. Czy jest to możliwe z Heroku?

Odpowiedzi:


142

Twój interfejs do Heroku to w zasadzie gałąź Git. Klejnot Heroku wykonuje trochę pracy poprzez swoje API, ale w repozytorium Git jest to tylko nowa zdalna gałąź.

heroku create yourapp # production
git br -D heroku # delete the default branch

heroku create staging-yourapp # staging
git br -D heroku # delete the default branch

Po skonfigurowaniu wielu aplikacji w Heroku powinieneś być w stanie skonfigurować repozytorium Git w następujący sposób:

git remote add staging git@heroku.com:staging-yourapp.git
git push origin staging

git remote add production git@heroku.com:yourapp.git
git push origin production

Zwykle pracuję w gałęzi „pracującej” i używam Githuba jako swojego mistrza.

Zakładając, że tak jest w Twoim przypadku, przepływ pracy wdrażania prawdopodobnie wyglądałby mniej więcej tak:

git co -b working
# do some work

# push to github:
git co master
git merge working
git push

# push to staging:
git co staging
git merge master
git push origin staging

# push to production
git co production
git merge master
git push origin production

Dzięki - to ma sens (jestem do dupy). Pytanie: Załóżmy, że pracuję nad nowatorskimi zmianami w „krawędzi” gałęzi. Jak mogę wypchnąć tę gałąź do staging-myapp bez wpływu na myapp (która obecnie działa w gałęzi głównej)? Czy git push staging edge work?
Tom Lehman

Chcąc pomóc ci w rozpoczęciu, po prostu połączysz krawędź z gałęzią przejściową i popchniesz ją. Twoja gałąź produkcji jest oddzielna i czysta. Zawsze możesz go rozgałęzić i wprowadzić zmiany, które tylko tam zostaną scalone.
Luke Bayes

5
Zamiast tworzyć aplikacje z domyślną zdalną gałęzią „heroku” i po jej usunięciu można skorzystać z dużo przyjemniejszego rozwiązania, takiego jak:heroku create yourapp --remote your-remote
dombesz

2
Gdy to skonfigurujesz, wszystkie twoje herokupolecenia muszą zawierać --app staginglub --app production. Czy istnieje sposób na ustawienie wartości domyślnej? (Pytanie jako komentarz b / c wydaje się zbyt ukierunkowane, aby być pełnoprawnym pytaniem SO.)
Paul A Jungwirth

3
@PaulAJungwirth Aby ustawić domyślną aplikację Heroku, użyj czegoś takiego jak „git config heroku.remote staging”. Więcej w dokumentacji Heroku na devcenter.heroku.com/articles/multiple-environments .
grifaton


10

Kluczowa część pierwotnego pytania dotyczy połączenia aplikacji testowej z subdomeną (dev.myapp.com) głównej aplikacji (www.myapp.com). Nie zostało to uwzględnione w żadnej z odpowiedzi.

Krok 1: Skonfiguruj zarówno wersję produkcyjną („myapp”), jak i wersję testową („staging-myapp”), jak wskazał w odpowiedzi Luke Bayes

Krok 2: W systemie zarządzania domeną (np. GoDaddy):

Create a CNAME record:  dev.myapp.com 
that points to:   proxy.heroku.com

Krok 3: Skonfiguruj Heroku, aby kierował dev.myapp.com na staging-myapp:

heroku domains:add dev.myapp.com --app staging-myapp

Gdy rekord CNAME zdąży się rozpropagować, będziesz mógł uruchomić aplikację testową pod adresem dev.myapp.com.


1
co z kontrolą dostępu, żeby nie pojawiała się w Google itp., a ludzie nie natknęli się na nią i nie myśleli, że to prawda? jakieś fajne rozwiązania?
brittohalloran,

Tak, najłatwiej jest pominąć krok GoDaddy i uzyskać dostęp do wersji „programistycznej” aplikacji bezpośrednio z domeny Heroku za pomocą adresu URL Heroku. (np . stormy-lake-5483.heroku.com ) . Jeśli jednak chcesz mieć „dev” poza domeną, jak opisano tutaj, zawsze możesz zainstalować plik robots.txt, aby poinformować google, bing itp. glin. aby nie indeksować swojej witryny deweloperskiej. Pomoże to utrzymać go z dala od wyszukiwarek.
Don Leatham

Skończyło się na tym, że dodałem before_filterhaczyk do mojego, application_controlleraby złapać WSZYSTKO w fazie przejściowej i zmusić użytkownika do zalogowania się jako administrator, a następnie ustawiłem plik cookie administratora, aby nadal widzieć aplikację z punktu widzenia „nieadministratora”. Pracuje całkiem nieźle dla mnie.
brittohalloran


7

Teraz jest łatwiej. Oto jak to robisz ...

Utwórz aplikację dla każdego środowiska

$ heroku create myapp --remote production
$ heroku create myapp-staging --remote staging

Spowoduje to utworzenie nazwanych repozytoriów zdalnych dla każdej aplikacji, które można zobaczyć w .git/config.

Możesz teraz używać przełączników --app lub --remote , aby kierować reklamy na określoną aplikację:

$ heroku info --app myapp-staging
$ heroku info --remote staging

Ustaw środowiska Railsowe

W przypadku aplikacji Rails, Heroku domyślnie wybiera środowisko „produkcyjne” . Jeśli chcesz, aby Twoja aplikacja testowa działała w środowisku przejściowym , utwórz środowisko w swoim projekcie i ustaw odpowiednie zmienne środowiskowe RAILS_ENV i RAKE_ENV w aplikacji:

$ heroku config:set RACK_ENV=staging RAILS_ENV=staging --remote staging

Skonfiguruj środowiska

Jeśli masz inne zmienne konfiguracyjne, musisz je również przekazać dla każdego środowiska.

$ heroku config:set AWS_KEY=abc --remote staging
$ heroku config:set AWD_SECRET=123 --remote staging
...etc

To jednak ogromny ból, więc po prostu używam klejnotu snappconfig i biegnę

$ rake heroku:config:load[myapp-staging]

aby załadować pliki konfiguracyjne YAML mojego projektu do Heroku.

Rozmieścić

Teraz po prostu popchnij do Heroku w ten sposób:

$ git push staging master
$ git push production master

i migruj w ten sposób:

$ heroku run rake db:migrate --remote staging
$ heroku run rake db:migrate --remote production

(Zobacz Zarządzanie wieloma środowiskami dla aplikacji | Centrum deweloperów Heroku, aby uzyskać więcej informacji i skrótów).


Ustawianie RAILS_ENVi RACK_ENVaby stagingsię zniechęcać Heroku: „To może być kuszące, aby utworzyć kolejną niestandardową środowiska takie jak«inscenizacji»i stworzyć config / Środowiska / staging.rb i wdrożyć do aplikacji Heroku z RAILS_ENV = inscenizacji To nie jest dobrą praktyką. . Zamiast tego zalecamy zawsze uruchamianie w trybie produkcyjnym i modyfikowanie dowolnego zachowania poprzez ustawienie zmiennych konfiguracyjnych. " Więcej na ten temat tutaj: devcenter.heroku.com/articles/…
Koen.

@ Koen - z mojego doświadczenia wynika, że ​​próba zarządzania złożonymi konfiguracjami Railsów bez kontekstu środowisk jest całkowicie niepraktyczna, czy to na Heroku, czy w inny sposób. Jeśli masz cały zestaw parametrów połączenia, kluczy API itp. Dla aplikacji przejściowej i inny dla aplikacji produkcyjnej, czy naprawdę zamierzasz ustawić te zmienne konfiguracyjne indywidualnie dla każdego? To tylko prośba o kłopoty - Heroku daje tutaj złą radę.
Yarin

Dzięki. Szukam inscenizacji, która naprawdę uzyska prawdziwy adres URL, prawdopodobnie z commithash. Myślę, że jest to coś, co ułatwiło Zeit Now lub Netlify.
Polv
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.