Staging-Instanz auf Heroku

85

Ich möchte in der Lage sein, Code zum dev.myapp.comTesten und dann zur www.myapp.comVerwendung in der Produktion zu übertragen. Ist das mit Heroku möglich?

Tom Lehman
quelle

Antworten:

142

Ihre Schnittstelle zu Heroku ist im Wesentlichen ein Git-Zweig. Das Heroku-Juwel arbeitet zwar über seine API, aber in Ihrem Git-Repository ist es nur ein neuer Remote-Zweig.

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

Sobald Sie mehrere Anwendungen auf Heroku eingerichtet haben, sollten Sie Ihr Git-Repository wie folgt konfigurieren können:

git remote add staging [email protected]:staging-yourapp.git
git push origin staging

git remote add production [email protected]:yourapp.git
git push origin production

Normalerweise arbeite ich in einem "arbeitenden" Zweig und benutze Github für meinen Meister.

Angenommen, dies ist bei Ihnen der Fall, würde Ihr Bereitstellungsworkflow wahrscheinlich folgendermaßen aussehen:

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
Luke Bayes
quelle
Danke - das macht Sinn (ich lutsche an git). Frage: Angenommen, ich arbeite an einigen Änderungen an der "Kante" des Zweigs. Wie kann ich diesen Zweig auf staging-myapp verschieben, ohne myapp zu beeinflussen (das derzeit auf dem Hauptzweig ausgeführt wird)? Tut git push staging edge work?
Tom Lehman
Um Sie zum Laufen zu bringen, würden Sie einfach Edge mit Ihrem Staging-Zweig zusammenführen und ihn verschieben. Ihr Produktionszweig ist getrennt und sauber. Sie können es jederzeit verzweigen und Änderungen vornehmen, die nur dort zusammengeführt werden.
Luke Bayes
5
Anstatt Apps mit dem Standard-Remote-Zweig 'heroku' zu erstellen und nach dem Löschen können Sie eine viel schönere Lösung verwenden, wie:heroku create yourapp --remote your-remote
dombesz
2
Sobald Sie dies eingerichtet haben, müssen alle Ihre herokuBefehle --app stagingoder enthalten --app production. Gibt es eine Möglichkeit, einen Standard festzulegen? (Als Kommentar b / c zu fragen, scheint dies zu zielgerichtet, um eine vollwertige SO-Frage zu sein.)
Paul A Jungwirth
3
@PaulAJungwirth Um eine Standard-Heroku-App festzulegen, verwenden Sie etwas wie "git config heroku.remote staging". Weitere Informationen finden Sie in den Heroku-Dokumenten unter devcenter.heroku.com/articles/multiple-environments .
Grifaton
10

Ein wesentlicher Teil der ursprünglichen Frage besteht darin, die Staging-App mit einer Subdomain (dev.myapp.com) der Haupt-App (www.myapp.com) zu verknüpfen. Dies wurde in keiner der Antworten angesprochen.

Schritt 1: Konfigurieren Sie sowohl die Produktionsversion ('myapp') als auch die Staging-Version ('staging-myapp') Ihrer App, wie in der Antwort von Luke Bayes angegeben

Schritt 2: In Ihrem Domain Management System (zB GoDaddy):

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

Schritt 3: Konfigurieren Sie Heroku so, dass dev.myapp.com an staging-myapp weitergeleitet wird:

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

Nachdem der CNAME-Datensatz Zeit für die Weitergabe hatte, können Sie Ihre Staging-App unter dev.myapp.com ausführen.

