Develop Like a Pro With VirtualBox

Here I’m going to demonstrate how to utilize the power of VirtualBox among with Infrastructure Automation Tool like Chef to develop your next Magento powered project in a production ready environment without bloating your personal PC with extra services which you might never need otherwise.

Basically we’re going to mount working tree directory of our web store into VirtualBox instance build with chef-solo and corresponding cookbook.

Project Setup

We’re going to go with a very simple project setup, i.e. just download latest Magento.

wget http://www.magentocommerce.com/downloads/assets/1.7.0.2/magento-1.7.0.2.tar.gz
tar zxf magento-1.7.0.2.tar.gz
cd magento

The above instruction are specific to Linux and OSX, but you can easily find alternatives for others OS’es as well.

What next?

Unfortunately the steps we accomplished in previous section aren’t just enough to run any functional magento store yet, we’re missing a bunch of thing such as webserver, php interpreter with certain extensions, MySQL database and also probably certain configuration steps specific to the system you prefer to develop on must be accomplished.

In order to get up and running you’ve to follow instruction such as Magento Installation Guide or jump to the next section ;)

Introducing magento cookbook

Magento Cookbook - Collection of recipes to build app stack for the Magento deployments with Chef

And here we will take most out of it, we’ll use cookbook to bootstrap Magento stack on local PC for development purposes.

The easiest way to manage cookbooks with in our project is Berkshelf, see the next section.

Introducing Berkshelf

Berkshelf - Manage a Cookbook or an Application’s Cookbook dependencies

Please note, some of the following commands needs be executed with in the project directory, i.e. the magento directory we’ve extracted in the first section.

  1. Install Berkshelf

     gem install berkshelf
    
  2. Install vagrant with bershelf plugin

    For installing vagrant, please follow instruction available on its website: Vagrant Installation Guide

    And then install plugin to make it work with berkshefl:

     vagrant plugin install vagrant-berkshelf
    
  3. Initialize Berkshelf to use within your project

     berks init
    
  4. Declare cookbook dependencies

     echo "cookbook 'magento'" >> Berksfile
    
  5. Pickup cookbook dependencies

     berks install
    

Finally, bootstrap VirtualBox instance with working tree mounted

We will be mounting working tree to the corresponding directory on the VirtualBox instance, so, it can be served by the web-server.

Please note, the Vagrantfile format might differ depend on the Vagrant version, the example below was tested with Vagrant 1.3.5 and might not work with others versions!

So, let’s update Vagrantfile with the following content:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Vagrant.configure("2") do |config|
  config.vm.hostname = "magento-example-berkshelf"
  config.vm.box = "Ubuntu precise 64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  config.vm.network :private_network, ip: "33.33.33.10"
  config.vm.boot_timeout = 120
  config.berkshelf.enabled = true

  config.vm.synced_folder ".", "/var/www/magento",
    mount_options: ['dmode=775', 'fmode=664']

  config.vm.provision :chef_solo do |chef|
    chef.json = {
      :mysql => {
        :bind_address => '127.0.0.1',
        :server_root_password => 'rootpass',
        :server_debian_password => 'debpass',
        :server_repl_password => 'replpass'
      },
      :magento => {
        :url => '', # we already have magento in a working tree
        :db => {
          :password => 'magepass'
        }
      },
      :nginx => {
        :group => 'vagrant' # since directory will be mounted with this group
      },
      "php-fpm" => {
        :pool => {
          :magento => {
            :group => 'vagrant' # since directory will be mounted with this group
          }
        }
      }
    }

    chef.run_list = [
      "recipe[magento::default]"
    ]
  end
end

And then run the following command:

vagrant up

Finally, you can open the browser at http://33.33.33.10 to proceed with normal magento installation.

Conclusion

At this point you’ve virtual instance that fits all magento requirements and can be easily turned on/off with simple commands as needed. See Vagrant website for the further details.

Don’t forget to update Hacking section in your project README file, so, every new developer will be able to get up and running in no time. Or you can go even further, unless you’re running production store on the PaaS, there is a good chance you can reuse the same setup to bootstrap and maintain your production instances.

Comments