- A post-receive background job is submitted when someone pushes their commits to GitHub
- If the repository the commits belong to has any "Service Hooks" set up, the
job makes a request to http://services-server/service_name/pushwith the following data:- params[:payload]containing all of the commit data (the same data you get using the API)
- params[:data]containing the service data (username, password, room, etc)
 
- Sinatra (github-services.rb) processes the request (tweets your data, says something in campfire, posts it to lighthouse, etc)
- Rinse and repeat
Start by reading the Contributing Guidelines.
- 
Fork the project 
- 
Create a new file in lib/services/ called service_name.rb, using the following template:class Service::ServiceName < Service def receive_push end end 
- 
Vendor any external gems your code relies on, and make sure it is specified in the Gemfile. 
- 
Add documentation to docs/service_name(refer to the others for guidance)
- 
Send a pull request from your fork to github/github-services 
- 
Once it's accepted we'll add any new necessary data fields to the GitHub front-end so people can start using your addition. 
Patches including tests are required
A huge thanks goes out to our many contributors!
- git clone git://github.com/github/github-services.git
- cd github-services
- script/bootstrap
- Bugs in the code should be filed under the Issues tab
- Problems with the service hooks can be filed here
You can test your service in a ruby irb console:
- 
Cache gems and install them to vendor/gemsby doing:script/bootstrap
- 
Start irb: bundle exec irb -r config/load.rb -r lib/services/myservice.rb
- 
Instantiate your Service: svc = Service::MyService.new(:push, # Hash of configuration information. {'token' => 'abc'}, # Hash of payload. {'blah' => 'payload!'}) svc.receive_push 
- 
The third argument is optional if you just want to use the sample payload. svc = Service::MyService.new(:push, # Hash of configuration information. {'token' => 'abc'}) svc.receive_push 
You can also use this one-liner in the shell instead:
bundle exec ruby -r config/load.rb -r lib/services/myservice.rb -e \
  "Service::MyService.new(:push, {'foo' => 'bar'}).receive_push"You can also test your hook with the Sinatra web service:
- Start the github-services Sinatra server with ruby github-services.rb. By default, it runs on port 8080.
- Edit the docs/github_payload file as necessary to test your service. (Usually just editing the "data" values but leaving the "payload" alone.)
- Send the docs/github_payload file to your service by calling:
./script/deliver_payload [service-name]
The default hook for a service is push. You may wish to have services respond
to other event types, like pull_request or issues. The full list may be
found in service.rb.
Unless your service specifies default_events <list_of_types>, only the push
hook will be called, see
service.rb#default_events.
To make use of these additional types, your service will either need to define
receive_<type> (like receive_pull_request_review_comment) or a generic
receive_event.
You can read more about the Hooks in the API Documentation.