When you join a new company, to start to contribute to the code base, you will need
to set up a development environment on your local machine. Most of the time,
the team will give you the bootstrap script to do that. But sometimes, that
magical script does not exist, and that is the time you know you should introduce
the team your bootstrap script. In this article, I shared what I learned
while building a script by using Vagrant.
Vagrant
Vagrant is a ruby-based tool to manage virtual machines. Vagrant using Virtual-box underlying.
This tool helps create many virtual machines easily. If you want to read more about vagrant, you should go to vagrant home page.
To install vagrant in Mac OSX, firstly you need to install RUBY.
I recommend you should using rvm when using ruby.
To install rvm, you need gcc which already is installed when we install Xcode.
In this case, I use Xcode 4.3.3 from Apple Store.
But after getting Xcode, I did not find out gcc. To fixed it, open Xcode 4.3.3,
go to Preferences -> Downloads -> Choose install “Commandline tool for Xcode”.
After it finishs, you got your magical GCC :-).
Next step is install rvm.
$> curl -L https://get.rvm.io | bash -s stable --ruby
$> source ~/.rvm/scripts/rvm
$> rvm install 1.9.3
$> gem install vagrantCool!!! Next we setup vagrant.
Vagrant use boxes to create VM. Boxes can download from http://vagrantbox.es.
$> vagrant box add debian-squeeze-32 http://mathie-vagrant-boxes.s3.amazonaws.com/debian_squeeze_32.boxVagrant divides virtual machines to many projects. Each project can contain many machines. Each project is a store in a configuration file Vagrantfile:
$> mkdir debian
$> cd debian
$> vagrant initA Vagrantfile has been placed in this directory. You are now
ready to vagrant up your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
vagrantup.com for more information on using Vagrant.
Now change Vagrantfile to set up our new virtual machine.
Vagrant::Config.run do |config|
# using debian as virtual environment to build
config.vm.box = 'debian'
# Share an additional folder to the guest VM. The first argument is
# an identifier, the second is the path on the guest to mount the
# folder, and the third is the path on the host to the actual folder.
config.vm.share_folder "srv", "/srv", "/Users/knt/srv"
# Forward guest port 80 to host port 4567
# forward_port is a method which takes two arguments:
# + guest port - The port on the virtual machine.
# + host port - The port on your local machine you want
# to use to access the guest port.
config.vm.forward_port 80, 4567
# Config virtual machine memory
config.vm.customize ["modifyvm", :id, "--memory", 512]
endAfter modifying Vagrantfile, it is time to create our first virtual environment.
NOTE: More details about Vagrantfile configuration, please take a look at
vagrant document.
$> vagrant up
[default] Importing base box 'debian'...
[default] The guest additions on this VM do not match the install version of
VirtualBox! This may cause things such as forwarded ports, shared
folders, and more to not work properly. If any of those things fail on
this machine, please update the guest additions and repackage the
box.
Guest Additions Version: 4.0.4
VirtualBox Version: 4.1.16
[default] Matching MAC address for NAT networking...
[default] Clearing any previously set forwarded ports...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] -- 80 => 4567 (adapter 1)
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Mounting shared folders...
[default] -- srv: /srv
[default] -- v-root: /vagrantFinally, we have our debian machine. Let ssh to it
$> vagrant ssh
Linux vagrant-debian-squeeze 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Feb 24 07:02:08 2011 from 10.0.2.2
vagrant@vagrant-debian-squeeze:~$Cool !!!. Let ’s config it to code
Config virtual machine
Set up utility tools
Firstly, vagrant let us ssh to VM without a password. To make our own password on VM, we change ‘root’ and ‘vagrant’ user password
$> sudo passwd # change root password
$> sudo passwd vagrant # chang vagrant passwordNext, install my must have editor “vim”.
$> sudo apt-get install vimChange the hostname
Honestly, I do not like the name “vagrant-debian-squeeze”. It ’s too long to remember. I just want to change it “debian” “vagrant-debian-squeeze” is “hostname” of VM. To change it in debian, we using bellow command:
$> vim /etc/hostname
# Change to hostname to "debian"
$> vim /etc/hosts
# Add new line
127.0.0.1 debian
# we add this line to solve issue "unable to resolve hostname"
# Make it active in next login session
$> /etc/init.d/hostname.sh startAdd source.list
Change file /etc/apt/source.list as below
deb http://virror.hanoilug.org/debian/archive squeeze main contrib #non-free
deb http://virror.hanoilug.org/debian/archive squeeze-updates main #non-free contrib
deb http://virror.hanoilug.org/debian/security squeeze/updates main #non-free contrib
deb http://virror.hanoilug.org/debian/backports squeeze-backports main #non-free contrib
deb http://mirror.bytemark.co.uk/debian/ squeeze main
deb-src http://mirror.bytemark.co.uk/debian/ squeeze main
deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main
deb http://mirror.bytemark.co.uk/debian/ squeeze-updates main
deb-src http://mirror.bytemark.co.uk/debian/ squeeze-updates main
deb http://ftp.us.debian.org/debian testing mainUpdate source.list (NOTE: I logged in as root to reduce typing :P).
$> apt-get updateInstall necessary tools
Install gcc and python.
$> apt-get install gcc
$> apt-get install python2.7 python-psutil python-psycopg2 python-pylibmc python-setproctitle
## install pip tool
$> apt-get install python-pip
## update pip
$> pip install update
$> pip install -r requirements.txtInstall udpatedb and locate tool
$> apt-get install locateInstall svn and git
$> apt-get install subversion gitResolve locate
Edit /etc/locale.gen
$> echo en_US.UTF-8 UTF-8 > /etc/locale.gen
$> echo en_ES.UTF-8 UTF-8 >> /etc/locale.gen
$> echo en_GB.UTF-8 UTF-8 >> /etc/locale.gen
$> locale-genInstall python PostgreSQL
I got this error when install psycopg2
Error: pg_config executable not found.
Please add the directory containing pg_config to the PATH
or specify the full executable path with the option:
python setup.py build_ext --pg-config /path/to/pg_config build ...
or with the pg_config option in 'setup.cfg'.
----------------------------------------
Command python setup.py egg_info failed with error code 1 in /srv/svn/build/psycopg2To pass it, i use solutions from stackoverflow
$> apt-get install libpq-dev python-dev
#Reinstall requirements.txt agains, and it works
$> pip install -r requirements.txtInstall PostgreSQL database
First, install postgresql and postgis
$> apt-get install postgresql
$> apt-get install postgresql-9.1-postgis postgresql-contribNow, let config our PostgreSQL. PostgreSQL 9.1 was locate at /usr/lib/postgres/9.1. Logout from “root” user, and login “vagrant”, we should add postgres path to our system by change ~/.bashrc file
$> echo export PATH=/usr/lib/postgresql/9.1/bin:\$PATH >> ~/.bashrc
$> source ~/.bashrc
# check whether path is active by test command createdb
$> createdb
createdb: could not connect to database postgres: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432OK, postgres path is working. Now we write some script to control postgres easily. NOTE that, to run postgres, you shouldn’t run it by ‘root’ user. In my case, i run it with ‘vagrant’ user.
Write the ‘pg’ script to control postgres
$> mkdir -p /home/vagrant/postgres/database
$> mkdir -p /home/vagrant/postgres/log
$> initdb /home/vagrant/postgres/database
$> sudo chown vagrant /var/run/postgresql
$> vim pg
#!/usr/bin/env sh
PROGRAM=pg
PGCTL=/usr/lib/postgresql/9.1/bin/pg_ctl
DATAPATH=/home/vagrant/postgres/database
LOGFILE=/home/vagrant/postgres/log/postgres.9.1.log
case $1 in
start)
$PGCTL -D $DATAPATH start 2>&1 > $LOGFILE
;;
stop)
$PGCTL stop
;;
restart)
$PGCTL stop
echo "Starting postgres server ..."
$PGCTL -D $DATAPATH start 2>&1 > $LOGFILE
;;
*)
echo "USAGE $PROGRAM {start|stop|restart}"
;;
esac
$> chmod +x pg
$> sudo mv pg /etc/init.d
$> pg start
$> createdb checkin_devNow, backup database from data.sql and schema.sql files in /srv/config/db.
$> psql checkin_dev < schema.sql
$> psql checkin_dev < data.sqlOr more convention, we should write a script to do all backup database.
#!/usr/bin/env sh
dropdb checkin_dev
createdb checkin_dev
pgsql checkin_dev < schema.sql
pgsql checkin_dev < data.sqlThat ’s all for tonight!