Warning: this entry is very much a matter of 'This isn't the right way to do it, but it works for me'.
For small projects that are in active development, I frequently have to deploy code changes to the live server. To make this as simple as possible for me, so I can concentrate on the coding, I tend to like running on a live checkout of the code directly from the repo.
I never really got this automated properly with svn, although no doubt it's a simple matter of setting up the right post-commit hooks. However, now I'm working mainly in git, and I thought it would be good if I could push straight from my local repo to the remote one, and automatically see the production code update.
It's fairly easy to set up a remote repository to push to - I followed the instructions here, which worked a treat. However, this wasn't helping with getting this code to auto-checkout and deploy itself. So I began experimenting, and what I came up with was this.
Firstly, instead of setting up a bare repo as recommended in those instructions, use a standard
git init for your remote. If you now try and push to this, git will complain with a long message explaining that "Updating the currently checked out branch may cause confusion". It gives some tips about how to turn off that message, but we can avoid it altogether by using branches.
On the server, simply create and check out a
git branch live git checkout live
Now, we just need a hook that pulls from master to live every time we commit to master. The hook we need is called
post-receive, and like all hooks it lives in
.git/hooks. Here's mine:
#!/bin/sh read params cd .. echo "ASSET_VERSION = '`echo $params|cut -d " " -f2`'" > local_settings.py env -i ~/bin/git reset --hard env -i ~/bin/git pull exec ~/webapps/mysite/apache2/bin/restart
The two git commands simply ensure that the live branch has no local changes, and pulls all changes direct from master - which in turn of course has been updated directly from my development machine.
local_settings.py file which defines a value which is appended to the querystring of all my asset urls. The hook updates this automatically - it is passed the hash of the current commit, so it reads the parameters (which is far more difficult in bash than it needs to be, by the way), extracts the hash, and writes it to
The final step is to restart Apache, and we're laughing.
Now, no doubt there are much better ways of doing this. But like I say, it works for me.