Sinatra app that handles HTTP POSTs from GitHub's post-receive webhook.
Create the file
Add a project to the projects file
path/to/deploy: name: repo-sync-webhook branch: master cmd: rake
rackupcommand to start the app on port
Setup a post receive hook in the Github admin panel
Project definitions are specified in a
The config file should contain a hash of projects. The key of the hash is used as the deploy path. Each project should define the following parameters:
- name - Name of the repository
- branch - Name of the branch to respond to
- token - Token to be matched to incoming requests (optional)
- cmd - Command to run when the post commit hook is received
Each defined project should be specific to a particular repository and branch. When the incoming request matches the defined repository, branch, and token the cmd will be executed.
path/to/deploy: name: repo-sync-webhook branch: master token: secret cmd: rake
The path defined for a project (e.g.
path/to/deploy) stores the currently
processed commit. Each post receive hook creates a new directory
within the deploy path using the id of the received commit.
A symlink (
current) is maintained which always points to the most
recently processed commit.
Projects may specify a token parameter. Incoming requests will be expected to have a token query parameter with a value that matches the value defined in the config file.
If a token is defined for a project the post commit URL should be
When a post receive hook is received this app will do the following:
- Read repository name, branch name, and commit id from payload
- Look for matching projects in the config file
- Clone the repo to a new directory and checkout the commit
- Set the current working directory to this new directory
- Run the project's defined cmd
- On success - update current symlink and remove old version
- On failure - log the failure and destroy the commit directory
- Use mutex per project rather than Sinatra's global mutex
- Package as a gem