-
-
Save javiergloria/d64cb7b088c96e48ee55aa8b1748b161 to your computer and use it in GitHub Desktop.
How to automatically deploy from GitHub
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Deploy your site with git | |
This gist assumes: | |
* you have an online remote repository (github / bitbucket etc.) | |
* you have a local git repo | |
* and a cloud server (Rackspace cloud / Amazon EC2 etc) | |
* your (PHP) scripts are served from /var/www/html/ | |
* your webpages are executed by Apache | |
* the Apache user is named `www-data` (may be `apache` on other systems) | |
* apache's home directory is /var/www/ | |
# 1 - On your local machine | |
*Here we add the deployment script and push it to the origin, the deployment script runs git commands to PULL from the origin thus updating your server* | |
## Grab a deployment script for your site | |
See [deploy.php](#file-deploy-php) | |
## Add, commit and push this to github | |
git add deploy.php | |
git commit -m 'Added the git deployment script' | |
git push -u origin master | |
# 2 - On your server | |
*Here we install and setup git on the server, we also create an SSH key so the server can talk to the origin without using passwords etc* | |
## Install git... | |
After you've installed git, make sure it's a relatively new version - old scripts quickly become problematic as github / bitbucket / whatever will have the latests and greatest, if you don't have a recent version you'll need to figure out how to upgrade it :-) | |
git --version | |
## Setup git (optionally) | |
git config --global user.name "Server" | |
git config --global user.email "[email protected]" | |
## Create an ssh directory for the apache user | |
sudo mkdir /var/www/.ssh | |
sudo chown -R apache:apache /var/www/.ssh/ | |
## Generate a deploy key for apache user | |
sudo -Hu apache ssh-keygen -t rsa # choose "no passphrase" | |
sudo cat /var/www/.ssh/id_rsa.pub | |
# 3 - On your origin (github) | |
*Here we add the SSH key to the origin to allow your server to talk without passwords. In the case of GitHub we also setup a post-receive hook which will automatically call the deploy URL thus triggering a PULL request from the server to the origin* | |
## GitHub instructions | |
### Add the SSH key to your user | |
1. https://github.com/settings/ssh | |
1. Create a new key | |
1. Paste the deploy key you generated on the server | |
### Set up service hook | |
1. https://github.com/oodavid/server.com/admin/hooks | |
1. Select the **Post-Receive URL** service hook | |
1. Enter the URL to your deployment script - http://server.com/deploy.php | |
1. Click **Update Settings** | |
## Bitbucket instructions | |
### Add the SSH key to your account | |
1. https://bitbucket.org/account/ssh-keys/ | |
1. Create a new key | |
1. Paste the deploy key you generated on the server | |
### Set up service hook | |
1. Go to: Repo > Admin > Services | |
1. Select "POST" | |
1. Add the URL to your deployment script - http://server.com/deploy.php | |
1. Save | |
# 4 - On the Server | |
*Here we clone the origin repo into a chmodded /var/www/html folder* | |
## Pull from origin | |
sudo chown -R www-data:www-data /var/www/html | |
sudo -Hu www-data git clone [email protected]:you/server.git /var/www/html | |
# Rejoice! | |
Now you're ready to go :-) | |
## Some notes | |
* Navigate the the deployment script to trigger a pull and see the output: | |
* http://server.com/deploy.php | |
* ***this is useful for debugging too ;-)*** | |
* When you push to GitHub your site will automatically ping the above url (and pull your code) | |
* When you push to Bitbucket you will need to manually ping the above url | |
## Sources | |
* https://gist.github.com/1809044 who in turn referenced | |
* [Build auto-deploy with php and git(hub) on an EC2 Amazon AMI instance](https://gist.github.com/1105010) - who in turn referenced: | |
* [ec2-webapp / INSTALL.md](https://github.com/rsms/ec2-webapp/blob/master/INSTALL.md#readme) | |
* [How to deploy your code from GitHub automatically](http://writing.markchristian.org/how-to-deploy-your-code-from-github-automatic) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Forked from https://gist.github.com/1809044 | |
// Available from https://gist.github.com/nichtich/5290675#file-deploy-php | |
$TITLE = 'Git Deployment Cat'; | |
$VERSION = '1.0'; | |
// the shared secret, used to sign the POST data (using HMAC with SHA1) | |
$secret = 'your secret in githubs web hook'; | |
// receive POST data for signature calculation, don't change! | |
$post_data = file_get_contents('php://input'); | |
$signature = 'sha1=' . hash_hmac('sha1', $post_data, $secret); | |
echo <<<EOT | |
<!DOCTYPE HTML> | |
<html lang="en-US"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>$TITLE</title> | |
</head> | |
<body style="background-color: #000000; color: #FFFFFF; font-weight: bold; padding: 0 10px;"> | |
<pre> | |
o-o $TITLE | |
/\\"/\ v$VERSION | |
(`=*=') | |
^---^`-. | |
EOT; | |
$WH_SIG = $_SERVER['HTTP_X_HUB_SIGNATURE']; | |
if ($WH_SIG != $signature) { | |
header('HTTP/1.1 403 Forbidden'); | |
echo "<span style=\"color: #ff0000\">Sorry, you can't annoy this CAT!!</span>\n"; | |
echo "</pre>\n</body>\n</html>"; | |
exit; | |
} | |
flush(); | |
// Actually run the update | |
$commands = array( | |
'echo $PWD', | |
'whoami', | |
'git pull', | |
'git status', | |
'git submodule sync', | |
'git submodule update', | |
'git submodule status', | |
//'test -e /usr/share/update-notifier/notify-reboot-required && echo "system restart required"', | |
); | |
$output = "\n"; | |
$log = "####### ".date('Y-m-d H:i:s'). " #######\n"; | |
foreach($commands AS $command){ | |
// Run it | |
$tmp = shell_exec("$command 2>&1"); | |
// Output | |
$output .= "<span style=\"color: #6BE234;\">\$</span> <span style=\"color: #729FCF;\">{$command}\n</span>"; | |
$output .= htmlentities(trim($tmp)) . "\n"; | |
$log .= "\$ $command\n".trim($tmp)."\n"; | |
} | |
$log .= "\n"; | |
file_put_contents ('deploy-log.txt',$log,FILE_APPEND); | |
echo $output; | |
?> | |
</pre> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment