Instância de teste no Heroku

85

Gostaria de poder enviar o código dev.myapp.compara teste e depois www.myapp.compara uso em produção. Isso é possível com Heroku?

Tom Lehman
fonte

Respostas:

142

Sua interface com o Heroku é essencialmente um branch do Git. A gem Heroku faz algum trabalho por meio de sua API, mas dentro do seu repositório Git, é apenas um novo branch 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

Depois de configurar vários aplicativos no Heroku, você deve ser capaz de configurar seu repositório Git assim:

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

Eu geralmente trabalho em um branch 'funcional' e uso o Github como meu mestre.

Supondo que seja o seu caso, seu fluxo de trabalho de implantação provavelmente seria algo como:

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
fonte
Obrigado - isso faz algum sentido (eu sou péssimo no git). Pergunta: Suponha que eu esteja trabalhando em algumas mudanças de ponta no branch "edge". Como posso enviar esse branch para staging-myapp sem afetar o myapp (que atualmente está em execução no branch master)? Faz git push staging edge work?
Tom Lehman
No interesse de começar, você apenas mesclaria o edge com o branch de teste e o empurraria. Sua filial de produção está separada e limpa. Você sempre pode ramificá-lo e fazer alterações que só se fundem lá.
Luke Bayes
5
Em vez de criar aplicativos com o branch remoto padrão 'heroku' e depois de excluí-lo, você pode usar uma solução muito mais agradável como:heroku create yourapp --remote your-remote
dombesz
2
Depois de configurar isso, todos os seus herokucomandos precisam incluir --app stagingou --app production. Existe alguma maneira de definir um padrão? (Perguntar como um comentário b / c parece muito direcionado para ser uma pergunta SO completa.)
Paul A Jungwirth
3
@PaulAJungwirth Para definir um aplicativo Heroku padrão, use algo como "git config heroku.remote staging". Mais na documentação do Heroku em devcenter.heroku.com/articles/multiple-environments .
grifaton,
10

Uma parte fundamental da questão original é sobre como vincular o aplicativo de teste a um subdomínio (dev.myapp.com) do aplicativo principal (www.myapp.com). Isso não foi abordado em nenhuma das respostas.

Etapa 1: configure as versões de produção ('myapp') e de teste ('staging-myapp') de seu aplicativo, conforme indicado na resposta de Luke Bayes

Etapa 2: Em seu sistema de gerenciamento de domínio (por exemplo, GoDaddy):

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

Etapa 3: configurar o Heroku para rotear dev.myapp.com para staging-myapp:

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

Depois que o registro CNAME tiver tempo para se propagar, você poderá executar seu aplicativo de teste em dev.myapp.com.

Don Leatham
fonte
1
que tal controle de acesso para que não apareça no google etc. e as pessoas não tropecem nele e pensem que é a coisa real? alguma boa solução?
brittohalloran
Sim, a maneira mais fácil é pular a etapa GoDaddy e acessar a versão "dev" do seu aplicativo diretamente do domínio Heroku usando a URL do Heroku. (por exemplo, stormy-lake-5483.heroku.com. ) No entanto, se você quiser que 'dev' saia do seu domínio conforme descrito aqui, você pode instalar um arquivo robots.txt para informar ao google, bing, et. al. para não indexar seu site dev. Isso ajudará a mantê-lo fora dos motores de busca.
Don Leatham
Acabei adicionando um before_filtergancho ao meu application_controllerpara pegar TUDO no teste e forçar o usuário a fazer o login como administrador, em seguida, configurei um cookie de administrador para que eu ainda possa ver o aplicativo do ponto de vista de um 'não administrador'. Funcionando muito bem para mim.
brittohalloran
8

Você deve verificar o heroku_san

Ele faz um bom trabalho ao lidar com ambientes no heroku.

jlfenaux
fonte
7

As coisas estão mais fáceis agora. Veja como você faz isso ...

Crie um aplicativo para cada ambiente

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

Isso criará repositórios remotos nomeados para cada aplicativo, que você pode ver em .git/config.

Agora você pode usar as opções --app ou --remote para direcionar um aplicativo específico:

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

Definir ambientes Rails

Para aplicativos Rails, o padrão do Heroku é o ambiente de "produção" . Se você deseja que seu aplicativo de teste seja executado em um ambiente de teste, crie o ambiente em seu projeto e defina as variáveis ​​de ambiente RAILS_ENV e RAKE_ENV correspondentes no aplicativo:

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

Configurar ambientes

Se você tiver outras variáveis ​​de configuração, também precisará passá-las para cada ambiente.

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

Isso é uma grande dor, então eu apenas uso minha gem snappconfig e executo

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

para carregar os arquivos de configuração YAML do meu projeto no Heroku.

Implantar

Agora, basta empurrar para o Heroku assim:

$ git push staging master
$ git push production master

e migre assim:

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

(Consulte Gerenciando vários ambientes para um aplicativo | Centro de desenvolvimento Heroku para obter mais informações e atalhos.)

Yarin
fonte
Setting RAILS_ENVand RACK_ENVto stagingé desencorajado pelo Heroku: "Pode ser tentador criar outro ambiente personalizado, como“ staging ”e criar um config / environment / staging.rb e implantar em um aplicativo Heroku com RAILS_ENV = staging. Esta não é uma boa prática . Em vez disso, recomendamos sempre executar no modo de produção e modificar qualquer comportamento, definindo seus vars de configuração. " Mais sobre isso aqui: devcenter.heroku.com/articles/…
Koen.
@ Koen- Tentar gerenciar configurações Rails complexas sem o contexto dos ambientes é totalmente impraticável em minha experiência, seja no Heroku ou em outro lugar. Se você tiver um conjunto completo de strings de conexão, chaves de API, etc. para seu aplicativo de teste e outro para seu aplicativo de produção, você realmente vai definir essas variáveis ​​de configuração individualmente para cada um? Isso é apenas pedir encrenca - Heroku está dando conselhos ruins aqui.
Yarin
Obrigado. Estou procurando um teste que realmente consiga uma URL real, provavelmente com commithash. Acho que isso é algo que o Zeit Now ou Netlify tornou mais fácil.
Polv de