- 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/push
with 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/gems
by 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.