Using a git post-receive hook for easy production deploys
I have a git repository on my dev machine, which I use for developing and testing code locally. When I'm ready to deploy to production, I simply push that git repo to the server and use a post-receive hook there to move the code into the proper places. Here's what my setup looks like.
~/.ssh/config has a Host entry called
prod for the production server that specifies where it lives and how to authenticate.
.git/config, I have a remote section for the production server:
[remote "prod"] url = ssh://prod:~/web.git fetch = +refs/heads/*:refs/remotes/origin/*
web.git on the server is set up as a bare repository. In the
hooks folder, I have a
post-receive file like this:
#!/bin/sh # Check out the source tree without .git GIT_WORK_TREE=/home/ubuntu/stage/web git checkout -f # Turn off debug mode, if enabled sed -i -e "/^DEBUG = True$/s/True/False/" /home/ubuntu/stage/web/settings.py # You can do any other configuration here to transform the code # from development to production. # Restart Apache sudo apache2ctl restart
Permissions are set on the
/home/ubuntu/stage/web folder and the
/etc/apache2/sites-enabled/ file points to that folder as the DocumentRoot.
That's all it takes. Now every time I do a
git push prod master on my dev machine, the code is uploaded to the server, properly configured for a production environment, and fed to Apache.