Run Revel Apps on Heroku
UPDATE: There have been some updates to my Revel Heroku Buildpack that make it work better and with newer versions of Revel. Check out the details.
Revel is a Play-like web framework for Go. I’m new to the Go programming language but I’ve heard good things. So I thought I’d take Revel for a spin and get it working on Heroku. Luckily there is already a Go Buildpack and a great article on how to use it.
To get Revel working on Heroku I had to make a few changes to Revel and create a modified buildpack. But it all works! Lets walk through the steps you can follow to deploy Revel apps on Heroku.
First lets get a simple Revel app working locally.
Step 1) Install Go
Step 2) Install Mercurial
Step 3) Install Git
Step 4) Create a new directory that will contain everything:
mkdir ~/go
Step 5) This new “go” directory will be your “GOPATH” so set that environment variable:
export GOPATH=~/go
Step 6) In the newly created “go” directory, get the original Revel source and my changes:
go get github.com/robfig/revel
go get github.com/jamesward/revel
Step 7) Build the “revel” command:
go build -o bin/revel github.com/jamesward/revel/cmd
Step 8) Grab my “hellorevel” sample app:
go get github.com/jamesward/hellorevel
Step 9) Start the local Revel server:
bin/revel run github.com/jamesward/hellorevel
Step 10) In your browser navigate to: http://localhost:9000
You should see a “hello, Revel” message. Lets walk through this simple app so you can get an idea of how it works.
The request you just made is mapped to code through the “conf/routes” file which contains:
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
GET / Application.Index
This tells Revel to handle HTTP GET requests to “/” with the “Application.Index” controller.
The “Application.Index” function is defined in the “app/controllers/app.go” file and contains:
package controllers
import (
"github.com/robfig/revel"
)
type Application struct {
*rev.Controller
}
func (c Application) Index() rev.Result {
message := "hello, Revel"
return c.Render(message)
}
The “Index()” function creates a “message” string of “hello, Revel” and then returns the rendered template which received the “message” as a parameter.
The “app/views/Application/Index.html” template is used to get the HTML for the “Application.Index()” controller and contains:
<h1>
{{.message}}
</h1>
This uses Go templates and uses the “message” parameter.
Feel free to make changes to the template and controller to see how Revel auto-recompiles the source.
Ok, now that you have the application running locally, lets deploy it on Heroku.
Step 1) Signup for a free Heroku account
Step 2) Install the Heroku Toolbelt
Step 3) Login to Heroku from the command line (this should also setup your SSH keys if you haven’t done so already):
heroku login
Step 4) Enter the directory for the “hellorevel” app and create a new application on Heroku which will use the Revel Buildpack:
cd ~/go/src/github.com/jamesward/hellorevel
heroku create --buildpack https://github.com/jamesward/heroku-buildpack-go-revel.git
Step 5) Upload the app to Heroku using Git:
git push heroku master
This will upload the application source, pull in all of the dependencies, and then deploy the application on Heroku. That process will look something like this:
jamesw@T420s:~/go/src/github.com/jamesward/hellorevel$ git push heroku master
Counting objects: 25, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (25/25), 2.46 KiB, done.
Total 25 (delta 2), reused 0 (delta 0)
-----> Heroku receiving push
-----> Fetching custom git buildpack... done
-----> Revel app detected
-----> Installing Go 1.0.3... done
Installing Virtualenv...running virtualenv done
Installing Mercurial... done
-----> Copying src to .go/src/pkg/_app
-----> Getting and building Revel
-----> Discovering process types
Procfile declares types -> (none)
Default types for Revel -> web
-----> Compiled slug size: 31.0MB
-----> Launching... done, v4
http://polar-cove-5542.herokuapp.com deployed to Heroku
To git@heroku.com:polar-cove-5542.git
* [new branch] master -> master
Step 6) Check out your Revel app on the cloud by running:
heroku open
That’s it! Deployment of Revel apps couldn’t be easier! Let me know if you have any questions or feedback on this. Thanks!