Don Leatham
quelle
1
Wie wäre es mit einer Zugriffskontrolle, damit sie nicht in Google usw. angezeigt wird und die Leute nicht darüber stolpern und denken, dass sie die Realität ist? irgendwelche netten lösungen?
Brittohalloran
Ja, der einfachste Weg ist, den GoDaddy-Schritt zu überspringen und über die Heroku-URL direkt von der Heroku-Domain aus auf die "dev" -Version Ihrer App zuzugreifen. (z . B. Stormy-lake-5483.heroku.com. ) Wenn Sie jedoch möchten, dass "dev" von Ihrer Domain entfernt wird, wie hier beschrieben, können Sie jederzeit eine robots.txt-Datei installieren, um google, bing, et. al. um deine Entwickler-Site nicht zu indizieren. Das wird helfen, es aus den Suchmaschinen herauszuhalten.
Don Leatham
Am Ende habe ich einen before_filterHook zu meinem hinzugefügt application_controller, um ALLES beim Staging zu fangen und den Benutzer zu zwingen, sich als Administrator anzumelden. Dann habe ich ein Admin-Cookie gesetzt, damit ich die App immer noch aus der Sicht eines "Nicht-Administrators" sehen kann. Arbeitet ziemlich gut für mich.
Brittohalloran
8

Sie sollten den heroku_san überprüfen

Es macht einen ziemlich guten Job, mit Umgebungen auf Heroku zu jonglieren.

jlfenaux
quelle
7

Die Dinge sind jetzt einfacher. So geht's ...

Erstellen Sie eine App für jede Umgebung

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

Dadurch werden benannte Remote-Repos für jede App erstellt, die Sie in sehen können .git/config.

Sie können jetzt entweder die Schalter --app oder --remote verwenden, um auf eine bestimmte App abzuzielen :

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

Rails-Umgebungen festlegen

Für Rails-Apps verwendet Heroku standardmäßig die "Produktions" -Umgebung . Wenn Ihre Staging-App in einer Staging-Umgebung ausgeführt werden soll, erstellen Sie die Umgebung in Ihrem Projekt und legen Sie die entsprechenden Umgebungsvariablen RAILS_ENV und RAKE_ENV in der App fest:

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

Umgebungen konfigurieren

Wenn Sie andere Konfigurationsvariablen haben, müssen Sie diese auch für jede Umgebung übergeben.

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

Das ist allerdings ein großer Schmerz, also benutze ich einfach mein snappconfig- Juwel und renne los

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

um die YAML-Konfigurationsdateien meines Projekts in Heroku zu laden.

Bereitstellen

Jetzt drückst du einfach so zu Heroku:

$ git push staging master
$ git push production master

und migrieren Sie wie folgt:

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

( Weitere Informationen und Verknüpfungen finden Sie unter Verwalten mehrerer Umgebungen für eine App | Heroku Dev Center .)

Yarin
quelle
Einstellung RAILS_ENVund RACK_ENVzu stagingwird von Heroku entmutigt: „Es mag verlockend sein , eine andere benutzerdefinierte Umgebung wie zu schaffen‚Staging‘und erstellen Sie eine config / Umgebungen / staging.rb und deploy auf eine Heroku App mit RAILS_ENV = Staging dies keine gute Praxis. Stattdessen empfehlen wir, immer im Produktionsmodus zu arbeiten und das Verhalten durch Festlegen Ihrer Konfigurationsvariablen zu ändern. " Mehr dazu hier: devcenter.heroku.com/articles/…
Koen.
@ Koen- Der Versuch, komplexe Rails-Konfigurationen ohne den Kontext von Umgebungen zu verwalten, ist meiner Erfahrung nach völlig unpraktisch, ob auf Heroku oder auf andere Weise. Wenn Sie eine ganze Reihe von Verbindungszeichenfolgen, API-Schlüsseln usw. für Ihre Staging-App und eine andere für Ihre Produktions-App haben, werden Sie diese Konfigurationsvariablen dann wirklich für jede einzelne festlegen? Das bittet nur um Ärger - Heroku gibt hier schlechte Ratschläge.
Yarin
Vielen Dank. Ich suche nach einer Inszenierung, die wirklich eine echte URL erhält, wahrscheinlich mit Commithash. Ich denke, das hat Zeit Now oder Netlify einfach gemacht.
Polv