Magento CE 18.104.22.168, Git 1.7
There are tons of VCS (What is VCS) tools available these days, but I love to harness the additional power of Git to deploy changes as well as handle version control. With that in mind, I’d like to share a system I use to control site updates/deployment using Git. The CMS of choice today is the ecom beast, Magento. Right, off we go.
We have two sites, mydomain.com and staging.mydomain.com. One is our live production site and the other is our staging (testing) site. They access a separate database each.
The development team (myself included) develop the codebase, including extensions, theme tweaks, etc. on the codebase.
The social, design and marketing teams all work on the Magento site via the admin area. They can install extensions on both servers.
We need our code changes to be pushed to both sites. We also need to capture the media files, extensions and tweaks that are implemented on the live site and pull them to our local codebase for incorporation and deployment to staging.
Halt, an image is needed!
Ok, so here’s how it works.
For each site, there are 2 repos. I will use mydomain.com as an example. One repo sits on the server at /var/www/repos/mydomain.com.git and is a bare repo. There is a post-receive hook in the hooks folder with the following contents:
GIT_WORK_TREE=/var/www/mydomain/ git checkout -f
This is the repo we push to. On a local machine, this would be configured as live.
The second repo sits at the same level as the site (/var/www/mydomain/) and is set up as origin. This is the repo we pull from to local (generally speaking) to obtain changes from the live server.
The staging site mimics the live site except that it is referenced as staging for the bare repo and origin_staging respectively.
So, let’s say we want to pull a code change on the live site and push it to the staging site. We would do as follows:
$ ssh firstname.lastname@example.org
$ cd /var/www/mydomain/
$ git commit -a -m "Massive code change on the live site"
On the local machine:
$ cd /Users/jason/Sites/mydomain/
$ git pull origin master
$ git status
blah blah blah
$ git push staging master
Obviously this test is done with the master branch.
Please comment and enlighten me if you can offer a better solution. In reality, this setup works perfectly and by using the .gitignore files correctly, the repo stays lightning fast and efficient.
Hope it helps you out!