Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Staging instance on Heroku

I'd like to be able to push code to dev.myapp.com for testing and then to www.myapp.com for production use. Is this possible with Heroku?

like image 932
Tom Lehman Avatar asked Aug 14 '09 19:08

Tom Lehman


People also ask

How do I push to Heroku staging?

If you want to set push. default for all git repositories (instead of just this one), add --global to the command. Now, you're in the staging branch and you're set up so that git pull and git push will work against your staging environment without any further arguments.

Can Heroku be used for production?

We deploy almost everything in Heroku—for production, staging, and QA for most apps. It's stable, it makes economic sense, and it precisely suits our needs.


5 Answers

Your interface to Heroku is essentially a Git branch. The Heroku gem does some work through their API, but within your Git repository, it's just a new remote branch.

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

Once you set up multiple applications on Heroku, you should be able to configure your Git repository like this:

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

I usually work in a 'working' branch, and use Github for my master.

Assuming that's the case for you, your deploy workflow would probably look something like:

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
like image 193
Luke Bayes Avatar answered Oct 07 '22 03:10

Luke Bayes


This explains everything you need to know if your a newbie like me: http://devcenter.heroku.com/articles/multiple-environments

like image 39
LearningRoR Avatar answered Oct 07 '22 04:10

LearningRoR


A key part of the original question is about linking up the staging app to a subdomain (dev.myapp.com) of the main app (www.myapp.com). This hasn't been addressed in any of the answers.

Step 1: Configure both production ('myapp') and staging ('staging-myapp') versions of your app as is indicated in the answer by Luke Bayes

Step 2: In your domain management system (e.g. GoDaddy):

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

Step 3: Configure Heroku to route dev.myapp.com to staging-myapp:

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

After the CNAME record has had time to propagate, you will be able to run your staging app at dev.myapp.com.

like image 21
Don Leatham Avatar answered Oct 07 '22 03:10

Don Leatham


You should check the heroku_san

It does a pretty good job juggling with environments on heroku.

like image 27
jlfenaux Avatar answered Oct 07 '22 03:10

jlfenaux


Things are easier now. Here's how you do it...

Create an app for each environment

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

This will create named remote repos for each app, which you can see in .git/config.

You can now use either the --app or --remote switches to target a particular app:

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

Set Rails environments

For Rails apps, Heroku defaults to the "production" environment. If you want your staging app to run in a staging environment, create the environment in your project and set the corresponding RAILS_ENV and RAKE_ENV environment variables on the app:

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

Configure environments

If you have other configuration variables you'll need to pass them in for each environment as well.

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

That's a huge pain though so I just use my snappconfig gem and run

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

to load my project's YAML config files into Heroku.

Deploy

Now you just push to Heroku like this:

$ git push staging master
$ git push production master

and migrate like this:

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

(See Managing Multiple Environments for an App | Heroku Dev Center for more info and shortcuts.)

like image 21
Yarin Avatar answered Oct 07 '22 04:10

Yarin