Istanza di messa in scena su Heroku


85

Mi piacerebbe essere in grado di eseguire il push del codice dev.myapp.comper i test e quindi www.myapp.comper l'uso in produzione. È possibile con Heroku?

Risposte:


142

La tua interfaccia per Heroku è essenzialmente un ramo Git. La gemma Heroku funziona in parte tramite la loro API, ma all'interno del tuo repository Git è solo un nuovo ramo remoto.

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

Dopo aver configurato più applicazioni su Heroku, dovresti essere in grado di configurare il tuo repository Git in questo modo:

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

Di solito lavoro in un ramo "funzionante" e uso Github per il mio master.

Supponendo che sia così per te, il tuo flusso di lavoro di distribuzione sarebbe probabilmente simile a:

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

Grazie - questo ha un senso (faccio schifo a git). Domanda: Supponiamo che stia lavorando ad alcune modifiche all'avanguardia sul "bordo" del ramo. Come posso eseguire il push di quel ramo in staging-myapp senza influire su myapp (che attualmente è in esecuzione sul ramo master)? Fa git push staging edge work?
Tom Lehman

Nell'interesse di farti andare avanti, dovresti semplicemente unire edge al tuo ramo di staging e spingerlo. Il tuo ramo di produzione è separato e pulito. Puoi sempre diramarlo e apportare modifiche che si uniscono solo lì.
Luke Bayes,

5
Invece di creare app con il ramo remoto predefinito "heroku" e dopo averlo eliminato, puoi utilizzare una soluzione molto più carina come:heroku create yourapp --remote your-remote
dombesz

2
Una volta impostato, tutti i herokucomandi devono includere --app stagingo --app production. C'è un modo per impostare un valore predefinito? (Chiedere come commento b / c sembra troppo mirato per essere una domanda SO a tutti gli effetti.)
Paul A Jungwirth,

3
@PaulAJungwirth Per impostare un'app Heroku predefinita, usa qualcosa come "git config heroku.remote staging". Maggiori informazioni nella documentazione di Heroku su devcenter.heroku.com/articles/multiple-environments .
grifaton


10

Una parte fondamentale della domanda originale riguarda il collegamento dell'app di staging a un sottodominio (dev.myapp.com) dell'app principale (www.myapp.com). Questo non è stato affrontato in nessuna delle risposte.

Passaggio 1: configura sia la versione di produzione ('myapp') che quella di staging ('staging-myapp') dell'app come indicato nella risposta di Luke Bayes

Passaggio 2: nel sistema di gestione del dominio (ad es. GoDaddy):

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

Passaggio 3: configura Heroku per instradare dev.myapp.com a staging-myapp:

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

Dopo che il record CNAME ha avuto il tempo di propagarsi, sarai in grado di eseguire l'app di staging su dev.myapp.com.


1
che ne dici del controllo degli accessi in modo che non venga visualizzato in google ecc. e le persone non si imbattono in esso e pensano che sia la cosa reale? qualche bella soluzione?
brittohalloran

Sì, il modo più semplice è saltare il passaggio di GoDaddy e accedere alla versione "dev" della tua app direttamente dal dominio Heroku utilizzando l'URL Heroku. (ad es . stormy-lake-5483.heroku.com. ) Tuttavia, se desideri disattivare "dev" dal tuo dominio come descritto qui, puoi sempre installare un file robots.txt per dire a google, bing, et. al. per non indicizzare il tuo sito di sviluppo. Ciò contribuirà a tenerlo fuori dai motori di ricerca.
Don Leatham

Ho finito per aggiungere un before_filterhook al mio application_controllerper catturare TUTTO in staging e costringere l'utente ad accedere come amministratore, quindi impostare un cookie amministratore in modo che io possa ancora vedere l'app dal punto di vista di un "non amministratore". Funziona abbastanza bene per me.
brittohalloran


7

Adesso le cose sono più facili. Ecco come lo fai ...

Crea un'app per ogni ambiente

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

Questo creerà repository remoti con nome per ogni app, che puoi vedere in .git/config.

Ora puoi utilizzare gli interruttori --app o --remote per indirizzare una particolare app:

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

Imposta gli ambienti Rails

Per le app Rails, Heroku utilizza per impostazione predefinita l'ambiente di "produzione" . Se desideri che la tua app di staging venga eseguita in un ambiente di staging, crea l'ambiente nel tuo progetto e imposta le variabili d'ambiente RAILS_ENV e RAKE_ENV corrispondenti sull'app:

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

Configura gli ambienti

Se hai altre variabili di configurazione, dovrai passarle anche per ogni ambiente.

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

Questo è un enorme dolore, quindi uso la mia gemma snappconfig e corro

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

per caricare i file di configurazione YAML del mio progetto in Heroku.

Distribuisci

Ora devi solo premere su Heroku in questo modo:

$ git push staging master
$ git push production master

e migra in questo modo:

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

(Vedi Gestione di più ambienti per un'app | Heroku Dev Center per maggiori informazioni e scorciatoie.)


Setting RAILS_ENVand RACK_ENVto stagingè sconsigliato da Heroku: "Potrebbe essere allettante creare un altro ambiente personalizzato come" staging "e creare un file config / environment / staging.rb e distribuirlo a un'app Heroku con RAILS_ENV = staging. Questa non è una buona pratica . Invece si consiglia di eseguire sempre in modalità di produzione e modificare qualsiasi comportamento impostando le variabili di configurazione. " Maggiori informazioni su questo qui: devcenter.heroku.com/articles/…
Koen.

@ Koen- Cercare di gestire complesse configurazioni di Rails senza il contesto degli ambienti è totalmente poco pratico nella mia esperienza, sia su Heroku che altro. Se disponi di un intero set di stringhe di connessione, chiavi API, ecc. Per la tua app di staging e un altro per la tua app di produzione, imposterai davvero quelle variabili di configurazione individualmente per ciascuna? Sto solo cercando guai- Heroku qui sta dando cattivi consigli.
Yarin

Grazie. Sto cercando uno staging che ottenga davvero un vero URL, probabilmente con commithash. Penso che questo sia qualcosa che Zeit Now o Netlify hanno reso facile.
Polv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.