Tag: post-receive
How to use the GitHub post-receive JSON API with Rails
by Lennart on Nov.21, 2008, under Ruby On Rails
GitHub offers you a lot of post-receive notifications. This means that some actions are made whenever you commit something. You can e.g. send notifications via Jabber or IRC – Another option is to call a URL with JSON data. This Rails snippet receives the JSON data and stores relevant information in your database:
class TunerController < ApplicationController
# Basic HTTP authentication.
USER, PASSWORD = "github", "secret"
before_filter :authenticate
# Disable need of authenticity token.
skip_before_filter :verify_authenticity_token
def index
# Include JSON. (gem install json)
require 'json'
# Check if the JSON request is in correct format.
if params[:payload].blank?
# Wrong format. Exit.
render :text => "no payload"
return
end
# Parse the JSON request and store resulting hash.
push = JSON.parse(params[:payload])
# Get the "commits" part.
commits = push["commits"]
# Check if there were commits. Yes, there should be some...
if commits.blank?
# No commits found. Strange - Exit!
render :text => "no commits found"
return
end
# Store the interesting information of the last commit-
last_commit_message = commits.last["message"]
last_commit_timestamp = commits.last["timestamp"]
last_commit_author = commits.last["author"]["name"]
# Create a new object to save in databse.
data = Git_Message.new do |d|
d.last_commit_message = last_commit_message
d.last_commit_timestamp = last_commit_timestamp
d.last_commit_author = last_commit_author
end
# Save our commit data in the database!
if !data.save
# Could not save.
render :text => "could not store in database"
return
end
# Everything went well.
render :text => "done"
end
private
def authenticate
authenticate_or_request_with_http_basic "nothing to see here"
do |id, password|
id == USER && password == PASSWORD
end
end
end
Set the GitHub post-receive URL to something like http://github:secret@example.org/tuner – Where “github” is the user and “secret” the password. You can alternatively just enter the URL and remove the authentication methods from the Rails controller.

