Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A basic webhook for deploying updates to repos on Github to your local server
<?php
/**
* This script is for easily deploying updates to Github repos to your local server. It will automatically git clone or
* git pull in your repo directory every time an update is pushed to your $BRANCH (configured below).
*
* Read more about how to use this script at http://behindcompanies.com/2014/01/a-simple-script-for-deploying-code-with-githubs-webhooks/
*
* INSTRUCTIONS:
* 1. Edit the variables below
* 2. Upload this script to your server somewhere it can be publicly accessed
* 3. Make sure the apache user owns this script (e.g., sudo chown www-data:www-data webhook.php)
* 4. (optional) If the repo already exists on the server, make sure the same apache user from step 3 also owns that
* directory (i.e., sudo chown -R www-data:www-data)
* 5. Go into your Github Repo > Settings > Service Hooks > WebHook URLs and add the public URL
* (e.g., http://example.com/webhook.php)
*
**/
// Set Variables
$LOCAL_ROOT = "/path/to/repo/parent/directory";
$LOCAL_REPO_NAME = "REPO_NAME";
$LOCAL_REPO = "{$LOCAL_ROOT}/{$LOCAL_REPO_NAME}";
$REMOTE_REPO = "git@github.com:username/reponame.git";
$BRANCH = "master";
if ( $_POST['payload'] ) {
// Only respond to POST requests from Github
if( file_exists($LOCAL_REPO) ) {
// If there is already a repo, just run a git pull to grab the latest changes
shell_exec("cd {$LOCAL_REPO} && git pull");
die("done " . mktime());
} else {
// If the repo does not exist, then clone it into the parent directory
shell_exec("cd {$LOCAL_ROOT} && git clone {$REMOTE_REPO}");
die("done " . mktime());
}
}
?>
@brunodbo

This comment has been minimized.

Copy link

brunodbo commented Aug 20, 2014

Thanks for this script! $_POST['payload'] was empty for me though (in fact, the whole $_POST didn't contain anything). The payload seemed to be in $HTTP_RAW_POST_DATA (also see https://github.com/gitlabhq/gitlabhq/issues/660).

@benhosmer

This comment has been minimized.

Copy link

benhosmer commented Jan 22, 2015

It seems that github doesn't deliver the payload index any longer.

I used:

if ($_SERVER['HTTP_X_GITHUB_EVENT'] == 'push') {

Instead of

if ( $_POST['payload'] ) {

Which I got from the headers that github was sending:

Expect: 
User-Agent: GitHub-Hookshot/2e7ffb9
X-GitHub-Delivery: a4dca180-a1b6-11e4-8998-1146c8ddb8a0
X-GitHub-Event: push
@dmitryzuev

This comment has been minimized.

Copy link

dmitryzuev commented Sep 17, 2015

I don't see $BRANCH using anywhere in code.

@gsg-chris

This comment has been minimized.

Copy link

gsg-chris commented Feb 26, 2016

Based on the code, how does the string $branch get used in this script?

@hawkins

This comment has been minimized.

Copy link

hawkins commented Jan 16, 2017

If you want to see examples with $BRANCH used, check out the forks. Some users have made some useful improvements to this script. You can see this script with $BRANCH included on my fork as an example.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.