Vagrant: Better way to work in team

Problems: How to…

  • isolate the development environment?
  • share the development environment?
  • deal with dependency?

Some excuses

  • Works on my machine
  • You must have done something wrong
  • I did a quick fix last time but it broke when we rebooted
  • ……

A possible answer…

Virtualization

Too bloated and hard to use in practice :(

What we want:

$ git clone git://myrepo

$ [some magic command]
$ [or maybe another command]

// now you get an isolated environment to make something big

What vagrant do?

Using virtualization to share the environment, but easy to use!

Benefits

  • Environment per project
  • Versionable
  • Shared across the team
  • No more: "Works on my machine!"

How to use

Create and run a VM

$ vagrant init ubuntu/trusty64
$ vagrant up
$ vim Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.box_url = 'http://box.hosts.com/trusty64.box'
end

Enter the development env

$ vagrant ssh
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-44-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Fri Apr 17 11:27:38 UTC 2015

  System load:  0.44              Processes:           87
  Usage of /:   5.5% of 39.34GB   Users logged in:     0
  Memory usage: 12%               IP address for eth0: 10.0.2.15
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud


Last login: Thu Mar 26 15:02:03 2015 from 10.0.2.2
vagrant@vagrant-ubuntu-trusty-64:~$

Synced folders

$ vagrant up
...

$ vagrant ssh
...

vagrant@precise32:~$ ls /vagrant
Vagrantfile
vagrant@precise32:~$ touch /vagrant/foo
vagrant@precise32:~$ exit

$ ls
foo Vagrantfile

Port Forwarding

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network :forwarded_port, host: 4567, guest: 80
end

Provision

$ vim bootstrap.sh

#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
  rm -rf /var/www
  ln -fs /vagrant /var/www
fi
$ vi Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.provision :shell, path: "bootstrap.sh"
end

Other commands

$ vagrant suspend
// save the current running state of the machine and stop it
// run `vagrant up` to resume

$ vagrant halt
// shutdown and poweroff the vm

$ vagrant destory
// delete the vm from your computer

Provider

  • Virtualbox
  • VMWare
  • Docker
  • KVM
  • Hyper-V
  • AWS

Workflow

$ git clone git://...
$ vagrant up
$ vagrant ssh
(new environment in vm)
$ gulp
// run gulp to auto build your website

Thank you! 😃

Vagrant: Better way to work in team

By Jiajun Wang

Vagrant: Better way to work in team

  • 163